Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQL memberikan kesalahan sintaks, namun saya tidak melihatnya

PHP Mysqli mengizinkan beberapa kueri dengan fungsi multi_query() .

Berikut ini adalah untuk menambahkan percakapan secara umum, dan menghindari kesedihan dari Tidak Sinkron yang tak ada habisnya kesalahan ketika blok multi kueri dijalankan di atas satu sama lain. Atau non-multi setelah multi.

Masalah dimulai setelah eksekusi multi_query() jika salah satu kemudian melanjutkan ke kueri berikutnya tanpa menghapus kumpulan hasil. Kesalahannya adalah yang dilambangkan sebagai Note1 di bagian bawah. Tapi itu dihindari dalam Jawaban ini.

Masalah khusus Anda tidak ada hubungannya dengan \r\n atau \n\r . Mereka diuji sebagai bagian dari upaya ini, tetapi dibiarkan agar tidak membingungkan orang berikutnya yang datang dengan masalah mereka, berbeda.

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

Hasil basis data:

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

Pesan kesalahan berikut disebutkan dalam kode sumber yang ditampilkan. Yang pertama benar-benar dihindari. Yang kedua tidak, dan di sana untuk menunjukkan bahwa fungsi multi_query() , sebagai lawan dari query() , diperlukan.

****** Catatan1 ******

****** Catatan2 ******



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Injeksi SQL di Java dan MySQL saat menggunakan banyak kueri

  2. CodeIgniter/PHP/MySQL:Mengambil data dengan JOIN

  3. Tambahkan gabungan dalam ke pernyataan mySQL GROUP_CONCAT

  4. Cara timeout kueri mysql++ di c++

  5. pilih 10 baris per hari dengan pesanan