Sử dụng PDO: [1]
$in = join(',', array_fill(0, count($ids), '?'));
$select = <<<SQL
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
$statement = $pdo->prepare($select);
$statement->execute($ids);
Sử dụng MySQLi [2]
$in = join(',', array_fill(0, count($ids), '?'));
$select = <<<SQL
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
$statement = $mysqli->prepare($select);
$statement->bind_param(str_repeat('i', count($ids)), ...$ids);
$statement->execute();
$result = $statement->get_result();
Giải trình:
Sử dụng IN()
toán tử SQL để kiểm tra xem một giá trị có tồn tại trong một danh sách nhất định không.
Nói chung nó trông như thế này:
expr IN (value,...)
Chúng ta có thể xây dựng một biểu thức để đặt bên trong ()
từ mảng của chúng ta. Lưu ý rằng phải có ít nhất một giá trị bên trong dấu ngoặc đơn hoặc MySQL sẽ trả về lỗi; điều này tương đương với việc đảm bảo rằng mảng đầu vào của chúng ta có ít nhất một giá trị. Để giúp ngăn chặn các cuộc tấn công tiêm nhiễm SQL, trước tiên hãy tạo một ?
cho mỗi mục đầu vào để tạo một truy vấn được tham số hóa. Ở đây tôi giả sử rằng mảng chứa id của bạn được gọi là $ids
:
$in = join(',', array_fill(0, count($ids), '?'));
$select = <<<SQL
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
Đưa ra một mảng đầu vào gồm ba mục $select
sẽ như sau:
SELECT *
FROM galleries
WHERE id IN (?, ?, ?)
Một lần nữa lưu ý rằng có một ?
mục cho mỗi mục trong mảng đầu vào. Sau đó, chúng tôi sẽ sử dụng PDO hoặc MySQLi để chuẩn bị và thực hiện truy vấn như đã lưu ý ở trên.
Sử dụng IN()
toán tử với chuỗi
Thật dễ dàng để thay đổi giữa các chuỗi và số nguyên vì các tham số ràng buộc. Đối với PDO, không có thay đổi cần thiết; để MySQLi thay đổi str_repeat('i',
thành str_repeat('s',
nếu bạn cần kiểm tra chuỗi.
[1]: Tôi đã bỏ qua một số lỗi kiểm tra lỗi. Bạn cần kiểm tra các lỗi thông thường cho từng phương thức cơ sở dữ liệu (hoặc đặt trình điều khiển DB của bạn để ném ngoại lệ).
[2]: Yêu cầu PHP 5.6 trở lên. Một lần nữa tôi đã bỏ qua một số lỗi kiểm tra cho ngắn gọn.