2012-10-17 9 views
5

Sto tentando di scrivere una ricerca per parole chiave utilizzando istruzioni preparate PDO. Idealmente, mi piacerebbe utilizzare l'operatore LIKE per cercare una sottostringa all'interno del valore del campo. Ecco il mio codice:Utilizzo dell'operatore LIKE con% per una ricerca di parole chiave con istruzioni preparate PDO

$statement = $this->db->prepare("select * from whatever where title like ? or author like ?"); 
$statement->execute(array("%$titleKeyword%","%$authorKeyword%")); 
$rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

Sfortunatamente, $ file è sempre vuoto quando provo questo. Tuttavia, se copio l'SQL in phpMyAdmin e sostituisco '% keyword%' per ognuno dei? simboli, funziona bene (ottengo risultati quando esiste la parola chiave utilizzata).

Ho anche provato il seguente codice:

$statement = $this->db->prepare("select * from whatever where title like :titleKeyword or author like :authorKeyword"); 
$statement->bindValue(":titleKeyword", '%'.$titleKeyword.'%', PDO::PARAM_STR); 
$statement->bindValue(":authorKeyword", '%'.$authorKeyword.'%', PDO::PARAM_STR); 
$statement->execute(); 
$rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

avevo letto in un'altra domanda che si suppone di includere l'% durante l'associazione dei parametri, non nel SQL stesso (dichiarazione pre-preparati), ma quello non funziona.

Potrei ricorrere semplicemente all'inserimento della parola chiave direttamente nell'SQL (dopo aver effettuato un po 'di disinfezione), ma voglio attenermi alle dichiarazioni preparate. Qualsiasi aiuto sarebbe molto apprezzato.

+1

Ho appena fatto un rapido scherzo a questo e lavorando bene (PHP 5.3.5) ~ Sicuramente vuoi aggiungere il tuo '%' quando leghi i valori. Forse problemi con il tuo $ titleKeyword e $ authorKeyword? – TerryProbert

+0

Purtroppo no. Ho controllato quelli prima di postare qui. – Randy

risposta

3

Questo in realtà funziona per me:

$stmt = $pdo->prepare("select * from t where c like ?"); 
$stmt->execute(array("70%")); 
print_r($stmt->fetchAll()); 

Quale versione di PHP si usa?

+0

Sto usando 5.3.1. Anche alcuni commenti sui documenti PHP per PDOStatement suggeriscono di utilizzare uno di questi due metodi. – Randy

+1

Controlla le tue variabili $ titleKeyword e $ authorKeyword (usa '' 'var_dump'''!) – steffen

+0

Già fatto (questo è in una versione in cui modifico i vars per avere% prima e dopo prima chiamo bindValue): stringa (6) "% iPod%" string (6) "% iPod%" – Randy

2

Grazie Steffen e Terry per l'aiuto.

Alla fine ho risolto il problema passando a bindParam() anziché a bindValue(). Non sono sicuro del perché non potrei farlo con bindValue(), ma in questo momento sono troppo stanco per preoccuparmi.

+0

Contento che tu l'abbia capito Randy! ulteriori letture; http://stackoverflow.com/questions/1179874/pdo-bindparam-versus-bindvalue – TerryProbert