Това не е ограничение на PDO, а ограничение на клиентската библиотека на MySQL. MySQL поддържа само една заявка в ход в даден момент. Не можете да изпълните друга заявка, докато първата заявка все още има отворен курсор (т.е. все още има резултати за връщане).
Имате следните опции:
-
Използвайте PDOStatement::fetchAll() и съберете целия набор от резултати от външната заявка в PHP масив. Това завършва резултата от заявката на външната заявка. След това можете да преминете през масива и да изпълните допълнителна SQL заявка за всяка итерация на цикъла.
Но изпълнението на нова заявка за всяка итерация на цикъла на външния набор от резултати не е ефективно. Това е добър начин да убиете производителността на вашето приложение.
Някои хора наричат това N+1 избира проблем защото изпълнявате първия избор, който връща N реда и след това изпълнявате N селекти въз основа на резултатите от първия избор.
-
Ако използвате MySQL, използвайте PDO::MYSQL_ATTR_USE_BUFFERED_QUERY който по същество прави същото, изтегля всички редове, записани в масив вътрешно. След това следващи извиквания на
fetch()
просто повторете буферираните резултати.Но това включва и антимодел N+1 Selects.
-
По-добре е да напишете една единствена SQL заявка, която да ви даде желаните от вас стойности. Познавайки от вашите коментари, искате категории и броя на свързаните редове от друга таблица, където категория_id съвпада. Ето пример за такава 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");
Съединенията са основна част от SQL. Ако се опитате да използвате SQL, без да се научите да използвате съединения, това е като да използвате PHP, без да се научите да използвате while
цикли.
Започнете от тук:Визуално обяснение на SQL присъединява .