2011-08-31 17 views
15

Sto cercando di cercare il campo name nel mio database utilizzando LIKE. Se ordino l'SQL "a mano" in questo modo:Utilizzo dei parametri denominati con PDO per LIKE

$query = "SELECT * \n" 
     . "FROM `help_article` \n" 
     . "WHERE `name` LIKE '%how%'\n" 
     . ""; 
$sql = $db->prepare($query); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$sql->execute(); 

Quindi restituirà risultati rilevanti per "come".
Tuttavia, quando mi rivolgo in una dichiarazione preparata:

$query = "SELECT * \n" 
     . "FROM `help_article` \n" 
     . "WHERE `name` LIKE '%:term%'\n" 
     . ""; 
$sql->execute(array(":term" => $_GET["search"])); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$sql->execute(); 

sto ottenendo sempre risultati zero.

Cosa sto sbagliando? Sto usando le dichiarazioni preparate in altri posti nel mio codice e funzionano bene.

+0

possibile duplicato di [Istruzione preparazione PDO non elaborazione parametri] (http://stackoverflow.com/questions/2434560/pdo-prepare-statement-not-processing-parameters) – outis

risposta

27

Il limite :placeholders non deve essere racchiuso tra virgolette singole. In questo modo non verranno interpretati, ma trattati come stringhe non elaborate.

Quando si desidera utilizzare uno come LIKE modello, quindi passare il % insieme al valore:

$query = "SELECT * 
      FROM `help_article` 
      WHERE `name` LIKE :term "; 

$sql->execute(array(":term" => "%" . $_GET["search"] . "%")); 

Oh, e in realtà è necessario pulire la stringa di input prima qui (addcslashes). Se l'utente fornisce caratteri estranei % all'interno del parametro, diventano parte del modello di corrispondenza LIKE. Ricordare che l'intero parametro :term viene passato come valore stringa e tutti i % s all'interno di tale stringa diventano segnaposto per la clausola LIKE.

+2

[Escaping in SQL standard] (http://drupal.org/node/654662) non è così semplice. in PL/SQL e Transact SQL, ad esempio, devi fornire il carattere da utilizzare come carattere di escape. – jswolf19

+0

@ jswolf19: Non ero nemmeno sicuro di eseguire l'escape in MySQL e di solito preferisco eliminare tutti i caratteri non alfanumerici. (Potrebbe essere sufficiente anche per OP.) – mario

+0

Penso che MySQL sia impostato su '\', ma OP non specifica un DB e SQL standard non specifica un carattere di escape predefinito. Devi fornirlo con la sintassi 'a LIKE b ESCAPE c'. – jswolf19

Problemi correlati