在我的本機/開發環境中,MySQLi查詢運作正常。然而,當我將其上傳到我的Web主機環境時,出現以下錯誤:
Fatal error: Call to a member function bind_param() on a non-object in...
這是代碼:
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);
為了檢查我的查詢,我嘗試透過控制面板的phpMyAdmin執行查詢,結果是正常的。
簡而言之
解釋
有時你的mysqli程式碼會產生錯誤,如mysqli_fetch_assoc()期望參數1為mysqli_result,但實際得到的是布林值...,呼叫bind_param()的成員函數...或類似的錯誤。甚至沒有任何錯誤,但查詢仍然無效。這意味著你的查詢未能執行。
每當查詢失敗時,MySQL都會有一個錯誤訊息來解釋原因。在舊版的PHP中,這些錯誤訊息沒有傳遞給PHP,你只會得到上面提到的晦澀的錯誤訊息。因此,非常重要的是將PHP和mysqli配置為向你報告MySQL錯誤。一旦你得到錯誤訊息,你就可以修復錯誤。
#
如何取得MySQL中的錯誤訊息
首先,在所有環境中,在mysqli連接之前始終添加以下程式碼行:
在此之後,所有的MySQL錯誤將會轉換為PHP異常。未捕獲的異常將導致PHP致命錯誤。因此,如果出現MySQL錯誤,您將收到一個常規的PHP錯誤。這將立即讓您意識到錯誤的原因。而堆疊追蹤將引導您到錯誤發生的確切位置。
如何從PHP取得錯誤訊息
在開發伺服器上,確保錯誤訊息在螢幕上顯示出來,而在生產伺服器上,請檢查錯誤日誌。請參閱我關於PHP錯誤報告的文章,以了解詳細資訊。
請注意,在進行AJAX呼叫時,在開發伺服器上開啟開發者工具(F12),然後切換到網路標籤。然後發起您想要查看結果的請求,它將出現在網路標籤中。點擊它,然後切換到響應選項卡。您將在那裡看到確切的輸出。在生產伺服器上,請檢查錯誤日誌。
如何處理您收到的錯誤訊息
首先,您需要找到問題查詢。錯誤訊息中包含了發生錯誤的檔案名稱和行號。對於簡單的程式碼來說,這已經足夠了,但如果您的程式碼使用了函數或類,您可能需要追蹤堆疊以找到問題查詢。
在獲取錯誤訊息後,您需要閱讀並理解它。這聽起來可能太明顯了,但學習者經常忽略一個事實,即錯誤訊息不僅僅是一個警報信號,它實際上包含了問題的詳細解釋。您只需要閱讀錯誤訊息並修復問題。
#
如果您不理解錯誤訊息,可以嘗試在Google上搜尋。在瀏覽結果時,要選擇那些解釋錯誤而不是直接給出解決方案的答案。解決方案可能在您的特定情況下不起作用,但解釋將幫助您理解問題,並使您能夠自行解決問題。
您還需要相信錯誤訊息。如果錯誤訊息說令牌數量與綁定變數數量不匹配,那就是這樣。對於缺少的表或列也是一樣。在選擇時,無論是您自己的錯誤還是錯誤訊息錯誤,始終堅持前者。再次強調,這聽起來可能有些傲慢,但這個網站上的數百個問題證明了這個建議的極大用處。
Basic debugging
如果您的查詢似乎不起作用,可能有以下四個原因: