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:
- Buat string jenis Anda secara dinamis
- 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);