sql >> Base de Datos >  >> RDS >> Mysql

SQL da un error de sintaxis, pero no veo uno

PHP Mysqli permite múltiples consultas con la función multi_query() .

Lo siguiente es para agregar a la conversación en términos generales y evitar el dolor de interminables fuera de sincronización errores cuando los bloques de consultas múltiples se ejecutan uno encima del otro. O un no-multi después de un multi.

El problema comienza después de la ejecución de multi_query() si uno continúa con la siguiente consulta sin borrar el conjunto de resultados. El error sería el indicado como Nota1 en la parte inferior. Pero se evita en esta Respuesta.

Su problema particular no tiene nada que ver con \r\n o \n\r . Se probaron como parte de este esfuerzo, pero se excluyeron para no confundir a la próxima persona con su problema, diferente.

<?php
    //mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    mysqli_report(MYSQLI_REPORT_ALL);
    error_reporting(E_ALL); // report all PHP errors
    ini_set("display_errors", 1); 
    echo "start<br/>";

    try {
        $mysqli= new mysqli('hostname', 'dbuser', 'pwd', 'dbname');
        if ($mysqli->connect_error) {
            die('Connect Error (' . $mysqli->connect_errno . ') '
                . $mysqli->connect_error);
        }
        echo "I am connected and feel happy.<br/>";
        $query = "INSERT INTO `table1`(`thing`) values ('aaa')";
        $mysqli->query($query);
        // works fine

        // Note the concat below
        $query = "INSERT INTO `table1`(`thing`) values ('bbb1'); ";
        $query .=$query; // double it up with concat (in other words two insert)
        // we have a multi query so call it the right way:
        $mysqli->multi_query($query);
        // we need to clear the protocol to avoid Out of Sync errors
        // http://stackoverflow.com/a/21754463
        do { 
            $mysqli->use_result(); 
        }while( $mysqli->more_results() && $mysqli->next_result() );        
        // if you remark out the above 3 lines, 
        // expect error message depicted in **** Note1 ****

        // purpose of this next block is to show result sets are cleared
        // from prior multi, and we can do another insert
        // thus avoiding error 500 out of sync errors
        $query = "INSERT INTO `table1`(`thing`) values ('ccc')";
        $mysqli->query($query);   // a single insert statement

        // Finally, this shows that running a multi without a multi_query fcn call will bomb
        $query = "INSERT INTO `table1`(`thing`) values ('explosion'); \r\n";
        $query .=$query; // double it up with concat
        $mysqli->query($query);   // make a multi query explode by not calling multi_query (but rather query)
        //  The above line generated an error, error message below (**** Note2 ****)
        $mysqli->close();
    } catch (mysqli_sql_exception $e) { 
        throw $e; 
    }
?>

Resultados de la base de datos:

select * from table1;
+----+-------+
| id | thing |
+----+-------+
|  1 | aaa   |
|  2 | bbb1  |
|  3 | bbb1  |
|  4 | ccc   |
+----+-------+

Los siguientes mensajes de error se mencionan en el código fuente que se muestra. El primero se evita por completo. El segundo no lo es, y ahí para mostrar que la función multi_query() , a diferencia de query() , es obligatorio.

****** Nota 1 ******

****** Nota 2 ******