2010-06-24 10 views
10

Sto imparando le corde con DOP.Parametri POS e denominati PDO come parte della stessa query preparata?

Ecco il mio sql (il numero di parametri che possono apparire nel WHERE è variabile).

SELECT 
     ID, title 

    FROM 
     table 

    WHERE 
     something = ? 

    ORDER BY 
     :sort :dir 

    LIMIT 
     :start, :results 

Ecco il mio codice:

 $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(); 

... e qui è l'eccezione che esso genera:

Invalid parameter number: mixed named and positional parameters 

E 'impossibile conciliare i parametri posizionali e denominati nella stessa interrogare? O mi sta sfuggendo qualcosa?

Grazie!

+0

Non sono sicuro di 'LIMIT', ma' ORDER BY' non accetta parametri, almeno non nella versione di PHP che sto usando (5.2.9) – jeroen

+0

MySQL non accetterà * valori quotati * per le clausole 'LIMIT' e' ORDER BY', che è ciò che accadrà quando quei segnaposto vengono sostituiti. Non è un problema di PHP ... e tipo di rende la tua domanda discutibile. – Charles

risposta

9

Sì, è impossibile.

PDO.prepare

Non è possibile utilizzare entrambi i marcatori di nome e di parametro punto di domanda all'interno della stessa istruzione SQL; scegli uno o l'altro stile di parametro.

+1

Ok grazie per le informazioni. Considerando che ho un numero variabile di parametri, è quindi impossibile legare le variabili alle clausole ORDER BY e LIMIT? (Come ho capito, puoi farlo solo con parametri con nome. Ma i parametri con nome non si prestano a situazioni con un numero sconosciuto di parametri.) – Travis

+1

Non puoi associare nomi di colonne, quindi non puoi associare: ordina e : dir. Dare nomi a tutti i parametri. – Naktibalda

2

Utilizzare una funzione wrapper, è sufficiente una semplice funzione di sostituzione.

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); 
    } 
} 

Mescolare $ sort e $ dir direttamente nella query $ sql. Questi due sono identificativi SQL, non dati.

Problemi correlati