在数据库中遇到了匹配行的问题。
P粉005105443
P粉005105443 2023-07-25 10:47:08
0
1
490
<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>
P粉005105443
P粉005105443

全部回复(1)
P粉237689596

首先,您必须接受这样一个事实:如果您的查询没有找到任何行,这意味着没有匹配,即使您可以发誓数据是正确的。当查询不返回任何行时,说明没有行与条件匹配。因此,您需要找出原因所在。但首先,您需要确保您的查询是正确的:

由SQL错误引起的问题

首先,您需要确保查询实际上没有错误,因为“没有结果”可能意味着查询中有错误。有关详细信息,请参考以下答案:pdo和mysqli。

由条件引起的问题

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


但是好吧,没有错误,条件也正确,您可以发誓表中有数据与您的查询匹配。然而,仍然存在一些陷阱:

由数据引起的问题

首先,在涉及变量的情况下,请确保变量存在并实际包含某些值。

然后检查值本身。输入数据(或数据库)中可能存在一些转换或不可打印的字符。例如,换行符或特殊编码的符号,或者某些字符(如<和>)转换为HTML实体。结果是,查询包含<abc@abcs.com>的文本将永远不会匹配文本<abc@abcs.com>。您可以使用rawurlencode()函数进行快速检查,它将将所有非拉丁字符转换为代码,从而使它们可见。

问题在于,这只是一个猜测,没有人可以告诉您实际的问题是什么,因为这是您的数据库,您的输入数据,只有您自己才能找到问题所在。

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

要调试特定的问题,您需要:

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

由连接凭据引起的问题

另一个常见问题是当您有多个数据库并连接到错误的数据库时,该数据库没有所请求的数据。这个问题与之前的类似,所以只需按照相同的步骤进行,只是检查的不是表的列表,而是数据行。

由字符集/编码引起的问题

这是一个罕见的情况,但为了确保,按照这个很好的答案

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板