資料庫行匹配問題的挑戰
P粉078945182
2023-08-13 16:46:45
<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>
首先,你必須接受這個事實:如果你的查詢沒有找到任何行,那就意味著沒有匹配,即使你可以發誓資料是正確的。當查詢傳回沒有行時,就沒有行與條件相符。所以你必須找出原因。但首先你需要確保你的查詢是正確的:
由SQL錯誤所造成的問題
首先你需要確保你的查詢實際上沒有錯誤,因為「沒有結果」可能意味著查詢中有錯誤。有關詳細信息,請參考這些答案:pdo和mysqli。
由條件引起的問題
檢查你的條件。有一些互斥的條件,例如
WHERE col=1 AND col=2
。它永遠不會傳回任何行。嘗試簡化條件,直到它開始傳回一些行,然後細化條件以獲得所需的結果。但是好吧,沒有錯誤,條件是正確的,你可以發誓表中有資料與你的查詢相符。然而,還是有一些陷阱:
由數據引起的問題
首先,在涉及變數的情況下,確保它存在並且實際上包含一些值。
然後檢查值本身。輸入資料(或資料庫)中可能存在一些轉換或不可列印的字元。例如換行或特殊編碼的符號,或一些字元如
<
和>
轉換為HTML實體。結果是,查詢包含<abc@abcs.com>
將永遠不會匹配文字<abc@abcs.com>
。為了快速檢查,你可以使用rawurlencode()
函數,它會將所有非拉丁字元轉換為程式碼,從而使它們可見。問題是,這只是一個猜測,沒有人能告訴你實際的問題是什麼,因為這是你的資料庫,你的輸入數據,只有你能找到問題。
我寫了一篇文章,解釋了如何調試你的PDO問題。
要除錯特定的問題,你需要:
urlencode()
函數會有所幫助,它會顯示資料庫和輸入中的所有無法列印和轉換字元。由連線憑證所引起的問題
另一個常見問題是當你有多個資料庫並連接到錯誤的資料庫時,它沒有所要求的資料。這個問題類似於這個問題,所以只要按照相同的步驟進行檢查,只不過不是檢查表的清單而是資料行。
由字元集/編碼引起的問題
這是一個罕見的情況,但為了確保,按照這個很好的答案的清單進行檢查。