Pozwól, że oszczędzę ci trochę kłopotów i powiem, że to, co próbujesz zrobić, i tak nie zadziała. Przywiązujesz tylko jeden parametr do swojej IN() wywołanie funkcji. myślisz przekazujesz listę oddzieloną przecinkami, ale w rzeczywistości przekazujesz tylko ciąg oddzielony przecinkami, który jest traktowany jako jedna wartość . Oznacza to, że będziesz szukać jednego rekordu z wartością „'example@sqldat.com
', 'example@sqldat.com
„” zamiast rekordów pasujących do „example@sqldat.com
„ lub „przykład@sqldat.com
".
Aby rozwiązać ten problem, musisz:
- Dynamicznie generuj ciąg typów
- Użyj
call_user_func_array()do powiązania parametrów
Możesz wygenerować łańcuch typów w następujący sposób:
$types = str_repeat('s', count($selected));
Wszystko to tworzy ciąg s to tyle znaków, ile jest elementów w tablicy.
Następnie powiązałbyś swoje parametry za pomocą call_user_func_array() w ten sposób (zauważ, że ponownie wstawiłem nawias dla IN() funkcja):
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 jeśli spróbujesz tego, otrzymasz błąd dotyczący mysqli_stmt::bind_param() oczekiwanie, że parametr drugi zostanie przekazany przez odwołanie:
To trochę irytujące, ale dość łatwe do obejścia. Aby obejść ten problem, możesz użyć następującej funkcji:
function refValues($arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
Po prostu tworzy tablicę wartości, które są odniesieniami do wartości w $selected szyk. To wystarczy, aby mysqli_stmt::bind_param() szczęśliwy:
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)));
Edytuj
Od PHP 5.6 możesz teraz używać ... operatora, aby to jeszcze uprościć:
$stmt->bind_param($types, ...$selected);