提问人:khattak 提问时间:9/18/2019 最后编辑:Your Common Sensekhattak 更新时间:8/28/2023 访问量:1108
与数据库中的行匹配时出现问题
Having issue with matching rows in the database
问:
我希望获得行计数以检查数据库中是否已经存在相同的电子邮件。 我尝试了几种机制,但没有成功。当我直接在数据库中运行查询时,它给了我行数,但通过 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 <[email protected]>"
这是我从$sql打印的查询,当我直接在phpmyadmin中的数据库中执行它时,它工作正常。给我数 3,但通过执行我得到 0。
答:
首先,你必须接受这样一个事实:如果你的查询没有找到行,这意味着没有匹配项,即使你可以发誓数据没问题。当查询不返回任何行时,则没有与条件匹配的行。所以你必须找出 - 为什么。但首先,您需要确保查询没问题:
SQL错误导致的问题
首先,您需要确保查询实际运行时没有错误,因为“无结果”可能意味着查询中存在错误。有关详细信息,请参阅以下答案:pdo 和 mysqli。
如果错误显示“没有这样的表/数据库”,请参阅下面的“连接凭据”情况。
由病情引起的问题
检查您的条件。存在相互排斥的条件,例如 。它永远不会返回任何行。尝试简化条件,直到它开始返回一些行,然后优化条件以获得所需的结果。WHERE col=1 AND col=2
但没关系,没有错误,条件是正确的,你可以发誓表中有数据与你的查询相匹配。尽管如此,还是有一些陷阱:
数据引起的问题
首先,如果涉及变量,请确保它存在并且实际上包含一些值。
然后检查值本身。输入数据(或数据库)中可能存在一些已转换或不可打印的字符。例如,换行符或特殊编码的符号,或某些字符,例如并转换为 HTML 实体。因此,查询包含永远不会与文本匹配。为了快速检查,您可以使用函数,它会将所有非拉丁字符转换为代码,从而使它们可见。<
>
<[email protected]>
<[email protected]>
rawurlencode()
问题是,这只是一个猜测,没有人能告诉你实际问题是什么,因为它是你的数据库,你的输入数据,只有你才能找到问题。
我写了一篇文章,解释了如何调试你的PDO问题。
要调试特定问题,您需要
- 确保为 PDO 和 PHP 启用了完整的错误报告。它真的很有帮助,偶尔会向您显示印刷错误、拼写错误等
- 仔细检查数据库中的数据和输入以找出差异。 函数会有所帮助,在数据库和输入中显示所有不可打印和转换的字符。
urlencode()
连接凭据导致的问题
另一个常见的问题是,当您有多个数据库并连接到没有请求数据的错误数据库时。这个问题与此问题类似,因此只需遵循相同的例程,仅检查表列表,而是检查数据行。
字符集/编码引起的问题
这是一个罕见的情况,但可以肯定的是,请按照这个伟大答案中的清单进行操作
评论