2010-06-24 11 views
10

Ich lerne mit PDO.PDO Positions- und benannte Parameter als Teil derselben vorbereiteten Abfrage?

Hier ist mein SQL (die Anzahl der Parameter, die in der WHERE-Variable angezeigt werden kann).

SELECT 
     ID, title 

    FROM 
     table 

    WHERE 
     something = ? 

    ORDER BY 
     :sort :dir 

    LIMIT 
     :start, :results 

Hier ist mein Code:

 $query = $conn->prepare($sql); 

     if ($parameters) { 

      $i = 0; 
      foreach ($parameters AS $parameter) { 

       $i++; 
       $query->bindParam($i, $parameter); 

      } 

     } 

     $query->bindParam(':start', $pagination['start'], PDO::PARAM_INT); 
     $query->bindParam(':results', $pagination['results'], PDO::PARAM_INT); 
     $query->bindParam(':sort', $pagination['sort']); 
     $query->bindParam(':dir', $pagination['dir']); 

     $query->execute(); 

... und hier ist die Ausnahme, dass es erzeugt:

Invalid parameter number: mixed named and positional parameters 

Ist es unmöglich, Lage- und benannte Parameter in der gleichen zu kombinieren Abfrage? Oder fehlt mir etwas?

Danke!

+0

Ich bin nicht sicher über 'LIMIT', aber' ORDER BY' akzeptiert keine Parameter, jedenfalls nicht in der von mir verwendeten Version von PHP (5.2.9) – jeroen

+0

MySQL akzeptiert keine * angegebenen Werte * für die Klauseln "LIMIT" und "ORDER BY", was passiert, wenn diese Platzhalter ersetzt werden. Es ist kein PHP-Problem ... und macht Ihre Frage strittig. – Charles

Antwort

9

Ja, es ist unmöglich.

PDO.prepare

Sie können nicht beide Namen und Fragezeichen Parametermarken innerhalb derselben SQL-Anweisung verwenden; Wählen Sie den einen oder anderen Parameter-Stil.

+1

Ok danke für die Info. Wenn ich eine variable Anzahl von Parametern habe, ist es dann unmöglich, Variablen an die ORDER BY- und LIMIT-Klauseln zu binden? (Wie ich es verstehe, können Sie dies nur mit benannten Parametern tun. Aber benannte Parameter eignen sich nicht für Situationen mit einer unbekannten Anzahl von Parametern.) – Travis

+1

Sie können keine Spaltennamen binden, so dass Sie nicht binden können: sort und : Richt. Geben Sie allen Parametern Namen. – Naktibalda

2

Verwenden Sie eine Wrapper-Funktion, eine naive Ersatzfunktion wird ausreichen.

if (strpos($sql, ":")) { 
    $i = -1; 
    while (strpos($sql, "?") && isset($parameters[++$i])) { 
     $parameters[":p$i"] = $parameters[$i]; 
     unset($parameters[$i]); 
     $sql = preg_replace("/[?]/", ":p$i", $sql, 1); 
    } 
} 

Mix $ Art und $ dir direkt in die $ SQL-Abfrage. Diese beiden sind SQL-Bezeichner, keine Daten.

Verwandte Themen