我希望获取行数来检查数据库中是否已存在相同的电子邮件。我尝试了几种机制但没有成功。当我直接在数据库中运行查询时,它会给出行数,但通过 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"
这是我从 $sql 打印的查询,当我直接在 phpmyadmin 的数据库中执行它时,它工作正常。给我数 3,但通过执行我得到 0。
首先,您必须接受这样一个事实:如果您的查询没有找到任何行,则意味着没有匹配,即使您可以发誓数据是正确的嗯>。当查询未返回任何行时,则表示没有与条件匹配的行。所以你必须找出 - 为什么。但首先您需要确保您的查询正确:
SQL错误导致的问题
首先,您需要确保您的查询实际上运行时没有错误,因为“无结果”可能意味着查询中存在错误。有关详细信息,请参阅这些答案:pdo和mysqli。
状况引起的问题
检查您的条件。存在互斥条件,例如
WHERE col=1 AND col=2
。它永远不会返回任何行。尝试简化条件,直到它开始返回一些行,然后细化条件以获得所需的结果。但是好吧,没有错误,条件正确,并且您可以发誓表中的数据与您的查询相匹配。尽管如此,仍然存在一些陷阱:
数据引起的问题
首先,如果涉及变量,请确保它存在并且实际上包含一些值。
然后检查值本身。输入数据(或数据库)中可能存在一些转换后的或不可打印的字符。例如换行符或特殊编码的符号,或转换为 HTML 实体的某些字符,例如
和
的查询永远不会匹配文本
。为了快速检查,您可以使用
>
。因此,包含rawurlencode()
函数,它将所有非拉丁字符转换为代码,从而使它们可见。问题是,这只是一个猜测,没有人可以告诉您实际问题是什么,因为它是您的数据库、您输入数据并且只有您可以找到问题。
我写了一篇文章,解释了如何调试 PDO 问题。
要调试特定问题,您需要
urlencode()
函数会有所帮助,显示数据库和输入中的所有不可打印和转换的字符。连接凭据导致的问题
另一个常见问题是当您有多个数据库并连接到不包含所请求数据的错误数据库时。这个问题与这个问题类似,所以只需遵循相同的例程即可,只检查数据行而不是表列表。
字符集/编码引起的问题
这是一种罕见的情况,但为了确保万无一失,请按照此很好的答案中的清单进行操作