PDO không tốt với những thứ như vậy. Bạn cần tạo một chuỗi với trình giữ chỗ động và chèn nó vào truy vấn, trong khi liên kết các giá trị mảng theo cách thông thường. Với trình giữ chỗ vị trí, nó sẽ như thế này:
$in = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();
Trong trường hợp có các trình giữ chỗ khác trong truy vấn, bạn có thể sử dụng phương pháp sau (mã được lấy từ hướng dẫn PDO của tôi ):
Bạn có thể sử dụng array_merge()
hàm để nối tất cả các biến thành một mảng, thêm các biến khác của bạn ở dạng mảng, theo thứ tự chúng xuất hiện trong truy vấn của bạn:
$arr = [1,2,3];
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();
Trong trường hợp bạn đang sử dụng trình giữ chỗ được đặt tên, mã sẽ phức tạp hơn một chút, vì bạn phải tạo một chuỗi các trình giữ chỗ được đặt tên, ví dụ::id0,:id1,:id2
. Vì vậy, mã sẽ là:
// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];
$ids = [1,2,3];
$in = "";
$i = 0; // we are using an external counter
// because the actual array keys could be dangerous
foreach ($ids as $item)
{
$key = ":id".$i++;
$in .= ($in ? "," : "") . $key; // :id0,:id1,:id2
$in_params[$key] = $item; // collecting values into a key-value array
}
$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params,$in_params)); // just merge two arrays
$data = $stm->fetchAll();
May mắn thay, đối với các trình giữ chỗ đã đặt tên, chúng tôi không phải tuân theo thứ tự nghiêm ngặt, vì vậy chúng tôi có thể hợp nhất các mảng của mình theo bất kỳ thứ tự nào.