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?

10voto

Van-Duyet Le Punkte 157

Als Antwort von Flavius Stef können Sie verwenden intval() um sicherzustellen, dass alle id sind int-Werte:

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

7voto

artoodetoo Punkte 888

Pour MySQLi mit einer Escape-Funktion:

$ids = array_map(function($a) use($mysqli) { 
    return is_string($a) ? "'".$mysqli->real_escape_string($a)."'" : $a;
  }, $ids);
$ids = join(',', $ids);  
$result = $mysqli->query("SELECT * FROM galleries WHERE id IN ($ids)");

Für PDO mit vorbereiteter Erklärung:

$qmarks = implode(',', array_fill(0, count($ids), '?'));
$sth = $dbh->prepare("SELECT * FROM galleries WHERE id IN ($qmarks)");
$sth->execute($ids);

6voto

Lito Punkte 1152

Sicherer Weg ohne PDO:

$ids = array_filter(array_unique(array_map('intval', (array)$ids)));

if ($ids) {
    $query = 'SELECT * FROM `galleries` WHERE `id` IN ('.implode(',', $ids).');';
}
  • (array)$ids Gießen $ids Variable zu Array
  • array_map Alle Array-Werte in Ganzzahlen umwandeln
  • array_unique Wiederholte Werte entfernen
  • array_filter Nullwerte entfernen
  • implode Alle Werte zur IN-Auswahl hinzufügen

6voto

Izhar Aazmi Punkte 865

Wir sollten uns um Folgendes kümmern _SQL-Einschleusung_ Schwachstellen und ein leere Bedingung . Ich werde beides wie folgt behandeln.

Für ein rein numerisches Array verwenden Sie die entsprechende Typkonvertierung, nämlich intval o floatval o doubleval über jedes Element. Für String-Typen mysqli_real_escape_string() die auf Wunsch auch auf numerische Werte angewendet werden kann. MySQL erlaubt sowohl Zahlen als auch Datumsvarianten als String .

Um die Werte vor der Übergabe an die Abfrage entsprechend zu entschlüsseln, erstellen Sie eine Funktion ähnlich der folgenden:

function escape($string)
{
    // Assuming $db is a link identifier returned by mysqli_connect() or mysqli_init()
    return mysqli_real_escape_string($db, $string);
}

Eine solche Funktion steht Ihnen höchstwahrscheinlich bereits in Ihrer Anwendung zur Verfügung, oder Sie haben sie bereits erstellt.

Sanitize das String-Array wie:

$values = array_map('escape', $gallaries);

Ein numerisches Array kann bereinigt werden mit intval o floatval o doubleval stattdessen als geeignet:

$values = array_map('intval', $gallaries);

Dann erstellen Sie schließlich die Abfragebedingung

$where  = count($values) ? "`id` = '" . implode("' OR `id` = '", $values) . "'" : 0;

oder

$where  = count($values) ? "`id` IN ('" . implode("', '", $values) . "')" : 0;

Da das Array manchmal auch leer sein kann, wie $galleries = array(); sollten wir daher feststellen, dass IN () lässt keine leere Liste zu. Man kann auch verwenden OR stattdessen, aber das Problem bleibt bestehen. Also die obige Prüfung, count($values) ist es, dies zu gewährleisten.

Und fügen Sie es der endgültigen Abfrage hinzu:

$query  = 'SELECT * FROM `galleries` WHERE ' . $where;

TIPP : Wenn Sie im Falle eines leeren Arrays alle Datensätze anzeigen möchten (ohne Filterung), anstatt alle Zeilen auszublenden, ersetzen Sie einfach 0 con 1 im falschen Teil der Ternäre.

5voto

Filipe Punkte 71

Sicherer.

$galleries = array(1,2,5);
array_walk($galleries , 'intval');
$ids = implode(',', $galleries);
$sql = "SELECT * FROM galleries WHERE id IN ($ids)";

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