資料庫行匹配問題的挑戰
P粉078945182
P粉078945182 2023-08-13 16:46:45
0
1
373
<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>
P粉078945182
P粉078945182

全部回覆(1)
P粉826429907

首先,你必須接受這個事實:如果你的查詢沒有找到任何行,那就意味著沒有匹配,即使你可以發誓資料是正確的。當查詢傳回沒有行時,就沒有行與條件相符。所以你必須找出原因。但首先你需要確保你的查詢是正確的:

由SQL錯誤所造成的問題

首先你需要確保你的查詢實際上沒有錯誤,因為「沒有結果」可能意味著查詢中有錯誤。有關詳細信息,請參考這些答案:pdomysqli

由條件引起的問題

檢查你的條件。有一些互斥的條件,例如WHERE col=1 AND col=2。它永遠不會傳回任何行。嘗試簡化條件,直到它開始傳回一些行,然後細化條件以獲得所需的結果。


但是好吧,沒有錯誤,條件是正確的,你可以發誓表中有資料與你的查詢相符。然而,還是有一些陷阱:

由數據引起的問題

首先,在涉及變數的情況下,確保它存在並且實際上包含一些值。

然後檢查值本身。輸入資料(或資料庫)中可能存在一些轉換或不可列印的字元。例如換行或特殊編碼的符號,或一些字元如<>轉換為HTML實體。結果是,查詢包含<abc@abcs.com>將永遠不會匹配文字<abc@abcs.com>。為了快速檢查,你可以使用rawurlencode()函數,它會將所有非拉丁字元轉換為程式碼,從而使它們可見。

問題是,這只是一個猜測,沒有人能告訴你實際的問題是什麼,因為這是你的資料庫,你的輸入數據,只有能找到問題。

我寫了一篇文章,解釋了如何調試你的PDO問題

要除錯特定的問題,你需要:

  • 確保PDO和PHP都啟用了完整的錯誤報告。這真的很有幫助,可以顯示你偶爾的排版錯誤、拼字錯誤等
  • 仔細檢查資料庫中的資料和輸入,找出差異。 urlencode()函數會有所幫助,它會顯示資料庫和輸入中的所有無法列印和轉換字元。

由連線憑證所引起的問題

另一個常見問題是當你有多個資料庫並連接到錯誤的資料庫時,它沒有所要求的資料。這個問題類似於這個問題,所以只要按照相同的步驟進行檢查,只不過不是檢查表的清單而是資料行。

由字元集/編碼引起的問題

這是一個罕見的情況,但為了確保,按照這個很好的答案的清單進行檢查。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!