在資料庫中遇到了匹配行的問題。
P粉005105443
P粉005105443 2023-07-25 10:47:08
0
1
448
<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粉005105443
P粉005105443

全部回覆(1)
P粉237689596

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

由SQL錯誤引起的問題

首先,您需要確保查詢實際上沒有錯誤,因為「沒有結果」可能意味著查詢中有錯誤。有關詳細信息,請參考以下答案:pdo和mysqli。

由條件引起的問題

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


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

由資料引起的問題

首先,在涉及變數的情況下,請確保變數存在並實際包含某些值。

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

問題在於,這只是一個猜測,沒有人可以告訴您實際的問題是什麼,因為這是您的資料庫,您的輸入數據,只有您自己才能找到問題所在。

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

要偵錯特定的問題,您需要:

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

由連線憑證所引起的問題

另一個常見問題是當您有多個資料庫並連接到錯誤的資料庫時,該資料庫沒有所要求的資料。這個問題與之前的類似,所以只需按照相同的步驟進行,只是檢查的不是表的列表,而是資料行。

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

這是一個罕見的情況,但為了確保,按照這個很好的答案

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