一尘不染

使用PDO匹配数据库中的行时出现问题

mysql

我希望获取行数以检查数据库中是否已存在相同的电子邮件。我尝试了几种机制,但没有成功。当我直接在数据库中运行查询时,它给了我行数,但是通过PDO执行它给了我0。

我已经使用了fetchAll方法来手动计数,甚至使用了行数方法也无法正常工作

  $sql = 'SELECT count(*) FROM inbox WHERE uid = "'.$email_number.'" AND from_email = "'.$email_f.'"'; 
  $result = $link->prepare($sql); 
  $result->execute(); 
  $number_of_rows = $result->fetchColumn();

这个$ email_f的问题是它包含html

SELECT count(*) FROM inbox WHERE uid = "6961" 
AND from_email = "abc Offers <abc@abcs.com>"

这是我从$ sql打印的查询,当我在phpmyadmin中直接在数据库中执行它时,它工作正常。给我3的数量,但通过执行我得到0。


阅读 237

收藏
2020-05-17

共1个答案

一尘不染

输入数据(或数据库)中很可能存在一些已转换或不可打印的字符。例如,可能存在换行符或特殊编码的符号,或某些字符(例如<>转换为HTML实体)。结果,查询包含<abc@abcs.com>将永远不会匹配text
&lt;abc@abcs.com&gt;

问题是,这只是一个猜测,没有人能告诉您实际的问题是什么,因为它是 您的 数据库, 您的 输入数据,只有 才能找到问题。

我写了一篇文章,解释了如何调试PDO问题

要调试特定问题,您需要

  • 确保同时为PDO和PHP启用了完整的错误报告。确实有帮助,向您显示偶发的印刷错误,拼写错误等
  • 仔细检查数据库中的数据和输入以发现差异。bin2hex()该功能将有助于显示数据库和输入中所有不可打印和转换的字符。

在一个侧面说明,但很重要的还是:你准备语句是一个货物邪教代码
保护什么 。它 必须 是这样的:

$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();
2020-05-17