Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Saya Mendapat Ralat MySQL 2014: \'Tidak dapat melaksanakan pertanyaan semasa pertanyaan tidak buffer lain aktif\'?

Mengapa Saya Mendapat Ralat MySQL 2014: \'Tidak dapat melaksanakan pertanyaan semasa pertanyaan tidak buffer lain aktif\'?

DDD
DDDasal
2024-11-21 07:10:13177semak imbas

Why Am I Getting MySQL Error 2014:

Punca ralat MySQL 2014: Tidak dapat melaksanakan pertanyaan semasa pertanyaan tidak buffer lain aktif

Ralat MySQL 2014 berlaku apabila cuba melaksanakan pertanyaan sementara pertanyaan tidak buffer lain masih aktif. Ini boleh berlaku apabila menggunakan pernyataan yang disediakan dengan PDO::ATTR_EMULATE_PREPARES ditetapkan kepada palsu.

Penjelasan

Apabila PDO::ATTR_EMULATE_PREPARES adalah benar, PDO akan meniru pernyataan yang disediakan dengan menukarnya kepada pertanyaan SQL biasa. Ini bermakna pelayan akan melaksanakan pertanyaan sekali untuk setiap baris data, membenarkan pertanyaan tidak buffer dilaksanakan serentak.

Walau bagaimanapun, apabila PDO::ATTR_EMULATE_PREPARES palsu, PDO akan menghantar pernyataan yang disediakan kepada pelayan dan tahan kursor terbuka. Ini menghalang pertanyaan lain daripada dilaksanakan sehingga kursor ditutup.

Penyelesaian

Terdapat beberapa penyelesaian untuk ralat ini:

  • Dayakan pertanyaan penimbal: Anda boleh menggunakan atribut PDO::MYSQL_ATTR_USE_BUFFERED_QUERY untuk mendayakan pertanyaan buffer. Ini akan menyebabkan PDO mengambil semua hasil daripada pertanyaan ke dalam memori sebelum melaksanakan pertanyaan berikutnya.
  • **Gunakan fetchAll(): Memanggil fetchAll() pada pernyataan yang disediakan akan menutup kursor dan membenarkan pertanyaan lain dilaksanakan .
  • Tutup kursor: Anda boleh menutup kursor secara eksplisit pada pernyataan yang disediakan menggunakan kaedah closeCursor().

Pertimbangan Tambahan

Dalam coretan kod yang disediakan, terdapat isu apabila pertanyaan $stmt2 dilaksanakan beberapa kali dalam gelung. Ini tidak perlu dan boleh dialihkan ke luar gelung untuk meningkatkan prestasi.

Ia juga disyorkan untuk menggunakan parameter bernama (PDO::bindParam()) dan bukannya parameter kedudukan (PDO::execute() dengan tatasusunan) untuk kenyataan yang disediakan. Ini menjadikan kod lebih mudah dibaca dan mengurangkan risiko suntikan SQL.

Kesimpulan

Ralat MySQL 2014 boleh disebabkan oleh tidak mengendalikan pertanyaan tidak buffer dengan betul. Dengan menggunakan pertanyaan penimbal, memanggil fetchAll(), atau menutup kursor, ralat ini boleh dielakkan.

Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat MySQL 2014: \'Tidak dapat melaksanakan pertanyaan semasa pertanyaan tidak buffer 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