Maison >base de données >tutoriel mysql >Pourquoi ma déclaration préparée PHP PDO ne fonctionne-t-elle pas avec les requêtes MySQL LIKE ?
Lorsque vous travaillez avec la classe PDO de PHP (pilote MySQL), l'exécution d'une requête MySQL LIKE à l'aide d'une instruction préparée peut être une tâche embarrassante. La syntaxe apparemment simple ne parvient souvent pas à produire le résultat souhaité.
Considérez la requête suivante qui récupère des données de manière transparente à l'aide du client MySQL :
SELECT ... FROM hs ... WHERE hs.hs_text LIKE "%searchTerm%" LIMIT 25;
L'énigme
Cependant, lors du portage de cette requête vers PHP, vous pourriez rencontrer la frustration de ne pouvoir renvoyer aucun résultat, quelle que soit la syntaxe que vous essayez. Le code ci-dessous illustre ce problème :
$sql = 'SELECT ... FROM hs ... WHERE hs.hs_text LIKE :searchTerm LIMIT 25'; $prep = $dbh->prepare($sql); $ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));
Tentatives de fournir le terme de recherche sous la forme CONCAT('%', ?, '%'), "%:searchTerm%" ou ":searchTerm", tandis que modifier la ligne d'exécution en conséquence s'avère futile.
La solution
La clé pour résoudre cette énigme consiste à comprendre comment les instructions préparées gèrent les données. Ils transmettent les données séparément de la requête, éliminant ainsi le besoin de guillemets lors de l'intégration de valeurs.
Par conséquent, la bonne solution est :
$prep = $dbh->prepare($sql); $ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));
En supprimant les guillemets doubles englobants du paramètre de terme de recherche , vous exploitez désormais la puissance des instructions préparées, vous permettant d'exécuter avec succès votre requête LIKE.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!