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?

5voto

Mark Amery Punkte 124946

Oberst Schrapnell's SafeMySQL Bibliothek für PHP bietet typisierte Platzhalter in ihren parametrisierten Abfragen und enthält eine Reihe von praktischen Platzhaltern für die Arbeit mit Arrays. Die ?a Platzhalter erweitert ein Array zu einer kommagetrennten Liste von escapeten Zeichenketten*.

Zum Beispiel:

$someArray = [1, 2, 5];
$galleries = $db->getAll("SELECT * FROM galleries WHERE id IN (?a)", $someArray);

* Da MySQL eine automatische Typunterscheidung durchführt, spielt es keine Rolle, dass SafeMySQL die obigen IDs in Zeichenketten konvertiert - Sie erhalten trotzdem das richtige Ergebnis.

4voto

Supratim Roy Punkte 782

Wir können diese "WHERE id IN"-Klausel verwenden, wenn wir das Eingabefeld richtig filtern. Etwas wie dies:

$galleries = array();

foreach ($_REQUEST['gallery_id'] as $key => $val) {
    $galleries[$key] = filter_var($val, FILTER_SANITIZE_NUMBER_INT);
}

Wie im folgenden Beispiel: enter image description here

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

D.h. Sie sollten jetzt sicher verwenden $query = "SELECT * FROM galleries WHERE id IN ({$galleryIds})";

4voto

SERJOU Punkte 57

Sie haben vielleicht einen Tisch texts (T_ID (int), T_TEXT (text)) und Tabelle test (id (int), var (varchar(255)))

Unter insert into test values (1, '1,2,3') ; wird folgendes Zeilen aus der Tabelle texts ausgeben, wobei T_ID IN (1,2,3) :

SELECT * FROM `texts` WHERE (SELECT FIND_IN_SET( T_ID, ( SELECT var FROM test WHERE id =1 ) ) AS tm) >0

Auf diese Weise können Sie eine einfache n2m-Datenbankbeziehung ohne eine zusätzliche Tabelle und nur mit SQL verwalten, ohne dass Sie PHP oder eine andere Programmiersprache verwenden müssen.

3voto

Ricardo Canelas Punkte 1912

Mehr ein Beispiel:

$galleryIds = [1, '2', 'Vitruvian Man'];
$ids = array_filter($galleryIds, function($n){return (is_numeric($n));});
$ids = implode(', ', $ids);

$sql = "SELECT * FROM galleries WHERE id IN ({$ids})";
// output: 'SELECT * FROM galleries WHERE id IN (1, 2)'

$statement = $pdo->prepare($sql);
$statement->execute();

2voto

Gaurav Singh Punkte 193

Neben der Verwendung der IN-Abfrage haben Sie zwei Möglichkeiten, da bei einer IN-Abfrage das Risiko einer SQL-Injection-Schwachstelle besteht. Sie können verwenden Schleifenbildung um die genauen Daten zu erhalten, die Sie wollen, oder Sie können die Abfrage mit または Fall

1. SELECT *
      FROM galleries WHERE id=1 or id=2 or id=5;

2. $ids = array(1, 2, 5);
   foreach ($ids as $id) {
      $data[] = SELECT *
                    FROM galleries WHERE id= $id;
   }

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