Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego mysqli wyświetla błąd braku synchronizacji poleceń?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ustaw strefę czasową w PHP i MySQL

  2. Jak zmienić numerację indeksu podstawowego?

  3. Zarządzanie bazą danych MySQL w cPanel za pomocą PHPMyAdmin

  4. Jak zamawiać według nazwy miesiąca w MySQL

  5. Włącz Entity Framework 6 dla MySql (C#) w WinForms Microsoft Visual Studio 2013