Rumah >pangkalan data >tutorial mysql >Mengapa MySQL Mengembalikan Ralat 2014: 'Tidak Dapat Melaksanakan Pertanyaan Semasa Pertanyaan Tidak Dibuffer Lain Aktif'?

Mengapa MySQL Mengembalikan Ralat 2014: 'Tidak Dapat Melaksanakan Pertanyaan Semasa Pertanyaan Tidak Dibuffer Lain Aktif'?

Susan Sarandon
Susan Sarandonasal
2024-12-23 15:42:10870semak imbas

Why Does MySQL Return Error 2014:

Punca Ralat MySQL 2014: Tidak Dapat Melaksanakan Pertanyaan Semasa Pertanyaan Tidak Dibuffer Lain Aktif

Protokol klien MySQL mengehadkan melaksanakan berbilang hasil secara serentak apabila daripada pertanyaan sebelumnya belum diperoleh sepenuhnya. Had ini timbul disebabkan oleh sifat tidak buffer beberapa pertanyaan, di mana baris diambil secara berperingkat dan bukannya dicache serta-merta seperti dalam pertanyaan penimbal.

Apabila melaksanakan pertanyaan tidak buffer dan cuba melaksanakan pertanyaan lain sebelum mendapatkan semula semua baris daripada pertama, MySQL mengembalikan ralat "Tidak dapat melaksanakan pertanyaan manakala pertanyaan tidak buffer lain adalah aktif."

Penyata Disediakan Ditiru

PDO::ATTR_EMULATE_PREPARES menentukan sama ada pernyataan yang disediakan dicontohi atau dilaksanakan sebagai penyata MySQL asli yang disediakan. Jika ditetapkan kepada palsu, menggunakan pertanyaan PHP tidak buffer boleh mencetuskan ralat 2014. Ini kerana mekanisme caching dalaman PHP untuk hasil pertanyaan tidak mengendalikan pertanyaan tidak buffer dengan betul.

Menyelesaikan Ralat

Terdapat beberapa cara untuk menyelesaikan masalah ini ralat:

  • Gunakan Pertanyaan Penimbalan: Mendayakan PDO::MYSQL_ATTR_USE_BUFFERED_QUERY menyebabkan pertanyaan dilaksanakan dalam mod penimbal, yang secara automatik mengambil semua baris sekaligus. Walau bagaimanapun, ini boleh menjadi intensif memori jika set hasil adalah besar.
  • Ambil Semua Baris: Memanggil fetchAll() pada pertanyaan memastikan semua baris diambil dan kursor hasil ditutup , membenarkan pertanyaan seterusnya dilaksanakan tanpa ralat.
  • Tutup Kursor: Menutup kursor dengan closeCursor() melepaskan sumber MySQL yang dikaitkan dengan pertanyaan yang tidak ditimbal dan membenarkan pertanyaan seterusnya dilaksanakan. Walau bagaimanapun, ini menghalang pengambilan mana-mana baris yang tinggal daripada pertanyaan yang tidak ditimbal.

Amalan Terbaik

Untuk mengelak daripada menghadapi ralat ini, anda disyorkan untuk:

  • Gunakan pertanyaan buffer atau fetchAll() secara lalai untuk pertanyaan tidak buffer yang dapatkan bilangan baris yang terhad.
  • Elakkan pertanyaan bersarang jika tidak perlu, kerana melaksanakan pertanyaan dalam berbilang kali dalam satu gelung boleh menambahkan ralat.
  • Tutup kursor apabila anda selesai mengambil data untuk melepaskan sumber pelayan dan menghalang ralat daripada berlaku.
  • Pertimbangkan untuk berhijrah ke pemacu mysqlnd, yang adalah lebih cekap ingatan dan menyokong kenyataan yang disediakan yang dicontohi.

Atas ialah kandungan terperinci Mengapa MySQL Mengembalikan Ralat 2014: 'Tidak Dapat Melaksanakan Pertanyaan Semasa Pertanyaan Tidak Dibuffer Lain Aktif'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn