Klient MySQL vám neumožňuje provést nový dotaz, kde stále existují řádky k načtení z probíhajícího dotazu. Viz Příkazy nejsou synchronizované v dokumentu MySQL o běžných chybách.
Můžete použít mysqli_store_result()
k předběžnému načtení všech řádků z vnějšího dotazu. To je uloží do vyrovnávací paměti v klientovi MySQL, takže z pohledu serveru vaše aplikace načetla úplnou sadu výsledků. Pak můžete provádět více dotazů i ve smyčce načítání řádků z nyní uložené vnější sady výsledků.
Nebo mysqli_result::fetch_all()
který vrátí úplnou sadu výsledků jako pole PHP a poté můžete toto pole přepínat.
Volání uložených procedur je zvláštní případ, protože uložená procedura má potenciál pro vrácení více sad výsledků, z nichž každá může mít svou vlastní sadu řádků. To je důvod, proč odpověď od @a1ex07 zmiňuje použití mysqli_multi_query()
a opakování až do mysqli_next_result()
nemá žádné další sady výsledků. To je nezbytné pro splnění protokolu MySQL, i když ve vašem případě má vaše uložená procedura jedinou sadu výsledků.
PS:Mimochodem, vidím, že děláte vnořené dotazy, protože máte data představující hierarchii. Možná budete chtít zvážit uložení dat jinak, abyste je mohli snadněji dotazovat. Udělal jsem o tom prezentaci s názvem Modely pro hierarchická data s SQL a PHP . Tomuto tématu se věnuji také v kapitole své knihy SQL Antipatterns:Avoiding the Pitfalls of Database Programování .
Zde je návod, jak implementovat mysqli_next_result()
v CodeIgnitor 3.0.3:
Na řádku 262 system/database/drivers/mysqli/mysqli_driver.php
změnit
protected function _execute($sql)
{
return $this->conn_id->query($this->_prep_query($sql));
}
k tomuto
protected function _execute($sql)
{
$results = $this->conn_id->query($this->_prep_query($sql));
@mysqli_next_result($this->conn_id); // Fix 'command out of sync' error
return $results;
}
To je problém od 2.x. Právě jsem aktualizoval na 3.x a musel jsem tento hack zkopírovat do nové verze.