To nie jest ograniczenie PDO, to ograniczenie biblioteki klienta MySQL. MySQL obsługuje tylko jedno zapytanie w toku na raz. Nie możesz wykonać innego zapytania, gdy pierwsze zapytanie nadal ma otwarty kursor (tj. nadal ma wyniki do zwrócenia).
Masz następujące opcje:
-
Użyj PDOStatement::fetchAll() i zbierz cały zestaw wyników zewnętrznego zapytania w tablicy PHP. To kończy wynik zapytania zewnętrznego. Następnie możesz zapętlić tablicę i uruchomić dodatkowe zapytanie SQL dla każdej iteracji pętli.
Jednak uruchomienie nowego zapytania dla każdej iteracji pętli zewnętrznego zestawu wyników nie jest wydajne. To dobry sposób na obniżenie wydajności aplikacji.
Niektórzy nazywają to Problemem wyboru N+1 ponieważ uruchamiasz pierwszy wybór, który zwraca N wierszy, a następnie uruchamiasz N wyborów na podstawie wyników pierwszego wyboru.
-
Jeśli używasz MySQL, użyj PDO::MYSQL_ATTR_USE_BUFFERED_QUERY który zasadniczo robi to samo, pobiera wszystkie wiersze zapisane w wewnętrznej tablicy. Następnie kolejne wywołania
fetch()
po prostu iteruj po zbuforowanych wynikach.Ale dotyczy to również antywzorca wyboru N+1.
-
Lepiej jest napisać pojedyncze zapytanie SQL, które daje żądane wartości. Zgadując z komentarzy, chcesz kategorii i liczby powiązanych wierszy z innej tabeli, w której pasuje identyfikator_kategorii. Oto przykład takiego zapytania SQL:
$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");
Sprzężenia są podstawową częścią SQL. Jeśli próbujesz używać SQL bez nauki używania złączeń, to jest to jak używanie PHP bez nauki używania while
pętle.
Zacznij tutaj:Wizualne wyjaśnienie Połączenia SQL .