2012-10-17 2 views
5

Ich versuche, eine Schlüsselwortsuche mit PDO vorbereiteten Anweisungen zu schreiben. Im Idealfall möchte ich den LIKE-Operator verwenden, um innerhalb des Feldwerts nach einer Teilzeichenfolge zu suchen. Hier ist mein Code:Verwenden des LIKE-Operators mit% für eine Schlüsselwortsuche mit vorbereiteten PDO-Anweisungen

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

Leider ist $ Zeilen immer leer, wenn ich dies versuche. Wenn ich jedoch die SQL in phpMyAdmin kopiere und für jedes der? Symbole, es funktioniert gut (ich bekomme Ergebnisse, wenn das verwendete Schlüsselwort existiert).

Ich habe auch versucht, den folgenden Code:

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

ich in einer anderen Frage gelesen hatte, die Sie angeblich das% enthält, wenn die Parameter zu binden, nicht in dem SQL selbst (pre-prepared Statements), aber das funktioniert nicht.

Ich könnte einfach nur das Schlüsselwort direkt in das SQL einfügen (nachdem ich eine Bereinigung vorgenommen habe), aber ich möchte bei den vorbereiteten Anweisungen bleiben. Jede Hilfe würde sehr geschätzt werden.

+1

Nur ein kurzer Schein und das funktioniert gut (PHP 5.3.5) ~ Sie möchten definitiv Ihre '%' beim Binden von Werten hinzufügen. Vielleicht Probleme mit Ihrem $ titleKeyword & $ authorKeyword? – TerryProbert

+0

Leider nein. Ich habe das überprüft, bevor ich hier gepostet habe. – Randy

Antwort

3

Das funktioniert für mich:

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

Welche PHP-Version verwenden Sie?

+0

Ich benutze 5.3.1. Sogar einige Kommentare zu den PHP-Dokumenten für PDOStatement schlagen vor, eine dieser beiden Methoden zu verwenden. – Randy

+1

Überprüfen Sie Ihre Variablen $ titleKeyword und $ authorKeyword (verwenden Sie '' 'var_dump'''!) – steffen

+0

Bereits getan (dies ist in einer Version, in der ich die Variablen ändern% vor und nach dem Aufruf binValue): Zeichenfolge (6) "% iPod%" string (6) "% iPod%" – Randy

2

Danke Steffen und Terry für die Hilfe.

Ich löste das Problem selbst, indem ich zu bindParam() statt bindValue() wechselte. Ich bin nicht sicher, warum ich es nicht mit bindValue() tun konnte, aber im Moment bin ich einfach zu müde, um mich darum zu kümmern.

+0

Froh, dass Sie es herausgefunden haben Randy! weitere Lektüre; http://stackoverflow.com/questions/1179874/pdo-bindparam-versus-bindvalue – TerryProbert