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