2008-09-13 6 views
11

Der Versuch, diese Art der Sache zu tun ...Wie machen Sie unscharfe Suchen mit gebundenen Parametern in PDO?

WHERE username LIKE '%$str%' 

... aber mit gebundenen Parametern zu Prepared Statements in PDO. z.B .:

$query = $db->prepare("select * from comments where comment like :search"); 
$query->bindParam(':search', $str); 
$query->execute(); 

ich mit zahlreichen Permutationen von einfachen Anführungszeichen und% Zeichen und es ist nur immer Kreuz versucht haben.

Ich erinnere mich, dass ich mich daran erinnern konnte, aber ich kann keine Referenzen finden. Weiß jemand wie (wenn?) Sie können dies schön in PDO mit benannten Parametern tun?

Antwort

15

Ah. Ich habe einen Kommentar zu php.net gefunden, der mich an die Antwort erinnert hat. Sie müssen Ihren Wert mit einem Platzhalter versehen, bevor bindParam ausgewertet wird, und sich nicht darum kümmern, ihn zu zitieren. So zum Beispiel das funktioniert gut:

$str = "%$str%"; 
$query = $db->prepare("select * from comments where comment like :search"); 
$query->bindParam(':search', $str); 
$query->execute(); 
+0

Froh, dass Sie es gefunden haben. Ich habe es gerade neulich gefunden, auf der Suche nach dem gleichen Ding. Schade, dass du deine eigene Antwort nicht akzeptieren kannst! –

+1

Aha - Sie haben es behoben - Sie können jetzt Ihre eigene Antwort akzeptieren. Gut für die Verwendung von StackOverflow als Bibliothek – Polsonby

4

5 Jahre später, falls jemand stolpert auf diesem, gibt es eine alternative Methode, die ich entdeckt habe. Die akzeptierte Lösung war nicht wirklich möglich für meine Situation, aber diese Methode scheint auch die Aufgabe zu erledigen:

$query = $db->prepare("select * FROM table WHERE field LIKE CONCAT('%',:search,'%')"); 
$query->bindParam(':search', $str); 
$query->execute(); 

Ich bin nicht sicher, ob es eine Performance-Einbußen aufgrund der Overhead der des Aufrufs CONCAT Funktion, aber ich wollte dies als Option weitergeben. Hoffentlich wird es jemandem helfen.

+0

'$ query-> bindParam (': search',"% $ str% ");' war nicht machbar? Machst du Witze? –

+1

Haha, ja, der Code ist in einer Datenbankabstraktionsfunktion, die eine WHERE-Klausel aus Eingaben generiert. Diese Funktion hat keinen Zugriff auf die Parameterwerte, nur die Schlüssel. Es gibt wahrscheinlich einen besseren Weg, aber es funktioniert jetzt, also werde ich damit leben. –

+2

Down-Voting scheint ein bisschen hart. Es ist eine gültige Lösung für das Problem, nicht wahr? –