Herausforderungen beim Datenbankzeilenabgleich
P粉078945182
2023-08-13 16:46:45
<p>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 mir die Anzahl der Zeilen zurück, aber die Ausführung über PDO gibt mir 0 zurück. </p>
<p>Ich habe die fetchAll-Methode zum manuellen Zählen verwendet und sogar die rowCount-Methode, aber auch ohne Erfolg. </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>Das Problem liegt bei $email_f, das HTML-Code enthält. </p>
<pre class="brush:php;toolbar:false;">SELECT count(*) FROM inbox WHERE uid = "6961"
AND from_email = "abc Offers <abc@abcs.com>"</pre>
<p>Dies ist die Abfrageanweisung, die ich aus $sql ausgedruckt habe. Wenn ich sie direkt in phpmyadmin ausführe, funktioniert sie einwandfrei und gibt mir 3 Zeilen zurück, aber über „execute“ gibt sie mir 0 zurück. </p>
首先,你必须接受这个事实:如果你的查询没有找到任何行,那就意味着没有匹配,即使你可以发誓数据是正确的。当查询返回没有行时,就没有行与条件匹配。所以你必须找出原因。但首先你需要确保你的查询是正确的:
由SQL错误引起的问题
首先你需要确保你的查询实际上没有错误,因为“没有结果”可能意味着查询中有错误。有关详细信息,请参考这些答案:pdo和mysqli。
由条件引起的问题
检查你的条件。有一些互斥的条件,比如
WHERE col=1 AND col=2
。它永远不会返回任何行。尝试简化条件,直到它开始返回一些行,然后细化条件以获得所需的结果。但是好吧,没有错误,条件是正确的,你可以发誓表中有数据与你的查询匹配。然而,还是有一些陷阱:
由数据引起的问题
首先,在涉及到变量的情况下,确保它存在并且实际上包含一些值。
然后检查值本身。输入数据(或数据库)中可能存在一些转换或不可打印的字符。例如换行符或特殊编码的符号,或一些字符如
<
和>
转换为HTML实体。结果是,查询包含<abc@abcs.com>
将永远不会匹配文本<abc@abcs.com>
。为了快速检查,你可以使用rawurlencode()
函数,它会将所有非拉丁字符转换为代码,从而使它们可见。问题是,这只是一个猜测,没有人能告诉你实际的问题是什么,因为这是你的数据库,你的输入数据,只有你能找到问题。
我写了一篇文章,解释了如何调试你的PDO问题。
要调试特定的问题,你需要:
urlencode()
函数会有所帮助,它会显示数据库和输入中的所有不可打印和转换字符。由连接凭据引起的问题
另一个常见问题是当你有多个数据库并连接到错误的数据库时,它没有所请求的数据。这个问题类似于这个问题,所以只需按照相同的步骤进行检查,只不过不是检查表的列表而是数据行。
由字符集/编码引起的问题
这是一个罕见的情况,但为了确保,按照这个很好的答案的清单进行检查。