Ich möchte die Zeilenanzahl abrufen, um zu überprüfen, ob dieselbe E-Mail bereits in der Datenbank vorhanden ist. Ich habe mehrere Mechanismen ohne Erfolg ausprobiert. Wenn ich die Abfrage direkt in der Datenbank ausführe, gibt sie die Anzahl der Zeilen an, aber die Ausführung über PDO ergibt 0.
Ich habe die fetchAll-Methode verwendet, um manuell zu zählen, und selbst die Verwendung der rowCount-Methode funktioniert nicht
$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();
Das Problem ist, dass $email_f HTML enthält
SELECT count(*) FROM inbox WHERE uid = "6961" AND from_email = "abc Offers <abc@abcs.com>"
Dies ist die Abfrage, die ich aus $sql gedruckt habe, und wenn ich sie direkt in der Datenbank in phpmyadmin ausführe, funktioniert sie einwandfrei. Mir wird die Zahl 3 gegeben, aber durch die Ausführung erhalte ich 0.
首先,您必须接受这样一个事实:如果您的查询没有找到任何行,则意味着没有匹配项,即使您可以发誓数据是正确的。当查询未返回任何行时,则表示没有与条件匹配的行。所以你必须找出 - 为什么。但首先您需要确保您的查询正确:
SQL错误导致的问题
首先,您需要确保您的查询实际上运行时没有错误,因为“无结果”可能意味着查询中存在错误。有关详细信息,请参阅这些答案: pdo 和 mysqli。
如果错误显示“没有这样的表/数据库”,请参阅下面的“连接凭据”案例。
状况引起的问题
检查您的条件。存在互斥条件,例如
WHERE col=1 AND col=2
。它永远不会返回任何行。尝试简化条件,直到它开始返回一些行,然后细化条件以获得所需的结果。但是好吧,没有错误,条件正确,并且您可以发誓表中的数据与您的查询相匹配。尽管如此,仍然存在一些陷阱:
数据引起的问题
首先,如果涉及变量,请确保它存在并且实际上包含一些值。
然后检查值本身。输入数据(或数据库)中可能存在一些转换后的或不可打印的字符。例如换行符或特殊编码的符号,或转换为 HTML 实体的某些字符,例如
<
和>
。因此,包含<abc@abcs.com>
的查询永远不会匹配文本<abc@abcs.com>
。为了快速检查,您可以使用rawurlencode()
函数,它将所有非拉丁字符转换为代码,从而使它们可见。问题是,这只是一个猜测,没有人可以告诉您实际问题是什么,因为它是您的数据库、您输入数据并且只有您可以找到问题。
我写了一篇文章,解释了如何调试 PDO 问题。
要调试特定问题,您需要
urlencode()
函数会有所帮助,显示数据库和输入中的所有不可打印和转换的字符。连接凭据导致的问题
另一个常见问题是当您有多个数据库并连接到不包含所请求数据的错误数据库时。这个问题与这个问题类似,所以只需遵循相同的例程即可,只检查数据行而不是表列表。
字符集/编码引起的问题
这是一种罕见的情况,但为了确保万无一失,请按照此很好的答案中的清单进行操作