搜尋

首頁  >  問答  >  主體

怎麼處理mysqli的問題?例如出現mysqli_fetch_array():參數#1必須是mysqli_result類型的錯誤。

<p>在我的本機/開發環境中,MySQLi查詢運作正常。然而,當我將其上傳到我的Web主機環境時,出現以下錯誤:</p> <blockquote> <p>Fatal error: Call to a member function bind_param() on a non-object in...</p> </blockquote> <p>這是代碼:</p> <pre class="brush:php;toolbar:false;">global $mysqli; $stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?"); $stmt->bind_param('i', $cur_id); $stmt->execute(); $stmt->bind_result($uid, $desc);</pre> <p>為了檢查我的查詢,我嘗試透過控制面板的phpMyAdmin執行查詢,結果是正常的。 </p>
P粉426906369P粉426906369499 天前479

全部回覆(1)我來回復

  • P粉252116587

    P粉2521165872023-07-25 15:41:15

    簡而言之

    1. 在你的mysqli連線程式碼中總是使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);並且總是檢查PHP錯誤。
    2. 總是用問號取代SQL查詢中的每個PHP變量,並使用預處理語句執行查詢。這有助於避免各種語法錯誤。

    解釋

    有時你的mysqli程式碼會產生錯誤,如mysqli_fetch_assoc()期望參數1為mysqli_result,但實際得到的是布林值...,呼叫bind_param()的成員函數...或類似的錯誤。甚至沒有任何錯誤,但查詢仍然無效。這意味著你的查詢未能執行。

    每當查詢失敗時,MySQL都會有一個錯誤訊息來解釋原因。在舊版的PHP中,這些錯誤訊息沒有傳遞給PHP,你只會得到上面提到的晦澀的錯誤訊息。因此,非常重要的是將PHP和mysqli配置為向你報告MySQL錯誤。一旦你得到錯誤訊息,你就可以修復錯誤。

    #

    如何取得MySQL中的錯誤訊息

    首先,在所有環境中,在mysqli連接之前始終添加以下程式碼行:

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    在此之後,所有的MySQL錯誤將會轉換為PHP異常。未捕獲的異常將導致PHP致命錯誤。因此,如果出現MySQL錯誤,您將收到一個常規的PHP錯誤。這將立即讓您意識到錯誤的原因。而堆疊追蹤將引導您到錯誤發生的確切位置。

    如何從PHP取得錯誤訊息

    在開發伺服器上,確保錯誤訊息在螢幕上顯示出來,而在生產伺服器上,請檢查錯誤日誌。請參閱我關於PHP錯誤報告的文章,以了解詳細資訊。

    請注意,在進行AJAX呼叫時,在開發伺服器上開啟開發者工具(F12),然後切換到網路標籤。然後發起您想要查看結果的請求,它將出現在網路標籤中。點擊它,然後切換到響應選項卡。您將在那裡看到確切的輸出。在生產伺服器上,請檢查錯誤日誌。


    如何處理您收到的錯誤訊息

    首先,您需要找到問題查詢。錯誤訊息中包含了發生錯誤的檔案名稱和行號。對於簡單的程式碼來說,這已經足夠了,但如果您的程式碼使用了函數或類,您可能需要追蹤堆疊以找到問題查詢。

    在獲取錯誤訊息後,您需要閱讀並理解它。這聽起來可能太明顯了,但學習者經常忽略一個事實,即錯誤訊息不僅僅是一個警報信號,它實際上包含了問題的詳細解釋。您只需要閱讀錯誤訊息並修復問題。

    #
    • 如果錯誤訊息顯示某個表格不存在,您需要檢查拼字、錯字和大小寫。另外,您還需要確保您的 PHP 腳本連接到了正確的資料庫。
    • 如果錯誤訊息顯示 SQL 語法錯誤,那麼您需要檢查您的 SQL 語句。問題所在應該是在錯誤訊息中引用的查詢部分之前。

    如果您不理解錯誤訊息,可以嘗試在Google上搜尋。在瀏覽結果時,要選擇那些解釋錯誤而不是直接給出解決方案的答案。解決方案可能在您的特定情況下不起作用,但解釋將幫助您理解問題,並使您能夠自行解決問題。

    您還需要相信錯誤訊息。如果錯誤訊息說令牌數量與綁定變數數量不匹配,那就是這樣。對於缺少的表或列也是一樣。在選擇時,無論是您自己的錯誤還是錯誤訊息錯誤,始終堅持前者。再次強調,這聽起來可能有些傲慢,但這個網站上的數百個問題證明了這個建議的極大用處。

    Basic debugging

    如果您的查詢似乎不起作用,可能有以下四個原因:

    1. 執行過程中發生了錯誤。已在上面解釋過了。
    2. 由於程式邏輯錯誤,SQL根本沒有運作。新增臨時偵錯輸出,確保程式碼達到執行查詢的點。
    3. SQL已成功執行,但結果在錯誤的資料庫中查看。請再次仔細檢查。
    4. 輸入的資料與資料庫不符。以下是一些建議,可以用來檢查它

    回覆
    0
  • 取消回覆