Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL daje błąd składni, ale go nie widzę

PHP Mysqli pozwala na wiele zapytań z funkcją multi_query() .

Poniżej przedstawiono ogólne uzupełnienie rozmowy i uniknięcie żalu z powodu niekończącego się braku synchronizacji błędy, gdy bloki wielu zapytań są uruchamiane jeden na drugim. Lub nie-multi po multi.

Kłopoty zaczynają się po wykonaniu multi_query() jeśli jeden następnie przechodzi do następnego zapytania bez czyszczenia zestawu wyników. Błędem będzie ten oznaczony jako Note1 na dole. Ale unika się tego w tej odpowiedzi.

Twój konkretny problem nie miał nic wspólnego z \r\n lub \n\r . Zostali przetestowani w ramach tego wysiłku, ale pominięto je, aby nie pomylić następnej osoby, która przychodzi z ich problemem, inaczej.

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

Wyniki bazy danych:

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

W pokazanym kodzie źródłowym wymieniono następujące komunikaty o błędach. Pierwszy jest całkowicie pominięty. Drugi nie jest, a tam, aby pokazać, że funkcja multi_query() , w przeciwieństwie do query() , jest wymagane.

****** Uwaga1 ******

****** Uwaga2 ******



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zrobić generator wierszy w MySQL?

  2. MySQL vs. SQL Server vs. Oracle

  3. MYSQL Zrzuć tylko niektóre wiersze

  4. SQL - Wybierz 'n' największych elementów w grupie

  5. wstawiaj dane do MYSQL za pomocą tablicy PHP