資料庫中的匹配行出現問題
P粉852114752
2023-08-25 20:51:42
<p>我希望取得行數來檢查資料庫中是否已存在相同的電子郵件。我嘗試了幾種機制但沒有成功。當我直接在資料庫中執行查詢時,它會給出行數,但透過 PDO 執行它會給出 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,但執行我得到 0。 </p>
首先,您必須接受這樣一個事實:如果您的查詢沒有找到任何行,則意味著沒有匹配,即使您可以發誓資料是正確的嗯>。當查詢未傳回任何行時,則表示沒有與條件相符的行。所以你必須找出 - 為什麼。但首先您需要確保您的查詢正確:
SQL錯誤所導致的問題
首先,您需要確保您的查詢實際上運行時沒有錯誤,因為「無結果」可能表示查詢中存在錯誤。有關詳細信息,請參閱這些答案: pdo 和 mysqli。
狀況引起的問題
檢查您的條件。存在互斥條件,例如
WHERE col=1 AND col=2
。它永遠不會傳回任何行。嘗試簡化條件,直到它開始傳回一些行,然後細化條件以獲得所需的結果。但是好吧,沒有錯誤,條件正確,並且您可以發誓表中的資料與您的查詢相符。儘管如此,仍然存在一些陷阱:
數據引起的問題
首先,如果涉及變量,請確保它存在並且實際上包含一些值。
然後檢查值本身。輸入資料(或資料庫)中可能存在一些轉換後的或不可列印的字元。例如換行符或特殊編碼的符號,或轉換為 HTML 實體的某些字符,例如
和
>
。因此,包含
的查詢永遠不會符合文字
。為了快速檢查,您可以使用rawurlencode()
函數,它將所有非拉丁字元轉換為程式碼,從而使它們可見。問題是,這只是一個猜測,沒有人可以告訴您實際問題是什麼,因為它是您的資料庫、您輸入資料並且只有您可以找到問題。
我寫了一篇文章,解釋了如何調試 PDO 問題。
要偵錯特定問題,您需要
urlencode()
函數會有所幫助,顯示資料庫和輸入中的所有無法列印和轉換的字元。連接憑證所導致的問題
另一個常見問題是當您有多個資料庫並連接到不包含所請求資料的錯誤資料庫時。這個問題與這個問題類似,所以只需遵循相同的例程即可,只檢查資料行而不是表格列表。
字符集/編碼引起的問題
這是一種罕見的情況,但為了確保萬無一失,請按照此很好的答案中的清單進行操作