Problèmes de correspondance des lignes de base de données
P粉078945182
2023-08-13 16:46:45
<p>Je souhaite obtenir le nombre de lignes pour vérifier si le même e-mail existe déjà dans la base de données. J'ai essayé plusieurs mécanismes sans succès. Lorsque j'exécute la requête directement dans la base de données, elle me renvoie le nombre de lignes, mais l'exécution via PDO me renvoie 0. </p>
<p>J'ai utilisé la méthode fetchAll pour compter manuellement, et j'ai même utilisé la méthode rowCount, mais sans succès non plus. </p>
<pre class="brush:php;toolbar:false;">$sql = 'SELECT count(*) FROM inbox WHERE uid = ? AND from_email = ?';
$result = $link->prepare($sql);
$result->execute([$email_number,$email_f]);
$number_of_rows = $result->fetchColumn();</pre>
<p>Le problème vient de $email_f, qui contient du code HTML. </p>
<pre class="brush:php;toolbar:false;">SELECT count(*) FROM inbox WHERE uid = "6961"
AND from_email = "Offres abc <abc@abcs.com>"</pre>
<p>C'est l'instruction de requête que j'ai imprimée à partir de $sql, lorsque je l'exécute directement dans phpmyadmin, elle fonctionne bien et me renvoie 3 lignes, mais via l'exécution, elle me renvoie 0. </p>
Tout d'abord, vous devez accepter le fait que si votre requête ne trouve aucune ligne, cela signifie qu'il n'y a pas de correspondance, même si vous pouvez jurer que les données sont correctes. Lorsqu'une requête ne renvoie aucune ligne, aucune ligne ne correspond aux critères. Il faut donc découvrir pourquoi. Mais vous devez d'abord vous assurer que votre requête est correcte :
Problèmes causés par des erreurs SQL
Vous devez d'abord vous assurer que votre requête ne contient aucune erreur, car « aucun résultat » peut signifier qu'il y a une erreur dans la requête. Pour plus de détails, veuillez vous référer à ces réponses : pdo et mysqli.
Problèmes causés par les conditions
Vérifiez vos conditions. Il existe certaines conditions mutuellement exclusives, telles que
WHERE col=1 AND col=2
. Il ne renvoie jamais de lignes. Essayez de simplifier la condition jusqu'à ce qu'elle commence à renvoyer certaines lignes, puis affinez la condition pour obtenir les résultats souhaités.Mais bon, il n'y a pas d'erreurs, les conditions sont correctes et vous pourriez jurer qu'il y a des données dans le tableau qui correspondent à votre requête. Cependant, il reste encore quelques écueils :
Problèmes causés par les données
Tout d'abord, lorsqu'une variable est impliquée, assurez-vous qu'elle existe et qu'elle contient réellement une valeur.
Vérifiez ensuite la valeur elle-même. Il peut y avoir des caractères convertis ou non imprimables dans les données d'entrée (ou la base de données). Par exemple des sauts de ligne ou des symboles spécialement codés, ou certains caractères comme la fonction
<
和>
转换为HTML实体。结果是,查询包含<abc@abcs.com>
将永远不会匹配文本<abc@abcs.com>
。为了快速检查,你可以使用rawurlencode()
, qui convertit tous les caractères non latins en codes, les rendant ainsi visibles.Le problème est que ce n'est qu'une supposition, personne ne peut vous dire quel est le problème réel, car il s'agit de votre base de données, vos données d'entrée, et seul vous pouvez trouver le problème.
J'ai écrit un article expliquant comment déboguer vos problèmes PDO.
Pour déboguer un problème spécifique dont vous avez besoin :
urlencode()
vous aidera, elle affichera tous les caractères non imprimables et convertis dans la base de données et en entrée.Problèmes causés par les informations de connexion
Un autre problème courant est que lorsque vous avez plusieurs bases de données et que vous vous connectez à la mauvaise base de données, elle ne contient pas les données demandées. Cette question est similaire à cette question, alors suivez simplement les mêmes étapes pour vérifier, sauf qu'au lieu de vérifier une liste de tableaux, vous avez des lignes de données.
Problèmes causés par le jeu de caractères/encodage
C'est un cas rare, mais juste pour vous en assurer, vérifiez-le en suivant la liste de contrôle de cette Excellente réponse.