Dovolte mi, abych vám ušetřil problémy a řekl vám, že to, o co se snažíte, stejně nebude fungovat. Ke svému IN()
vážete pouze jeden parametr volání funkce. Vy myslíte předáváte seznam oddělený čárkami, ale ve skutečnosti předáváte pouze čárkami oddělený řetězec, který je považován za jednu hodnotu . To znamená, že budete hledat jeden záznam s hodnotou "'[email protected]
', '[email protected]
„“ namísto záznamů, které odpovídají „[email protected]
" nebo "[email protected]
".
Chcete-li to překonat, musíte:
- Dynamicky generujte řetězec typů
- Použijte
call_user_func_array()
svázat vaše parametry
Řetězec typů můžete vygenerovat takto:
$types = str_repeat('s', count($selected));
Vše, co to udělá, je vytvořit řetězec s
's to je tolik znaků, jako je počet prvků v poli.
Své parametry byste pak svázali pomocí call_user_func_array()
takto (všimněte si, že jsem vrátil závorku pro IN()
funkce):
if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
call_user_func_array(array($stmt, "bind_param"), array_merge($types, $selected));
Ale pokud to zkusíte, dostanete chybu o mysqli_stmt::bind_param()
očekává se, že parametr dva bude předán odkazem:
Je to trochu otravné, ale dost snadné to obejít. Chcete-li to obejít, můžete použít následující funkci:
function refValues($arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
Pouze vytvoří pole hodnot, které jsou odkazy na hodnoty v $selected
pole. To stačí k vytvoření mysqli_stmt::bind_param()
šťastný:
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)));
Upravit
Od PHP 5.6 nyní můžete používat ...
operátora, aby to bylo ještě jednodušší:
$stmt->bind_param($types, ...$selected);