Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Penyebab kesalahan MySQL 2014 Tidak dapat menjalankan kueri saat kueri tanpa buffer lainnya aktif

Protokol klien MySQL tidak mengizinkan lebih dari satu kueri "sedang berlangsung". Artinya, Anda telah menjalankan kueri dan Anda telah mengambil beberapa hasil, tetapi tidak semua -- lalu Anda mencoba menjalankan kueri kedua. Jika kueri pertama masih memiliki baris untuk dikembalikan, kueri kedua mendapatkan kesalahan.

Pustaka klien menyiasatinya dengan mengambil semua baris kueri pertama secara implisit pada pengambilan pertama, dan kemudian pengambilan berikutnya hanya mengulangi hasil yang di-cache secara internal. Ini memberi mereka kesempatan untuk menutup kursor (sejauh menyangkut server MySQL). Ini adalah "kueri buffer". Ini bekerja sama seperti menggunakan fetchAll(), di mana kedua kasus harus mengalokasikan cukup memori di klien PHP untuk menampung set hasil lengkap.

Perbedaannya adalah bahwa kueri buffer menyimpan hasilnya di pustaka klien MySQL, jadi PHP tidak dapat mengakses baris sampai Anda mengambil() setiap baris secara berurutan. Sedangkan fetchAll() segera mengisi larik PHP untuk semua hasil, memungkinkan Anda mengakses baris acak apa pun.

Alasan utama tidak untuk menggunakan fetchAll() adalah bahwa hasilnya mungkin terlalu besar untuk muat di memory_limit PHP Anda. Namun tampaknya hasil kueri Anda hanya memiliki satu baris, jadi seharusnya tidak menjadi masalah.

Anda dapat menutupCursor() untuk "meninggalkan" hasil sebelum Anda mengambil baris terakhir. Server MySQL akan diberi tahu bahwa ia dapat membuang hasil tersebut di sisi server, dan kemudian Anda dapat menjalankan kueri lain. Anda tidak boleh menutupCursor() sampai Anda selesai mengambil kumpulan hasil yang diberikan.

Juga:Saya perhatikan Anda menjalankan $stmt2 Anda berulang-ulang di dalam loop, tetapi itu akan mengembalikan hasil yang sama setiap kali. Pada prinsip memindahkan kode loop-invariant keluar dari loop, Anda harus mengeksekusi ini sekali sebelum memulai loop, dan menyimpan hasilnya dalam variabel PHP. Jadi, terlepas dari menggunakan kueri buffer atau fetchAll(), Anda tidak perlu menyarangkan kueri Anda.

Jadi saya akan merekomendasikan menulis kode Anda dengan cara ini:

$sql ='SELECT temp_id FROM temp1';
$stmt2 = db::db()->prepare($sql);
$stmt2->execute();
$rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
$stmt2->closeCursor();

$sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes 
      WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id';
$stmt1 = db::db()->prepare($sql);

foreach($data AS $row)
{
    try
    {
        $stmt1->execute($row);
        $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
        $stmt1->closeCursor();
        syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand());
        syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand());
    }
    catch(PDOException $e){echo(sql_error($e));}            
}

Catatan Saya juga menggunakan parameter bernama alih-alih parameter posisi, yang membuatnya lebih mudah untuk melewatkan $row sebagai larik nilai parameter. Jika kunci array cocok dengan nama parameter, Anda bisa meneruskan array. Dalam versi PHP yang lebih lama, Anda harus menyertakan : awalan di kunci array, tetapi Anda tidak membutuhkannya lagi.

Anda harus tetap menggunakan mysqlnd. Ini memiliki lebih banyak fitur, lebih hemat memori, dan lisensinya kompatibel dengan PHP.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Siapkan MySQL 8 dari Binary Tarball

  2. Memahami MySQL TRUNCATE TABLE dengan Contoh Praktis

  3. Menggunakan aplikasi klien MySQL

  4. Membandingkan Waktu Failover Proxy Basis Data - ProxySQL, MaxScale, dan HAProxy

  5. Bagaimana saya bisa mengakses baris perintah MySQL dengan XAMPP untuk Windows?