dWing — die Welt ist nicht gerecht

sign in

Gesucht: SQL IN mit prepared Statements

Schon seit einiger Zeit arbeite ich mit PDO und prepared Statements. Wem dies noch kein Begriff ist sollte wissen, dass prepared Statements die Wunderwaffe gegen SQL Injektionen sind und außerdem noch eine kleine Leistungsverbesserung bringen. Es wird also ein Query mit unbenannten oder benannten Platzhaltern versehen und einmal kompiliert, danach wird dieses Statement wiederverwendet und nur noch mit Daten befüllt. Da die Daten nicht als String in das Query hineinkopiert werden ist es gegen Injektionen sicher.

Eines meiner geliebten SQL Konstrukte ist das IN Statement. Ein id IN (1,2) ist gleichbedeutend mit id = 1 OR id = 2 und auch sonst sehr praktisch.

Leider ist IN anfällig auf Injektionen, weil ich z.b. implode(',', array) benutzen muss. Dabei muss ich selbst sicherstellen, dass Array nur Zahlen enthält. Schwieriger wird es, wenn das Array Strings enthalten soll. Dann muss ich mich weiterhin mit Escapes rumschlagen. Möglicherweise wird es dadurch unsicherer gegenüber Injektionen und der Geschwindigkeitsgewinn von prepared Statements geht auch verloren, denn jedes Query muss einzeln ausgewertet werden.

Gibt es denn eine Möglichkeit irgendwie Arrays an prepared Statements zu übergeben, damit diese mit IN genutzt werden können? Ich hätte dabei an folgendes gedacht:

$stmt = Core::$db->prepare('SELECT user_id, nick FROM '.Core::$db->pref.'user WHERE user_id IN (:ids);');
$stmt->bindValue(':ids', array(1, 5), PDO::PARAM_INT);
$stmt->execute();

Leider funktioniert der Code aktuell nicht.


Comments


Write comment

You need to sign in first.