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.