2013-02-05 8 views
5

Ho provato a utilizzare multi_query ma continuo a ricevere un severo messaggio standard.Standard rigorosi: errore mysqli_next_result() con mysqli_multi_query

$querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')"; 

if (mysqli_multi_query($db, $querystring)) { 
    do { 
     if ($result = mysqli_store_result($db)) { 
      // 
     } 
    } while (mysqli_next_result($db)); 
} 
echo "end"; 

Il messaggio di errore che ottengo è:

severe norme di: mysqli_next_result(): Non v'è alcun prossimo set di risultati. Si prega di chiamare mysqli_more_results()/mysqli :: more_results() per verificare se chiamare questa funzione/metodo di

Ho provato ad aggiungere e rimuovere -;, ma non ha avuto fortuna.

+2

"Ho provato ad aggiungere e rimuovere" hai anche cercato di ... hhmmmm. idunno aggiungendo un assegno per 'mysqli :: more_results()'? – PeeHaa

+0

Questo è praticamente un avvertimento inutile. Fondamentalmente ti chiede di scrivere un codice più brutto. Qual è la ragione di questo avvertimento? – Calmarius

risposta

19

Mentre pipodesign ha corretto l'errore all'interno di $ querystring e alleviato il problema, la soluzione effettiva non è stata fornita per quanto riguarda l'errore Strict Standards.

Non sono d'accordo con il parere di SirBT, non è necessario passare da DO WHILE a WHILE.

Il messaggio di Strict Standard che ricevi è piuttosto informativo. Obbedire, utilizzare questo:

do{} while(mysqli_more_results($db) && mysqli_next_result($db)); 

Poi, non è necessario per voi a scrivere un uscita condizionato o rompere all'interno del ciclo perché la condizione mentre si romperà il ciclo sulla prima occorrenza di un errore. * nota, l'istruzione if prima del do-while negherà l'accesso al ciclo se la prima query ha un errore.

Nel tuo esempio, stai solo eseguendo query INSERT, quindi non riceverai alcun set di risultati da elaborare. Se vuoi contare quante righe hai aggiunto, usa mysqli_affected_rows().

come una soluzione completa per la tua domanda:

if(mysqli_multi_query($db,$querystring)){ 
    do{ 
     $cumulative_rows+=mysqli_affected_rows($db); 
    } while(mysqli_more_results($db) && mysqli_next_result($db)); 
} 
if($error_mess=mysqli_error($db)){echo "Error: $error_mess";} 
echo "Cumulative Affected Rows: $cumulative_rows"; 

uscita:

// if no errors 
Cumulative Affected Rows: 2 

// if error on second query 
Error: [something] 
Cumulative Affected Rows: 1 

// if error on first query 
Error: [something] 
Cumulative Affected Rows: 0 

EDIT IN RITARDO:

Dal momento che le persone nuove da mysqli sono imbattersi in questa P ost, offrirò uno snippet generale ma robusto per gestire le query con/senza set di risultati usando multi_query() e aggiungere una funzionalità per mostrare quale query nell'array viene gestita ...

Classic "IF() {DO {}} WHILE" Sintassi:

if(mysqli_multi_query($mysqli,implode(';',$queries))){ 
    do{ 
     echo "<br><br>",key($queries),": ",current($queries); // display key:value @ pointer 
     if($result=mysqli_store_result($mysqli)){ // if a result set 
      while($rows=mysqli_fetch_assoc($result)){ 
       echo "<br>Col = {$rows["Col"]}"; 
      } 
      mysqli_free_result($result); 
     } 
     echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs 
    } while(next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); 
} 
if($mysqli_error=mysqli_error($mysqli)){ 
    echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value 
} 
//if you want to use the snippet again... 
$mysqli_error=null; // clear variables 
reset($queries); // reset pointer 

Reinvented Wheel "mentre {}" Sintassi (... per chi non come post-test loop):

while((isset($multi_query) && (next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli))) || (!isset($multi_query) && $multi_query=mysqli_multi_query($mysqli,implode(';',$queries)))){ 
    echo "<br><br>",key($queries),": ",current($queries); // display array pointer key:value 
    if($result=mysqli_store_result($mysqli)){ 
     while($rows=mysqli_fetch_assoc($result)){ 
      echo "<br>Col = {$rows["Col"]}"; 
     } 
     mysqli_free_result($result); 
    } 
    echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs 
} 
if($mysqli_error=mysqli_error($mysqli)){ 
    echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value 
} 
//if you want to use the snippet again... 
$multi_query=$mysqli_error=null; // clear variables 
reset($queries); // reset pointer 

Quindi, o frammento dato le seguenti query offrirà la stessa uscita:

serie di query:

$queries[]="SELECT * FROM `TEST`"; 
$queries[]="INSERT INTO `TEST` (Col) VALUES ('string1'),('string2')"; 
$queries[]="SELECT * FROM `TEST`"; 
$queries[]="DELETE FROM `TEST` WHERE Col LIKE 'string%'"; 

uscita:

0: SELECT * FROM `TEST` 
Rows = 0 

1: INSERT INTO `TEST` (Col) VALUES ('string1'),('string2') 
Rows = 2 

2: SELECT * FROM `TEST` 
Col = string1 
Col = string2 
Rows = 2 

3: DELETE FROM `TEST` WHERE Col LIKE 'string%' 
Rows = 2 

modificare la mia frammenti secondo i vostri bisogni. Lascia un commento se scopri un bug.

1

Il motivo per cui si ottiene questo avviso, è semplicemente perché si utilizza un ... while ciclo do che valuta la condizione dopo l'esecuzione del blocco di comando. Quindi, quando non ci sono più risultati, il contenuto del ciclo viene eseguito un'altra volta, producendo tale avviso.

Utilizzare un ciclo while ($mysql->next_result()) ... do per risolvere questo problema. (Come nota generale: l'uso di loop post-test come quello che hai fatto è abbastanza raro nella programmazione di database)

Se il codice è poesia, sto cercando di essere Shakespeare!

0

(risposta pubblicata a nome OP).

risolto:

$querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')"; 

if (mysqli_multi_query($db, $querystring)) { 
do { 
    if (!mysqli_more_results($db)) { 
    exit(); 
    } 
} while (mysqli_next_result($db)); 
} 
echo "end"; 
Problemi correlati