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

Masalah mengikat array yang meledak ke dalam pernyataan yang disiapkan mysql

Biarkan saya menyelamatkan Anda dari beberapa masalah dan memberi tahu Anda apa yang Anda coba lakukan tidak akan berhasil. Anda hanya mengikat satu parameter ke IN() panggilan fungsi. Anda berpikir Anda melewatkan daftar yang dipisahkan koma tetapi sebenarnya Anda hanya melewatkan string yang dipisahkan koma yang diperlakukan sebagai satu nilai . Ini berarti Anda akan mencari satu catatan dengan nilai "'[email protected] ', '[email protected] '" sebagai ganti catatan yang cocok dengan "[email protected] " atau "[email protected] ".

Untuk mengatasinya, Anda perlu:

  1. Buat string jenis Anda secara dinamis
  2. Gunakan call_user_func_array() untuk mengikat parameter Anda

Anda dapat menghasilkan string tipe seperti ini:

$types = str_repeat('s', count($selected));

Yang dilakukan hanyalah membuat string s itu adalah karakter sebanyak jumlah elemen dalam array.

Anda kemudian akan mengikat parameter Anda menggunakan call_user_func_array() seperti ini (perhatikan saya memasukkan kembali tanda kurung untuk IN() fungsi):

if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
    call_user_func_array(array($stmt, "bind_param"), array_merge($types, $selected));

Tetapi jika Anda mencoba ini, Anda akan mendapatkan kesalahan tentang mysqli_stmt::bind_param() mengharapkan parameter dua untuk diteruskan dengan referensi:

Ini agak menjengkelkan tetapi cukup mudah untuk diatasi. Untuk mengatasinya, Anda dapat menggunakan fungsi berikut:

function refValues($arr){ 
    $refs = array(); 
    foreach($arr as $key => $value) 
        $refs[$key] = &$arr[$key]; 
    return $refs; 
} 

Itu hanya membuat larik nilai yang merupakan referensi ke nilai di $selected Himpunan. Ini cukup untuk membuat mysqli_stmt::bind_param() senang:

if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
    call_user_func_array(array($stmt, "bind_param"), array_merge($types, refValues($selected)));

Sunting

Mulai PHP 5.6 sekarang Anda dapat menggunakan ... operator untuk membuatnya lebih sederhana:

$stmt->bind_param($types, ...$selected);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. innodb_lock_wait_timeout menambah batas waktu

  2. Menyimpan nilai Lat Lng di MySQL menggunakan Spatial Point Type

  3. Urutkan menurut tanggal (terbaru)

  4. Kapan menggunakan LEFT JOIN dan kapan menggunakan INNER JOIN?

  5. hitung perbedaan tanggal dalam jam menggunakan php dan mysql