Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SQL đưa ra lỗi cú pháp, nhưng tôi không thấy lỗi

PHP Mysqli cho phép nhiều truy vấn với hàm multi_query () .

Sau đây là để thêm vào cuộc trò chuyện nói chung và tránh đau buồn vì Không đồng bộ hóa vô tận lỗi khi các khối nhiều truy vấn được chạy chồng lên nhau. Hoặc một số không sau một nhiều.

Sự cố bắt đầu sau khi thực thi multi_query() nếu một thì chuyển sang truy vấn tiếp theo mà không xóa tập hợp kết quả. Lỗi sẽ là lỗi được ký hiệu là Note1 ở dưới cùng. Nhưng nó được tránh trong Câu trả lời này.

Vấn đề cụ thể của bạn không liên quan gì đến \r\n hoặc \n\r . Họ đã được kiểm tra như một phần của nỗ lực này, nhưng không để người tiếp theo nhầm lẫn với vấn đề của họ, khác.

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

Kết quả cơ sở dữ liệu:

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

Các thông báo lỗi sau được đề cập trong mã nguồn được hiển thị. Người đầu tiên hoàn toàn tránh được. Cái thứ hai thì không, và ở đó để cho thấy rằng hàm multi_query() , trái ngược với query() , là bắt buộc.

****** Ghi chú 1 ******

****** Ghi chú 2 ******



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách so sánh chỉ ngày và năm trong php codeigniter

  2. SQLAlchemy và UnicodeDecodeError

  3. Cách hợp nhất hai cột trong sql và hiển thị nó thành một bản ghi riêng biệt

  4. Chuyển đổi tệp từ Cp1252 sang utf -8 java

  5. Thay thế cho FIND_IN_SET trong SQLite?