Klient MySQL nie pozwala na wykonanie nowego zapytania, w którym nadal istnieją wiersze do pobrania z zapytania w toku. Zobacz Niezsynchronizowane polecenia w dokumentacji MySQL na temat typowych błędów.
Możesz użyć mysqli_store_result()
aby pobrać z wyprzedzeniem wszystkie wiersze z zewnętrznego zapytania. Spowoduje to zbuforowanie ich w kliencie MySQL, więc z punktu widzenia serwera Twoja aplikacja pobrała pełny zestaw wyników. Następnie możesz wykonać więcej zapytań nawet w pętli pobierania wierszy z buforowanego teraz zewnętrznego zestawu wyników.
Lub mysqli_result::fetch_all()
co zwraca pełny zestaw wyników jako tablicę PHP, a następnie możesz przejść przez tę tablicę w pętli.
Wywoływanie procedur składowanych jest przypadkiem szczególnym, ponieważ procedura składowana może zwracać wiele zestawów wyników, z których każdy może mieć własny zestaw wierszy. Dlatego odpowiedź z @a1ex07 wspomina o użyciu mysqli_multi_query()
i zapętlanie aż do mysqli_next_result()
nie ma więcej zestawów wyników. Jest to konieczne, aby zapewnić zgodność z protokołem MySQL, nawet jeśli w twoim przypadku procedura składowana ma jeden zestaw wyników.
PS:A tak przy okazji, widzę, że robisz zagnieżdżone zapytania, ponieważ masz dane reprezentujące hierarchię. Możesz rozważyć przechowywanie danych w inny sposób, aby łatwiej było je przeszukiwać. Zrobiłem prezentację na temat tego zatytułowanego Modele danych hierarchicznych z SQL i PHP . Omówię ten temat również w rozdziale mojej książki Antywzorce SQL:unikanie pułapek bazy danych Programowanie .
Oto jak zaimplementować mysqli_next_result()
w CodeIgnitor 3.0.3:
W linii 262 system/database/drivers/mysqli/mysqli_driver.php
zmiana
protected function _execute($sql)
{
return $this->conn_id->query($this->_prep_query($sql));
}
do tego
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 był problem od wersji 2.x. Właśnie zaktualizowałem do 3.x i musiałem skopiować ten hack do nowej wersji.