sql >> Databáze >  >> RDS >> Mysql

Proč mysqli vydává příkazy mimo synchronizaci?

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.



  1. Jak zacházet s Day Light Saving v databázi Oracle

  2. Createuser:nemohl se připojit k databázi postgres:FATAL:role tom neexistuje

  3. Vytvoření seznamu hodnot oddělených čárkami v příkazu Oracle SQL

  4. Použití LIKE v klauzuli Oracle IN