2009-07-07 9 views
4

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.

Antwort

3

Ich bin Doctrine_RawSql nicht ganz vertraut, aber ein Platzhalter sollte für sich allein sein, nicht "?%", Nur? und fügen Sie% für die Variable hinzu, die Sie übergeben. Werfen Sie einen Blick auf example #6.

+0

Danke für den Rat. Ich habe die Platzhalterzeichenfolge korrigiert. Das ursprüngliche Problem bleibt jedoch bestehen. –

+1

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. –

Verwandte Themen