数据库行匹配问题的挑战
P粉078945182
2023-08-13 16:46:45
<p>我想要获取行数来检查数据库中是否已经存在相同的电子邮件。我尝试了几种机制,但都没有成功。当我直接在数据库中运行查询时,它会给我返回行数,但是通过PDO execute却给我返回0。</p>
<p>我已经使用了fetchAll方法手动计数,甚至使用了rowCount方法,但也没有成功。</p>
<pre class="brush:php;toolbar:false;">$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();</pre>
<p>问题出在这个$email_f上,它包含HTML代码。</p>
<pre class="brush:php;toolbar:false;">SELECT count(*) FROM inbox WHERE uid = "6961"
AND from_email = "abc Offers <abc@abcs.com>"</pre>
<p>这是我从$sql中打印出的查询语句,当我在phpmyadmin中直接执行它时,它可以正常工作,给我返回3行,但是通过execute却给我返回0。</p>
首先,你必须接受这个事实:如果你的查询没有找到任何行,那就意味着没有匹配,即使你可以发誓数据是正确的。当查询返回没有行时,就没有行与条件匹配。所以你必须找出原因。但首先你需要确保你的查询是正确的:
由SQL错误引起的问题
首先你需要确保你的查询实际上没有错误,因为“没有结果”可能意味着查询中有错误。有关详细信息,请参考这些答案:pdo和mysqli。
由条件引起的问题
检查你的条件。有一些互斥的条件,比如
WHERE col=1 AND col=2
。它永远不会返回任何行。尝试简化条件,直到它开始返回一些行,然后细化条件以获得所需的结果。但是好吧,没有错误,条件是正确的,你可以发誓表中有数据与你的查询匹配。然而,还是有一些陷阱:
由数据引起的问题
首先,在涉及到变量的情况下,确保它存在并且实际上包含一些值。
然后检查值本身。输入数据(或数据库)中可能存在一些转换或不可打印的字符。例如换行符或特殊编码的符号,或一些字符如
<
和>
转换为HTML实体。结果是,查询包含<abc@abcs.com>
将永远不会匹配文本<abc@abcs.com>
。为了快速检查,你可以使用rawurlencode()
函数,它会将所有非拉丁字符转换为代码,从而使它们可见。问题是,这只是一个猜测,没有人能告诉你实际的问题是什么,因为这是你的数据库,你的输入数据,只有你能找到问题。
我写了一篇文章,解释了如何调试你的PDO问题。
要调试特定的问题,你需要:
urlencode()
函数会有所帮助,它会显示数据库和输入中的所有不可打印和转换字符。由连接凭据引起的问题
另一个常见问题是当你有多个数据库并连接到错误的数据库时,它没有所请求的数据。这个问题类似于这个问题,所以只需按照相同的步骤进行检查,只不过不是检查表的列表而是数据行。
由字符集/编码引起的问题
这是一个罕见的情况,但为了确保,按照这个很好的答案的清单进行检查。