Estándares estrictos: error mysqli_next_result() con mysqli_multi_query

Resuelto Phil asked hace 54 años • 3 respuestas

Intenté usar multi_query pero sigo apareciendo un mensaje de Estándares estrictos.

$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 siguiente conjunto de resultados. Por favor, llame a mysqli_more_results()/mysqli::more_results() para verificar si desea llamar a esta función/método

Intenté agregar y eliminar -;pero no tuve suerte.

Phil avatar Jan 01 '70 08:01 Phil
Aceptado

Si bien pipodesign corrigió el error dentro de $querystring y alivió el problema, no se proporcionó la solución real con respecto al error de Estándares estrictos.

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

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 es necesario que escriba una salida condicional o una interrupción dentro del bucle porque la condición while interrumpirá el bucle en la primera aparición de un error. *tenga en cuenta que la instrucción if antes de do- while negará la entrada al bucle si la primera consulta tiene un error.

En su ejemplo, solo está ejecutando 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 solución completa a 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";

Producción:

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

EDICIÓN TARDE:

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

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

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

Sintaxis reinventada de la rueda "WHILE{}" (... para aquellos a quienes no les gustan los bucles 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, cualquiera de los fragmentos con 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%'";

Producción:

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.

mickmackusa avatar Mar 18 '2014 03:03 mickmackusa

La razón por la que recibe esta advertencia es simplemente porque utiliza un bucle do... whileque evalúa la condición después de ejecutar el bloque de comando. Entonces, cuando no hay más resultados, el contenido del bucle se ejecuta una vez más, generando esa advertencia.

Usar un bucle while ($mysql->next_result())... dodebería solucionar este problema. (En una nota general: usar bucles posteriores a la prueba como lo hizo usted es bastante poco común en la programación de bases de datos)

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

SirBT avatar Sep 24 '2013 15:09 SirBT