Ich habe eine Doctrine_RawSql Abfrage mit vorbereiteten Anweisungen. Sie scheinen jedoch ignoriert zu werden, wenn die SQL-Abfrage generiert wird. Aber wenn ich die Token-Werte weglasse, bekomme ich eine Ausnahme bezüglich der Anzahl der gebundenen Variablen, die nicht übereinstimmen (also versuche ich zumindest, sie unterzuordnen).Doctrine Raw SQL und vorbereitete Anweisungen
Wenn ich diese Werte inline einschließe, macht Doctrine irgendetwas hinter den Kulissen, um die SQL-Injektion 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
richtig eingestellt werden. Wenn ich die Parameter fest codiere:
->where('p.city_id = ?', 5)
Ich habe das gleiche Problem mit den Token nicht ersetzt werden.
Danke für den Rat. Ich habe die Platzhalterzeichenfolge korrigiert. Das ursprüngliche Problem bleibt jedoch bestehen. –
Es stellte sich heraus, dass Sie richtig waren. Das Reparieren der Platzhalterzeichenfolge löste das Problem. Meine ursprüngliche Frage war fehlgeleitet. Doctrine erzeugte das SQL korrekt. Die Token-Ersetzung wurde jedoch auf der PDO-Ebene durchgeführt, sodass Doctrine die letzte SQL-Zeichenfolge nicht ausspuckte. –