Lehre raw SQL und vorbereitete Anweisungen
Frage
Ich habe eine Doctrine_RawSql Abfrage mit Prepared Statements bekommt. Allerdings scheinen sie ignoriert werden, wenn die SQL-Abfrage generiert wird. Aber wenn ich die Tokenwerte auslassen, erhalte ich eine Ausnahme über die Anzahl der gebundenen Variablen nicht passend (so ist es zumindest zu versuchen, sub sie in).
Wenn ich diese Werte inline umfassen, ist Lehre etwas hinter den Kulissen tun SQL-Injection zu verhindern?
Hier ist mein Code:
public function sortedPhotogsByLocation($location)
{
$q = new Doctrine_RawSql();
$result = $q->select('{p.*}')
->from('photographers p')
->addComponent('p', 'Photographer')
->where('p.city_id = ?', $location->id)
->orderBy('CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname ASC', $location->photographer_sort)
->execute();
return $result;
}
Dies liefert die folgende SQL-Ausgabe:
SELECT *
FROM photographers p
WHERE p.city_id = ?
ORDER BY
CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname
ASC
EDIT: Die Eigenschaften auf $location
werden richtig eingestellt. Wenn ich hart codieren die Parameter:
->where('p.city_id = ?', 5)
Ich begegne das gleiche Problem mit den Token nicht ersetzt werden.
Lösung
Ich bin nicht ganz vertraut mit Doctrine_RawSql, sondern ein Platzhalter sollte einfach von selbst, nicht? „%“, Sein? und fügen Sie das% auf der Variable, die Sie übergeben. Schauen Sie sich auf Beispiel # 6 .