Hallo Comunity,
ich hatte versucht eine SELECT-Abfrage mit einem IN-Parameter aus einem Array zu erstellen und bin erst einmal gescheitet. Hier ein Beispiel was ich meine:
PHP-Code:
$citys = array("Bonn", "Kiel", "Berlin");
$this->Database->prepare("SELECT * FROM table WHERE city IN (?)")
->execute($citys);
Gehofft hatte ich, dass damit ein
Code:
SELECT * FROM table WHERE city IN ("Bonn", "Kiel", "Berlin")
damit entsteht.
Die Profis werden schon erkennen, dass mir die Database::escapeParams() diese Idee durch ein simples serialize() verhagelt hat.
Da ich aber gene mal ein IN-Statement in SQL-Querys verwende, hätte ich folgenden Vorschlag, den ich gerne durch eure Meinung abgesichert hätte. Ist ja immerhin eine wichtige Funktion um SQL-Injections zu verhindern.
Meine Idee ist, da Arrays und Objects per serialize behandelt werden, eine spezielle Klasse für ein Array von Parametern zu definieren. Wird dieses dann erkannt, werden die einzelnen Parameter per escape behandelt und dann mit Kommas verknüpft.
PHP-Code:
class DBParamArray { // special class which will not serialize
public $Array;
protected function __construct($Array)
{ $this->$Array = $Array; }
}
Database::escapeParams()
{
//[..] Anfang unverändert
case 'object':
if ($arrParams[$k] instanceof DBParamArray)
{
$arrParam[$k] = implode(",", $this->escapeParams($arrParam[$k]));
break;
}
$arrParams[$k] = $this->string_escape(serialize($v));
break;
//[..] Ende unverändert
}
Damit sollte es doch möglich sein mit folgendem Aufruf:
PHP-Code:
->execute(new DBParamArray($Citys));
aus obigem Beispiel eine Parameterliste sauber durch die vorhandenen Funktionen aufbereiten lassen zu können.
Jeder einzelen Wert aus dem Array wird dann per escapeParam bearbeitet und die Änderung sollte auch abwärtskompatibel sein.
Wie seht ihr das?
Oder gibt es schon eine Möglichkeit für mein Problem, das ich leider nicht gefunden hatte?
PS: Gibt es vielleicht noch andere Abfragearten, bei denen ein Array mit Parametern übergeben werden soll, dass dann nicht mit einem Komma aneinander gehängt werden soll?
Lesezeichen