数据库中的匹配行有问题

问题描述 投票:0回答:1

我正在寻找行数来检查相同的电子邮件是否已经在数据库中。我尝试了几种机制但没有成功。当我直接在数据库中运行我的查询时,它会给我行数,但是通过 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.

php mysql pdo
1个回答
6
投票

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

SQL错误引起的问题

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

条件引起的问题

检查您的条件。有互斥条件,比如

WHERE col=1 AND col=2
。它永远不会返回任何行。尝试简化条件,直到它开始返回一些行,然后优化条件以获得所需的结果。


但是没问题,没有错误,条件是正确的,你可以发誓表中有符合你查询的数据。尽管如此,还是有一些陷阱:

数据引起的问题

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

然后检查值本身。输入数据(或数据库)中可能存在一些已转换或不可打印的字符。例如换行符或特殊编码的符号,或一些字符如

<
>
转换为HTML实体。因此,包含
<[email protected]>
的查询永远不会匹配文本
&lt;[email protected]&gt;
.

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

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

要调试特定问题,您需要

  • 确保为 PDO 和 PHP 启用了完整的错误报告。它真的很有帮助,向您展示偶尔出现的印刷错误、拼写错误等
  • 仔细检查数据库中的数据和输入以找出差异。
    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(); 
© www.soinside.com 2019 - 2024. All rights reserved.