Позволете ми да ви спестя малко проблеми и да ви кажа, че това, което се опитвате да направите, така или иначе няма да работи. Обвързвате само един параметър към вашия IN()
извикване на функция. Вие мислите предавате разделен със запетая списък, но всъщност предавате само разделен със запетая низ, който се третира като една стойност . Това означава, че ще търсите един запис със стойност "'[email protected]
', '[email protected]
"" вместо записи, които съответстват на "[email protected]
" или "[email protected]
".
За да преодолеете това, трябва:
- Динамично генерирайте низовете си с типове
- Използвайте
call_user_func_array()код>
за да обвържете параметрите си
Можете да генерирате низовете за типове по следния начин:
$types = str_repeat('s', count($selected));
Всичко това прави е да създаде низ от s
Това е толкова символа, колкото броят на елементите в масива.
След това ще свържете параметрите си с помощта на call_user_func_array()
така (забележете, че върнах скобите за IN()
функция):
if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
call_user_func_array(array($stmt, "bind_param"), array_merge($types, $selected));
Но ако опитате това, ще получите грешка за mysqli_stmt::bind_param()
очаква се параметър два да бъде предаден чрез препратка:
Това е малко досадно, но достатъчно лесно за заобикаляне. За да заобиколите това, можете да използвате следната функция:
function refValues($arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
Той просто създава масив от стойности, които са препратки към стойностите в $selected
масив. Това е достатъчно, за да направите mysqli_stmt::bind_param()
щастлив:
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)));
Редактиране
От PHP 5.6 вече можете да използвате ...
оператор, за да направи това още по-лесно:
$stmt->bind_param($types, ...$selected);