Rumah >pangkalan data >tutorial mysql >Mengapa Ralat MySQL 2014 Berlaku dengan Pertanyaan Tidak Dibuffer dan Bagaimana Ia Boleh Diselesaikan?

Mengapa Ralat MySQL 2014 Berlaku dengan Pertanyaan Tidak Dibuffer dan Bagaimana Ia Boleh Diselesaikan?

DDD
DDDasal
2024-12-11 02:42:09241semak imbas

Why Does MySQL Error 2014 Occur with Unbuffered Queries and How Can It Be Resolved?

Mengapa MySQL Ralat 2014 Berlaku dengan Pertanyaan Tidak Dibuffer?

Ralat MySQL 2014, "Tidak boleh melaksanakan pertanyaan semasa pertanyaan tidak buffer lain aktif," timbul apabila pertanyaan dilaksanakan manakala pertanyaan lain yang tidak ditimbal masih ada kemajuan. Pertanyaan yang tidak ditimbal tidak mengambil sepenuhnya semua hasil daripada pelayan, yang membawa kepada ralat.

Mengapa Ini Diwujudkan Hanya dengan PDO::ATTR_EMULATE_PREPARES=false?

Apabila PDO ::ATTR_EMULATE_PREPARES=benar, PDO meniru kenyataan yang disediakan. Di bawah tetapan ini, semua keputusan diambil secara tersirat, menghalang ralat daripada berlaku. Walau bagaimanapun, dengan PDO::ATTR_EMULATE_PREPARES=false, PDO menggunakan pernyataan yang disediakan asli, yang memerlukan pengambilan eksplisit.

Mengapa Beberapa Versi PHP Berperilaku Berbeza?

Versi PHP yang berbeza boleh mengendalikan pertanyaan tidak buffer secara berbeza. Versi yang lebih lama mungkin telah mengambil semua hasil secara automatik, manakala versi yang lebih baharu mematuhi protokol MySQL dengan lebih ketat, mengakibatkan ralat apabila pertanyaan tidak buffer digunakan.

Cara Menyelesaikan Ralat

Untuk menyelesaikan ralat, terdapat beberapa pilihan:

  • Gunakan PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=true: Ini akan mendayakan pertanyaan buffer, di mana semua keputusan diambil secara automatik oleh PDO.
  • Gunakan fetchAll(): Kaedah ini secara eksplisit mengambil semua baki hasil daripada pertanyaan, menutup kursor dan membenarkan pertanyaan seterusnya.
  • Gunakan closeCursor(): Kaedah ini secara eksplisit menutup kursor untuk pertanyaan, membebaskan sumber dan membenarkan pertanyaan seterusnya. Ambil perhatian bahawa ini hanya boleh digunakan selepas semua keputusan telah diambil.

Pengesyoran

Secara amnya disyorkan untuk menggunakan pertanyaan penimbal untuk set hasil kecil atau apabila adalah penting untuk mengakses hasil secara berurutan. Untuk set hasil yang besar, fetchAll() boleh digunakan untuk memuatkan semua hasil ke dalam memori dengan penuh semangat. closeCursor() harus digunakan dengan berhati-hati untuk mengelakkan kursor ditutup sebelum waktunya dan kemungkinan kehilangan hasil.

Selain itu, adalah dinasihatkan untuk menggunakan pemacu mysqlnd untuk meningkatkan prestasi dan keserasian dengan PHP.

Atas ialah kandungan terperinci Mengapa Ralat MySQL 2014 Berlaku dengan Pertanyaan Tidak Dibuffer dan Bagaimana Ia Boleh Diselesaikan?. 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