2008-09-13 5 views
11

Essayer de faire ce genre de chose ...Comment faites-vous des recherches floues en utilisant des paramètres liés dans PDO?

WHERE username LIKE '%$str%' 

... mais en utilisant des paramètres liés aux états préparés en AOP. .: par exemple

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

J'ai essayé de nombreuses permutations de guillemets simples et signes% et il est juste de croix avec moi.

Il me semble me souvenir d'avoir lutté avec ça à un moment donné mais je ne trouve aucune référence. Est-ce que quelqu'un sait comment (si?) Vous pouvez le faire joliment dans PDO avec des paramètres nommés?

Répondre

15

Ah. J'ai trouvé un commentaire sur php.net qui m'a rappelé la réponse; vous avez besoin de joker votre valeur avant que le bindParam soit évalué, et ne vous inquiétez pas de le citer. Ainsi, par exemple, cela fonctionne très bien:

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

Content que vous l'ayez trouvé. Je l'ai trouvé l'autre jour aussi, en cherchant la même chose. Dommage que vous ne pouvez pas accepter votre propre réponse! –

+1

Aha - ils l'ont réparé - vous pouvez maintenant accepter votre propre réponse. Bon pour l'utilisation de StackOverflow en tant que bibliothèque – Polsonby

4

5 ans plus tard, au cas où quelqu'un d'autre tombe sur cela, il y a une autre méthode que je l'ai découvert. La solution retenue était pas vraiment possible pour ma situation, mais cette méthode semble faire le travail aussi bien:

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

Je ne sais pas s'il y aura une baisse de performance en raison de la surcharge d'appeler la CONCAT fonction, mais je voulais passer cela en option. J'espère que cela aidera quelqu'un.

+0

'$ query-> bindParam (': search',"% $ str% ");' n'était pas réalisable? Tu plaisantes? –

+1

Haha, oui, le code est dans une fonction d'abstraction de base de données qui génère une clause WHERE à partir des entrées. Cette fonction n'a pas accès aux valeurs des paramètres, seulement les clés. Il y a probablement une meilleure façon de le faire, mais ça marche pour l'instant, donc je vais vivre avec. –

+2

Le vote vers le bas semble un peu dur. C'est une solution valable au problème n'est-ce pas? –

Questions connexes