1 回答

TA貢獻1795條經(jīng)驗 獲得超7個贊
有時您的查詢失敗,您不知道原因。因此,配置PHP和mysqli以報告每個錯誤非常重要。
如何在mysqli中獲取錯誤消息
首先,MySQLi在所有環(huán)境中連接之前總是有這條線:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
之后,所有MySQL錯誤都將轉(zhuǎn)移到PHP異常中。反過來,未捕獲的異常會導致PHP致命錯誤。因此,如果出現(xiàn)MySQL錯誤,您將收到傳統(tǒng)的PHP錯誤。這將立即讓您意識到錯誤原因。堆棧跟蹤將引導您到達發(fā)生錯誤的確切位置。
如何在不同的環(huán)境中配置PHP
以下是我關(guān)于PHP錯誤報告的文章的要點:
請注意,您必須能夠查看PHP錯誤。這確實是不同環(huán)境的問題:
您必須將相應的配置選項設(shè)置為以下值
在開發(fā)服務器上
error_reporting
應該設(shè)置為E_ALL
值;display_errors
應設(shè)為1在生產(chǎn)服務器上
error_reporting
應該設(shè)置為E_ALL
值;display_errors
應設(shè)為0log_errors
應設(shè)為1
如何實際使用它?
只是刪除了錯誤手動檢查任何代碼,所有這些or die()
,if ($result)
和這樣的。只需立即編寫數(shù)據(jù)庫交互代碼即可
$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");$stmt->bind_param("si", $name, $quantity);$stmt->execute();
再次,witohut周圍的任何條件。如果發(fā)生錯誤,則會將其視為代碼中的任何其他錯誤。例如,在開發(fā)PC上,它只會出現(xiàn)在屏幕上。對于實時網(wǎng)站,您將需要一個錯誤包裝,但這是一個不同的故事,與mysqli及其錯誤完全無關(guān)。
如何處理您收到的錯誤消息
收到錯誤消息后,您必須閱讀并理解它。這聽起來太明顯了,但學習者經(jīng)常忽略錯誤信息的極端有用性。但大多數(shù)時候它解釋這個問題非常簡單。比如,如果它說特定表不存在,則必須檢查拼寫,拼寫錯誤,字母大小寫,憑證等。或者,如果它說SQL語法中存在錯誤,那么您必須檢查SQL。問題點就在錯誤消息中引用的查詢部分之前。
您還必須信任該錯誤消息。如果它說令牌的數(shù)量與綁定變量的數(shù)量不匹配那么它就是這樣。缺席的表或列也是如此。鑒于選擇,無論是你自己的錯誤還是錯誤信息是錯誤的,總是堅持前者。它再次聽起來居高臨下,但在這個網(wǎng)站上的數(shù)百個問題證明這個建議非常有用。
關(guān)于錯誤報告的不應該做的清單
使用錯誤抑制運算符(
@
)使用
die()
或echo
或任何其他功能無條件地在屏幕上打印錯誤消息。PHP可以很好地回應它,不需要任何幫助。手動測試查詢結(jié)果(如
if($result)
)只是沒有意義。您的查詢失敗并且您已經(jīng)獲得了錯誤異常,或者它沒有問題,也沒有什么可以測試的。使用try..catch回顯錯誤消息。PHP可以做得更好,更好。
添加回答
舉報