与数据库中的行匹配时出现问题

Having issue with matching rows in the database

提问人:khattak 提问时间:9/18/2019 最后编辑:Your Common Sensekhattak 更新时间:8/28/2023 访问量:1108

问:

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

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

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

问题出在这个 $email_f,它包含 html

SELECT count(*) FROM inbox WHERE uid = "6961" 
AND from_email = "abc Offers <[email protected]>"

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

php mysql pdo

评论

0赞 Dark Knight 9/18/2019
你得到了什么错误?
0赞 khattak 9/18/2019
执行 PDO->execute 时,我在 fetch 中没有收到任何数据;但是,如果我在phpmyadmin中运行打印的查询,它会给我3行的输出。
0赞 Dark Knight 9/18/2019
好的,我会发布一个答案,作为 PHP.net 网站中的示例。让我们看看它是如何工作的。
0赞 Nathaniel Granor 9/18/2019
在同一应用程序中,您是否还有其他查询正在返回 php 文件中预期的数据?另外,当您尝试直接在phpMyAdmin中运行查询时,您是复制并粘贴$sql变量的输出还是手动重新键入它?如果 $email_f 的内容应该是 HTML,是否有可能存在编码问题?

答:

7赞 Your Common Sense 9/18/2019 #1

首先,你必须接受这样一个事实:如果你的查询没有找到行,这意味着没有匹配项,即使你可以发誓数据没问题。当查询不返回任何行时,则没有与条件匹配的行。所以你必须找出 - 为什么。但首先,您需要确保查询没问题:

SQL错误导致的问题

首先,您需要确保查询实际运行时没有错误,因为“无结果”可能意味着查询中存在错误。有关详细信息,请参阅以下答案:pdomysqli

如果错误显示“没有这样的表/数据库”,请参阅下面的“连接凭据”情况。

由病情引起的问题

检查您的条件。存在相互排斥的条件,例如 。它永远不会返回任何行。尝试简化条件,直到它开始返回一些行,然后优化条件以获得所需的结果。WHERE col=1 AND col=2


但没关系,没有错误,条件是正确的,你可以发誓表中有数据与你的查询相匹配。尽管如此,还是有一些陷阱:

数据引起的问题

首先,如果涉及变量,请确保它存在并且实际上包含一些值。

然后检查值本身。输入数据(或数据库)中可能存在一些已转换或不可打印的字符。例如,换行符或特殊编码的符号,或某些字符,例如并转换为 HTML 实体。因此,查询包含永远不会与文本匹配。为了快速检查,您可以使用函数,它会将所有非拉丁字符转换为代码,从而使它们可见。<><[email protected]>&lt;[email protected]&gt;rawurlencode()

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

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

要调试特定问题,您需要

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

连接凭据导致的问题

另一个常见的问题是,当您有多个数据库并连接到没有请求数据的错误数据库时。这个问题与问题类似,因此只需遵循相同的例程,仅检查表列表,而是检查数据行。

字符集/编码引起的问题

这是一个罕见的情况,但可以肯定的是,请按照这个伟大答案中的清单进行操作

评论

0赞 khattak 9/19/2019
我自己解决了这个问题,问题与您上面解释的问题相同,我正在将一些字符(例如<和>转换为HTML实体。我删除了那部分,它起作用了。关于代码,我理解你提到的方式,应该是这样的。我确实按照自己的方式更改了它,因为我想打印带有值的查询,以便直接在数据库中测试它。