340 Stimmen

Übergabe eines Arrays an eine Abfrage mit einer WHERE-Klausel

Gegeben ein Array von ids $galleries = array(1,2,5) Ich möchte eine SQL-Abfrage, die die Werte des Arrays in seiner WHERE-Klausel verwendet, wie:

SELECT *
FROM galleries
WHERE id = /* values of array $galleries... eg. (1 || 2 || 5) */

Wie kann ich diese Abfragezeichenfolge zur Verwendung mit MySQL generieren?

358voto

Flavius Stef Punkte 13520

VORSICHT! Diese Antwort enthält einen schwerwiegenden SQL-Einschleusung Verwundbarkeit. Verwenden Sie die hier vorgestellten Codebeispiele NICHT, ohne sicherzustellen, dass alle externen Eingaben bereinigt werden.

$ids = join("','",$galleries);   
$sql = "SELECT * FROM galleries WHERE id IN ('$ids')";

328voto

Levi Morrison Punkte 18580

PDO verwenden: [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);

MySQLi verwenden [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();

Erläuterung:

Verwenden Sie die SQL IN() Operator, um zu prüfen, ob ein Wert in einer gegebenen Liste existiert.

Im Allgemeinen sieht das so aus:

expr IN (value,...)

Wir können einen Ausdruck erstellen, der innerhalb der () aus unserem Array. Beachten Sie, dass mindestens ein Wert innerhalb der Klammer stehen muss, sonst gibt MySQL einen Fehler zurück; das bedeutet, dass unser Eingabe-Array mindestens einen Wert haben muss. Um SQL-Injection-Angriffen vorzubeugen, erzeugen Sie zunächst eine ? für jedes Eingabeelement, um eine parametrisierte Abfrage zu erstellen. Hier nehme ich an, dass das Array, das Ihre IDs enthält, heißt $ids :

$in = join(',', array_fill(0, count($ids), '?'));

$select = <<<SQL
    SELECT *
    FROM galleries
    WHERE id IN ($in);
SQL;

Gegeben ein Eingabefeld mit drei Elementen $select aussehen wird:

SELECT *
FROM galleries
WHERE id IN (?, ?, ?)

Auch hier gilt es zu beachten, dass es eine ? für jedes Element im Eingabefeld. Dann verwenden wir PDO oder MySQLi, um die Abfrage wie oben beschrieben vorzubereiten und auszuführen.

Die Verwendung des IN() Operator mit Zeichenketten

Durch die gebundenen Parameter ist es einfach, zwischen Zeichenketten und ganzen Zahlen zu wechseln. Für PDO ist keine Änderung erforderlich; für MySQLi ändern str_repeat('i', a str_repeat('s', wenn Sie Zeichenketten überprüfen müssen.

[1]: Der Kürze halber habe ich einige Fehlerprüfungen weggelassen. Sie müssen für jede Datenbankmethode auf die üblichen Fehler prüfen (oder Ihren DB-Treiber so einstellen, dass er Ausnahmen auslöst).

[2]: Benötigt PHP 5.6 oder höher. Der Kürze halber habe ich wieder einige Fehlerprüfungen weggelassen.

61voto

user542568 Punkte 777

Ints:

$query = "SELECT * FROM `$table` WHERE `$column` IN(".implode(',',$array).")";

Streicher:

$query = "SELECT * FROM `$table` WHERE `$column` IN('".implode("','",$array)."')";

31voto

AvatarKava Punkte 14960

Vorausgesetzt, Sie bereinigen Ihre Eingaben vorher ordnungsgemäß...

$matches = implode(',', $galleries);

Dann passen Sie Ihre Abfrage einfach an:

SELECT *
FROM galleries
WHERE id IN ( $matches ) 

Geben Sie die Werte je nach Ihrem Datensatz entsprechend an.

18voto

Matthew Flaschen Punkte 266507

Verwendung:

select id from galleries where id in (1, 2, 5);

Eine einfache for each Schleife wird funktionieren.

Flavius/AvatarKava's Weg ist besser, aber stellen Sie sicher, dass keiner der Array-Werte Kommas enthält.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X