首页  >  问答  >  正文

数据库行匹配问题的挑战

<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粉078945182P粉078945182405 天前451

全部回复(1)我来回复

  • P粉826429907

    P粉8264299072023-08-14 15:05:22

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

    由SQL错误引起的问题

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

    由条件引起的问题

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


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

    由数据引起的问题

    首先,在涉及到变量的情况下,确保它存在并且实际上包含一些值。

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

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

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

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

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

    由连接凭据引起的问题

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

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

    这是一个罕见的情况,但为了确保,按照这个很好的答案的清单进行检查。

    回复
    0
  • 取消回复