Maison >développement back-end >tutoriel php >Pourquoi est-ce que j'obtiens des résultats nuls lorsque j'utilise des instructions préparées PHP PDO avec des requêtes MySQL LIKE ?

Pourquoi est-ce que j'obtiens des résultats nuls lorsque j'utilise des instructions préparées PHP PDO avec des requêtes MySQL LIKE ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-30 19:11:30412parcourir

Why Am I Getting Null Results When Using PHP PDO Prepared Statements with MySQL LIKE Queries?

Instruction préparée PHP PDO Requête MySQL LIKE : résoudre les résultats nuls

Dans MySQL, une opération courante consiste à interroger des données à l'aide d'une clause LIKE pour effectuer recherches par caractères génériques. Lorsque vous utilisez la classe PDO de PHP avec MySQL, il est essentiel de comprendre comment créer correctement ces requêtes pour éviter les résultats nuls.

Examinons un scénario dans lequel une requête LIKE ne renvoie pas de résultats via la classe PDO. La requête d'origine dans le client MySQL est :

<code class="sql">SELECT    hs.hs_pk, 
          hs.hs_text, 
          hs.hs_did, 
          hd.hd_did, 
          hd.hd_text, 
          hv.hv_text, 
          hc.hc_text 
FROM      hs 
LEFT JOIN hd 
 ON       hs.hs_did = hd.hd_did 
LEFT JOIN hd 
 ON       hd.hd_vid = hv.hv_id 
LEFT JOIN hc 
 ON       hd.hd_pclass = hc.hc_id
WHERE     hs.hs_text LIKE "%searchTerm%"
LIMIT 25;</code>

Cette requête exploite l'opérateur LIKE pour rechercher toutes les lignes où la colonne hs.hs_text contient le terme de recherche dans sa valeur. Cependant, lorsque cette requête est traduite dans la classe PDO de PHP, elle ne renvoie aucun résultat.

<code class="php">$sql = 
'SELECT   hs.hs_pk, 
          hs.hs_text, 
          hs.hs_did, 
          hd.hd_did, 
          hd.hd_text, 
          hv.hv_text, 
          hc.hc_text 
FROM      hs 
LEFT JOIN hd 
 ON       hs.hs_did = hd.hd_did 
LEFT JOIN hd 
 ON       hd.hd_vid = hv.hv_id 
LEFT JOIN hc 
 ON       hd.hd_pclass = hc.hc_id
WHERE     hs.hs_text LIKE :searchTerm
LIMIT 25';

$ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));</code>

Le problème dans le code PHP est la présence de guillemets doubles autour du terme de recherche dans la clause WHERE. Les instructions préparées en PHP ne nécessitent pas de guillemets lors de la liaison des valeurs. Les guillemets ne sont nécessaires que lorsque les valeurs de chaîne sont directement intégrées dans la requête elle-même.

Pour résoudre le problème, supprimez simplement les guillemets doubles du paramètre searchTerm :

<code class="php">$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));</code>

Cette modification autorise le PDO pour lier correctement la valeur searchTerm à la requête, ce qui produira les résultats attendus.

Les instructions préparées offrent une sécurité et une efficacité accrues en séparant les données de la requête. Ils empêchent les vulnérabilités d'injection SQL et optimisent l'exécution des requêtes en permettant à la base de données de gérer le processus de liaison. Comprendre comment utiliser correctement les requêtes LIKE avec la classe PDO de PHP est essentiel pour une récupération efficace des données des bases de données MySQL.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn