Đây không phải là hạn chế của PDO, mà là hạn chế của thư viện máy khách MySQL. MySQL chỉ hỗ trợ một truy vấn đang thực hiện tại một thời điểm. Bạn không thể thực hiện một truy vấn khác trong khi truy vấn đầu tiên vẫn có con trỏ đang mở (tức là nó vẫn có kết quả để trả về).
Bạn có các tùy chọn sau:
-
Sử dụng PDOStatement ::fetchAll () và thu thập toàn bộ tập kết quả của truy vấn bên ngoài trong một mảng PHP. Điều này kết thúc kết quả truy vấn của truy vấn bên ngoài. Sau đó, bạn có thể lặp qua mảng và chạy một truy vấn SQL bổ sung cho mỗi lần lặp vòng lặp.
Nhưng chạy một truy vấn mới cho mỗi lần lặp vòng lặp của tập kết quả bên ngoài không hiệu quả. Đó là một cách tốt để giết chết hiệu suất của ứng dụng của bạn.
Một số người gọi đây là Vấn đề lựa chọn N + 1 bởi vì bạn chạy lựa chọn đầu tiên, trả về N hàng, sau đó bạn chạy N lựa chọn dựa trên kết quả của lựa chọn đầu tiên.
-
Nếu bạn sử dụng MySQL, hãy sử dụng PDO ::MYSQL_ATTR_USE_BUFFERED_QUERY về cơ bản thực hiện điều tương tự, tải xuống tất cả các hàng, được lưu trong một mảng trong nội bộ. Sau đó, các cuộc gọi tiếp theo tới
fetch()
chỉ cần lặp lại các kết quả được lưu vào bộ đệm.Nhưng điều này cũng liên quan đến phản vật chất N + 1 Selects.
-
Tốt hơn là viết một truy vấn SQL duy nhất để bạn nhận được các giá trị bạn muốn. Đoán từ nhận xét của bạn, bạn muốn các danh mục và số lượng các hàng có liên quan từ một bảng khác có category_id khớp. Đây là một ví dụ về truy vấn SQL như vậy:
$db->pquery("SELECT c.`category_id`, c.`category_name`, COUNT(*) AS `count` FROM `database_categorys` AS c LEFT OUTER JOIN `other_table` AS t ON t.category_id = c.category_id GROUP BY c.category_id ORDER BY c.`category_name` ASC");
Tham gia là một phần cơ bản của SQL. Nếu bạn cố gắng sử dụng SQL mà không học cách sử dụng các phép nối, điều này giống như sử dụng PHP mà không học cách sử dụng while
vòng lặp.
Bắt đầu tại đây: Giải thích trực quan về Tham gia SQL .