Detta är inte en PDO-begränsning, det är en begränsning av MySQL-klientbiblioteket. MySQL stöder endast en pågående fråga åt gången. Du kan inte köra en annan fråga medan den första frågan fortfarande har en öppen markör (dvs. den har fortfarande resultat att returnera).
Du har dessa alternativ:
-
Använd PDOStatement::fetchAll() och samla in hela resultatuppsättningen av den yttre frågan i en PHP-array. Detta avslutar frågeresultatet för den yttre frågan. Sedan kan du loopa över arrayen och köra ytterligare en SQL-fråga för varje loopiteration.
Men att köra en ny fråga för varje loopiteration av den yttre resultatuppsättningen är inte effektivt. Det är ett bra sätt att döda prestandan för din applikation.
Vissa människor kallar detta för N+1 Selects Problem eftersom du kör det första urvalet, vilket returnerar N rader, och sedan kör du N urval baserat på resultatet av det första urvalet.
-
Om du använder MySQL, använd PDO::MYSQL_ATTR_USE_BUFFERED_QUERY som i princip gör samma sak, laddar ner alla rader, sparade i en array internt. Sedan efterföljande anrop till
fetch()
iterera bara över de buffrade resultaten.Men detta involverar också N+1 Selects-antimönster.
-
Det är bättre att skriva en enda SQL-fråga som ger dig de värden du vill ha. Utifrån dina kommentarer vill du ha kategorier och antalet relaterade rader från en annan tabell där kategori_id matchar. Här är ett exempel på en sådan SQL-fråga:
$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");
Joins är en grundläggande del av SQL. Om du försöker använda SQL utan att lära dig använda joins är det som att använda PHP utan att lära dig använda while
slingor.
Börja här:En visuell förklaring av SQL-anslutningar .