sql >> Database >  >> RDS >> Mysql

SQL geeft een syntaxisfout, maar ik zie er geen

PHP Mysqli staat meerdere zoekopdrachten toe met de multi_query() functie .

Het volgende is om in algemene termen aan het gesprek toe te voegen en verdriet te voorkomen door eindeloos Niet synchroon fouten wanneer blokken van meerdere query's op elkaar worden uitgevoerd. Of een non-multi na een multi.

Het probleem begint na de uitvoering van multi_query() als men dan doorgaat naar de volgende query zonder de resultatenset te wissen. De fout zou degene zijn die onderaan wordt aangeduid als Note1. Maar het wordt vermeden in dit antwoord.

Uw specifieke probleem had niets te maken met \r\n of \n\r . Ze werden getest als onderdeel van deze inspanning, maar werden weggelaten om de volgende persoon die binnenkomt niet te verwarren met hun probleem, anders.

<?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; 
    }
?>

Databaseresultaten:

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

De volgende foutmeldingen worden vermeld in de getoonde broncode. De eerste wordt volledig vermeden. De tweede niet, en om aan te tonen dat de functie multi_query() , in tegenstelling tot query() , is vereist.

****** Opmerking1 ******

****** Opmerking2 ******



  1. MySQL VOLLEDIG AANMELDEN?

  2. Polymorfisme in SQL-databasetabellen?

  3. MySQL Workbench toegang verkrijgen voor administratie?

  4. CodeIgniter en Oracle-database - ActiveRecord insert() voegt dubbele aanhalingstekens toe in query