query queries multiple clase php mysqli standards strict mysqli-multi-query

php - queries - Estándares estrictos: mysqli_next_result() error con mysqli_multi_query



php mysqli execute query (3)

He intentado usar multi_query, pero sigo recibiendo un estricto mensaje de estándares apareciendo.

$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";

El mensaje de error que recibo es:

Estándares estrictos : mysqli_next_result (): no hay un próximo conjunto de resultados. Por favor, llame a mysqli_more_results () / mysqli :: more_results () para verificar si se llama a esta función / método

He intentado agregar y eliminar -; pero no tuvo suerte.


Mientras que pipodesign corrigió el error dentro de $ querystring y aliviaba el problema, no se proporcionó la solución real con respecto al error Strict Standards.

No estoy de acuerdo con el consejo de SirBT, el cambio de DO WHILE a WHILE no es necesario.

El mensaje de Normas estrictas que recibe es bastante informativo. Para obedecer, usa esto:

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

Entonces, no hay necesidad de que escriba una salida o ruptura condicional dentro del ciclo porque la condición while interrumpirá el ciclo en la primera ocurrencia de un error. * note, la instrucción if antes del do-while denegará la entrada al ciclo si la primera consulta tiene un error.

En su ejemplo, solo ejecuta consultas INSERT, por lo que no recibirá ningún conjunto de resultados para procesar. Si desea contar cuántas filas ha agregado, use mysqli_affected_rows ().

Como una solución completa para su pregunta:

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";

Salida:

// 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

EDICION TARDE:

Dado que las personas nuevas en mysqli están tropezando con esta publicación, ofreceré un fragmento general pero robusto para manejar las consultas con / sin conjuntos de resultados usando multi_query () y agregar una función para mostrar qué consulta de la matriz se está manejando ...

Sintaxis clásica "IF () {DO {} WHILE}" :

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

Rueda reinventada "WHILE {}" Sintaxis (... para aquellos a los que no les gustan los loops posteriores a la prueba):

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

Por lo tanto, cualquier fragmento dado a las siguientes consultas ofrecerá el mismo resultado:

Matriz de consulta:

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

Salida:

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

Modifique mis fragmentos según sus necesidades. Deja un comentario si descubres un error.


El motivo por el que recibe esta advertencia es simplemente porque utiliza un bucle do ... while que evalúa la condición después de ejecutar el bloque de comandos. Entonces, cuando ya no hay más resultados, el contenido del ciclo se ejecuta una vez más, produciendo esa advertencia.

Usando un while ($mysql->next_result()) ... do loop debería arreglar esto. (En una nota general: el uso de loops posteriores a la prueba como lo hizo es bastante raro en la programación de bases de datos)

Si el código es poesía, ¡estoy tratando de ser Shakespeare!


(Respuesta publicada en nombre de OP) .

Resuelto

$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";