我正在寻找行数来检查相同的电子邮件是否已经在数据库中。我尝试了几种机制但没有成功。当我直接在数据库中运行我的查询时,它会给我行数,但是通过 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 <[email protected]>"
这是我从 $sql 打印的查询,当我直接在 phpmyadmin 的数据库中执行它时,它工作正常。给我数 3 但通过执行我得到 0.
首先,您必须接受一个事实:如果您的查询没有找到任何行,则意味着不匹配,即使您可以发誓数据是正确的。当查询没有返回任何行时,则没有匹配条件的行。所以你必须找出 - 为什么。但首先你需要确保你的查询是正确的:
首先,您需要确保您的查询实际运行没有错误,因为“无结果”可能意味着查询中有错误。有关详细信息,请参阅这些答案:pdo 和mysqli.
检查您的条件。有互斥条件,比如
WHERE col=1 AND col=2
。它永远不会返回任何行。尝试简化条件,直到它开始返回一些行,然后优化条件以获得所需的结果。
但是没问题,没有错误,条件是正确的,你可以发誓表中有符合你查询的数据。尽管如此,还是有一些陷阱:
首先,如果涉及变量,请确保它存在并且实际上包含一些值。
然后检查值本身。输入数据(或数据库)中可能存在一些已转换或不可打印的字符。例如换行符或特殊编码的符号,或一些字符如
<
和>
转换为HTML实体。因此,包含 <[email protected]>
的查询永远不会匹配文本 <[email protected]>
.
问题是,这只是一个猜测,没有人能告诉你实际问题是什么,因为它是 your 数据库,your 输入数据,只有 you 才能找到问题。
我写了一篇文章解释了如何调试你的 PDO 问题。
要调试特定问题,您需要
urlencode()
函数会有所帮助,在数据库和输入中显示所有不可打印和转换的字符。另一个常见的问题是,当您有多个数据库并连接到没有请求数据的错误数据库时。这个问题和这一个类似,所以照着套路走,只是不检查表的列表,而是检查数据行。
这是一个罕见的案例,但为了确定,请按照这个很好的答案
中的清单附带说明,但仍然非常重要:您准备的声明是 cargo cult code protects nothing。这是必须的样子:
$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();