使用 PDO 匹配数据库中的行时遇到问题

Posted

技术标签:

【中文标题】使用 PDO 匹配数据库中的行时遇到问题【英文标题】:Having issue with matching rows in the database using PDO 【发布时间】:2020-03-12 13:56:56 【问题描述】:

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

我使用了 fetchAll 方法手动计数,甚至使用了也不起作用的 rowCount 方法

  $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。

【问题讨论】:

你遇到了什么错误? 我在执行 PDO->execute 时没有获取任何数据;但如果我在 phpmyadmin 中运行打印的查询,它会给我 3 行的输出。 好的,我将发布一个答案,该答案在 PHP.net 站点中作为示例给出。让我们看看它是如何工作的。 您在同一个应用程序中是否还有其他查询正在按预期返回您的 php 文件中的数据?此外,当您尝试直接在 phpMyAdmin 中运行查询时,您是复制并粘贴 $sql 变量的输出还是手动重新键入它?如果 $email_f 的内容预计是 HTML,您是否可能遇到编码问题? 【参考方案1】:

数据引起的问题

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

问题是,这只是一个猜测,没有人能告诉你真正的问题是什么,因为它是你的数据库,你的输入数据并且只有您可以找到问题。

我写了一篇解释how to debug your PDO issues的文章。

要调试特定问题,您需要

确保为 PDO 和 PHP 启用完整的错误报告。它真的很有帮助,向您显示偶尔的印刷错误、拼写错误等 检查数据库中的数据和输入以找出差异。 bin2hex() 函数会有所帮助,在数据库和输入中显示所有不可打印和转换的字符。

连接凭据引起的问题

另一个常见问题是当您有多个数据库并连接到没有请求数据的错误数据库时。这个问题和this one类似,同样的套路,只是检查的不是表列表而是数据行。

不相关但重要的说明

附带说明,但非常重要:您准备好的声明是cargo cult code,它不保护任何内容。以下是它必须的样子:

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

【讨论】:

我自己解决了这个问题,问题和你上面解释的一样,我正在将一些字符,如 转换为 HTML 实体。我删除了那部分并且它起作用了。关于我理解你提到的方式的代码,它应该是这样的。我确实将其更改为我的方式,因为我想打印带有值的查询以直接在数据库中测试它。

以上是关于使用 PDO 匹配数据库中的行时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式匹配日志文件行时的可选字段

使用 PDO 从数据库回显单行时出错

symfony2 中的 MySQL (PDO) 出错:驱动程序中发生异常:SQLSTATE [HY000] [1049]

从服务器删除行时遇到问题

写 一个PHP脚本遇到的问题总结

如何使用 PHP PDO 解析 MySQL 数据库中的对象数据?