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

Tại sao mysqli đưa ra lỗi Lệnh không đồng bộ?

Máy khách MySQL không cho phép bạn thực thi một truy vấn mới trong đó vẫn còn các hàng cần tìm nạp từ một truy vấn đang tiến hành. Xem Lệnh không đồng bộ trong tài liệu MySQL về các lỗi phổ biến.

Bạn có thể sử dụng mysqli_store_result () để tìm nạp trước tất cả các hàng từ truy vấn bên ngoài. Điều đó sẽ đệm chúng trong máy khách MySQL, vì vậy từ quan điểm của máy chủ, ứng dụng của bạn đã tìm nạp toàn bộ tập kết quả. Sau đó, bạn có thể thực thi nhiều truy vấn hơn ngay cả trong một vòng lặp tìm nạp các hàng từ tập kết quả bên ngoài hiện đã được lưu vào bộ đệm.

Hoặc bạn mysqli_result ::fetch_all () trả về tập hợp kết quả đầy đủ dưới dạng một mảng PHP và sau đó bạn có thể lặp qua mảng đó.

Việc gọi các thủ tục được lưu trữ là một trường hợp đặc biệt, bởi vì một thủ tục được lưu trữ có khả năng trả về nhiều tập kết quả, mỗi tập có thể có tập các hàng riêng. Đó là lý do tại sao câu trả lời từ @ a1ex07 đề cập đến việc sử dụng mysqli_multi_query () và lặp lại cho đến khi mysqli_next_result () không có bộ kết quả nào nữa. Điều này là cần thiết để đáp ứng giao thức MySQL, ngay cả khi trong trường hợp của bạn, thủ tục được lưu trữ của bạn có một tập kết quả duy nhất.

Tái bút:Nhân tiện, tôi thấy bạn đang thực hiện các truy vấn lồng nhau bởi vì bạn có dữ liệu đại diện cho một hệ thống phân cấp. Bạn có thể muốn xem xét việc lưu trữ dữ liệu theo cách khác, để bạn có thể truy vấn nó dễ dàng hơn. Tôi đã trình bày về điều này có tiêu đề Mô hình cho Dữ liệu phân cấp với SQL và PHP . Tôi cũng đề cập đến chủ đề này trong một chương của cuốn sách SQL Antipatterns:Tránh cạm bẫy của cơ sở dữ liệu Lập trình .

Đây là cách triển khai mysqli_next_result () trong CodeIgnitor 3.0.3:

Trên dòng 262 của system / database / drivers / mysqli / mysqli_driver.php thay đổi

protected function _execute($sql)
{
    return $this->conn_id->query($this->_prep_query($sql));
}

tới cái này

protected function _execute($sql)
{
    $results = $this->conn_id->query($this->_prep_query($sql));
    @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error
    return $results;
}

Đây là một vấn đề kể từ 2.x. Tôi vừa cập nhật lên 3.x và phải sao chép bản hack này sang phiên bản mới.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chuyển đổi tất cả các bảng từ MyISAM thành InnoDB?

  2. SQL:Thứ tự mặc định của các truy vấn là gì?

  3. Mysql:Chọn tất cả dữ liệu giữa hai ngày

  4. Tạo và sử dụng thủ tục lưu trữ trong MySQL - Hướng dẫn

  5. MySQL - Lấy số hàng khi chọn