Korzystanie z 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);
Korzystanie z 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();
Wyjaśnienie:
Użyj IN()
operatora SQL , aby sprawdzić, czy wartość istnieje na danej liście.
Ogólnie wygląda to tak:
expr IN (value,...)
Możemy zbudować wyrażenie do umieszczenia wewnątrz ()
naszej tablicy. Zauważ, że w nawiasie musi znajdować się co najmniej jedna wartość, inaczej MySQL zwróci błąd; oznacza to upewnienie się, że nasza tablica wejściowa ma co najmniej jedną wartość. Aby zapobiec atakom typu SQL injection, najpierw wygeneruj ?
dla każdego elementu wejściowego, aby utworzyć sparametryzowane zapytanie. Tutaj zakładam, że tablica zawierająca twoje identyfikatory nazywa się $ids
:
$in = join(',', array_fill(0, count($ids), '?'));
$select = <<<SQL
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
Podana tablica wejściowa trzech elementów $select
będzie wyglądać następująco:
SELECT *
FROM galleries
WHERE id IN (?, ?, ?)
Ponownie zauważ, że ?
dla każdego elementu w tablicy wejściowej znajduje się znak . Następnie użyjemy PDO lub MySQLi do przygotowania i wykonania zapytania, jak wspomniano powyżej.
Używanie IN()
operatora z ciągami znaków
Łatwo jest zmieniać ciągi znaków i liczby całkowite ze względu na związane parametry. W przypadku ChNP zmiana nie jest wymagana; dla MySQLi zmień str_repeat('i',
na, str_repeat('s',
jeśli chcesz sprawdzić ciągi.
[1]: Pominąłem sprawdzanie błędów pod kątem zwięzłości. Musisz sprawdzić typowe błędy dla każdej metody bazy danych (lub ustawić sterownik DB tak, aby generował wyjątki).
[2]: Wymaga PHP 5.6 lub wyższej. Znowu pominąłem pewne sprawdzanie błędów pod kątem zwięzłości.