Toto není omezení PDO, je to omezení klientské knihovny MySQL. MySQL podporuje vždy pouze jeden probíhající dotaz. Nemůžete provést další dotaz, dokud má první dotaz stále otevřený kurzor (tj. stále má výsledky k vrácení).
Máte tyto možnosti:
-
Použijte PDOStatement::fetchAll() a shromáždit celou sadu výsledků vnějšího dotazu v poli PHP. Tím je výsledek dotazu vnějšího dotazu dokončen. Poté můžete pole opakovat a spustit další dotaz SQL pro každou iteraci smyčky.
Ale spuštění nového dotazu pro každou iteraci smyčky vnější sady výsledků není efektivní. Je to dobrý způsob, jak snížit výkon vaší aplikace.
Někteří lidé tomu říkají N+1 Selects Problem protože spustíte první výběr, který vrátí N řádků, a poté spustíte N výběrů na základě výsledků prvního výběru.
-
Pokud používáte MySQL, použijte PDO::MYSQL_ATTR_USE_BUFFERED_QUERY který v podstatě dělá to samé, stáhne všechny řádky, interně uložené v poli. Poté následná volání
fetch()
stačí opakovat výsledky ve vyrovnávací paměti.Ale to také zahrnuje antivzor N+1 Selects.
-
Je lepší napsat jeden SQL dotaz, který vám poskytne požadované hodnoty. Podle vašich komentářů chcete kategorie a počet souvisejících řádků z jiné tabulky, kde se id kategorie shoduje. Zde je příklad takového SQL dotazu:
$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");
Spojení jsou základní součástí SQL. Pokud se pokusíte používat SQL, aniž byste se naučili používat spojení, je to jako používat PHP, aniž byste se naučili používat while
smyčky.
Začněte zde:Vizuální vysvětlení SQL spojení .