Klien MySQL tidak mengizinkan Anda untuk mengeksekusi kueri baru di mana masih ada baris yang harus diambil dari kueri yang sedang berlangsung. Lihat Perintah tidak sinkron di dokumen MySQL tentang kesalahan umum.
Anda dapat menggunakan mysqli_store_result()
untuk mengambil semua baris dari kueri luar. Itu akan menyangga mereka di klien MySQL, jadi dari sudut pandang server, aplikasi Anda telah mengambil set hasil lengkap. Kemudian Anda dapat menjalankan lebih banyak kueri bahkan dalam satu putaran pengambilan baris dari kumpulan hasil luar yang sekarang di-buffer.
Atau Anda mysqli_result::fetch_all()
yang mengembalikan set hasil lengkap sebagai larik PHP, lalu Anda dapat mengulang larik itu.
Memanggil prosedur tersimpan adalah kasus khusus, karena prosedur tersimpan memiliki potensi untuk mengembalikan beberapa kumpulan hasil, yang masing-masing mungkin memiliki kumpulan barisnya sendiri. Itu sebabnya jawaban dari @a1ex07 menyebutkan menggunakan mysqli_multi_query()
dan mengulang sampai mysqli_next_result()
tidak memiliki set hasil lagi. Ini diperlukan untuk memenuhi protokol MySQL, bahkan jika prosedur tersimpan Anda memiliki satu set hasil.
PS:Omong-omong, saya melihat Anda melakukan kueri bersarang karena Anda memiliki data yang mewakili hierarki. Anda mungkin ingin mempertimbangkan untuk menyimpan data secara berbeda, sehingga Anda dapat melakukan kueri dengan lebih mudah. Saya melakukan presentasi tentang ini dengan judul Model untuk Data Hirarki dengan SQL dan PHP . Saya juga membahas topik ini dalam bab buku saya SQL Antipatterns:Avoiding the Pitfalls of Database Pemrograman .
Berikut adalah cara mengimplementasikan mysqli_next_result()
di CodeIgnitor 3.0.3:
Pada baris 262 dari system/database/drivers/mysqli/mysqli_driver.php
ubah
protected function _execute($sql)
{
return $this->conn_id->query($this->_prep_query($sql));
}
untuk ini
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;
}
Ini telah menjadi masalah sejak 2.x. Saya baru saja memperbarui ke 3.x dan harus menyalin peretasan ini ke versi baru.