1. Php錯誤預設處理方法
在 PHP 中,預設的錯誤處理很簡單。一條訊息會被發送到瀏覽器,這條訊息帶有檔案名稱、行號以及一條描述錯誤的訊息。在建立指令碼和 web 應用程式時,錯誤處理是一個重要的部分。如果您的代碼缺少錯誤偵測編碼,那麼程式看上去很不專業,也為安全風險敞開了大門。
2. 改進處理方法:
1. 簡單的 "die()" 語句
2. error_reporting(); 設定PHP 的報錯層級並返回當前層級
3. 自訂錯誤和錯誤觸發器
3. PHP錯誤層級:
1 E_ERROR 致命的執行階段錯誤。 錯誤無法恢複過來。指令碼的執行被暫停
2 E_WARNING 非致命的執行階段錯誤。 指令碼的執行不會停止
4 E_PARSE 編譯時間解析錯誤。解析錯誤應該只由分析器產生
8 E_NOTICE 已耗用時間的通知。
16 E_CORE_ERROR 在PHP啟動時的致命錯誤。這就好比一個在PHP核心的E_ERROR
32 E_CORE_WARNING 在PHP啟動時的非致命的錯誤。這就好比一個在PHP核心E_WARNING警告
64 E_COMPILE_ERROR 致命的編譯時間錯誤。 這就像由Zend指令碼引擎產生了一個E_ERROR
128 E_COMPILE_WARNING 非致命的編譯時間錯誤,由Zend指令碼引擎產生了一個E_WARNING警告
256 E_USER_ERROR 致命的使用者產生的錯誤。
512 E_USER_WARNING 非致命的使用者產生的警告。
1024 E_USER_NOTICE 使用者產生的通知。
2048 E_STRICT 啟用 PHP 對代碼的修改建議,以確保代碼具有最佳的互通性和向前相容性。
4096 E_RECOVERABLE_ERROR 捕捉致命的錯誤。
8191 E_ALL 所有的錯誤和警告。
4. php錯誤報表:
php預設是不開啟錯誤報表的,要提示錯誤有兩種方法:
1. 配置php.ini檔案:
將 display_errors =Off 改為display_errors = On
php預設是顯示所有錯誤的,而有些無害的提示我們不需要顯示,另外還要配置錯誤層級:將error_reporting = E_ALL 改為:error_reporting= E_ALL & ~E_NOTICE
另:錯誤回顯,一般常用於開發模式,但是錯誤回顯可以暴露出非常多的敏感資訊,為攻擊者下一步攻擊提供便利。在正式環境下推薦關閉此選項,同時將log_error=on , 此時若出現錯誤,則提示:伺服器錯誤,但是不會出現錯誤提示而把錯誤資訊記錄在日誌裡。
2. 在程式裡添加
<?php error_reporting(0); // 關閉錯誤報表 error_reporting(E_ERROR | E_WARNING | E_PARSE); // 報告 runtime 錯誤 error_reporting(E_ALL); // 報告所有錯誤 error_reporting(E_ALL & ~E_NOTICE); // 報告 E_NOTICE 之外的所有錯誤?>
5. 自訂錯誤處理器和錯誤觸發器
自訂的錯誤處理器:
user_error_function(error_level,error_message,error_file,error_line,error_context)(使用者自己定義,用在set_error_handler中調用)
error_level:必選(錯誤層級)
error_message:必選(使用者定義的錯誤規定錯誤訊息)
error_file,error_line,error_context:可選 (發生錯誤的檔案,行號等資訊)
set_error_handler():
如果使用了該函數,會完全繞過標準的 PHP 錯誤處理函數(error_reporting ()將會失效),如果必要,使用者定義的錯誤處理程式必須終止 (die() ) 指令碼。
set_error_handler() 僅需要一個參數(自訂的錯誤處理器),可以添加第二個參數來規定錯誤層級。
trigger_error()觸發錯誤
在指令碼中使用者輸入資料的位置,當使用者的輸入無效時觸發錯誤的很有用的。可以在指令碼中任何位置觸發錯誤,通過添加的第二個參數,您能夠規定所觸發的錯誤層級。可能的錯誤類型:E_USER_ERROR, E_USER_WARNING, E_USER_NOTIC.
例子:
//自訂錯誤處理器function myErrorHandler($errno, $errstr, $errfile,$errline){ if(!(error_reporting() &$errno)){return;} switch ($errno){ case E_USER_ERROR: echo "<b>MyERROR</b> [$errno] $errstr<br/>"; echo "錯誤行:$errline 在檔案:$errfile之中<br/>"; echo " PHP版本: " .PHP_VERSION ." (" .PHP_OS .")<br/>"; break; case E_USER_WARNING: echo "<b>MyWARNING</b> [$errno] $errstr<br/>"; break; case E_USER_NOTICE: echo "<b>MyNOTICE</b> [$errno] $errstr<br />"; break; default: echo "Unknown error type:[$errno] $errstr<br />"; break; } return true;}//測試函數functiontrigger_test($age){ if($age <= 0|| $age > 999) trigger_error("年齡不合法:$age歲",E_USER_ERROR);if($age < 18) trigger_error("未成年:$age歲",E_USER_WARNING);if($age > 40&& $age < 100) trigger_error("年齡稍大:$age歲",E_USER_NOTICE);}//如果只是簡單統一地處理錯誤:$errorHandler = set_error_handler("myErrorHandler");trigger_test(1000);//會拋出一個error級的錯誤//如果要分別處理不同錯誤層級則需要構造不同層級的錯誤處理器function myError($errno, $errstr,$errfile, $errline){ //具體處理方法}function myWarning($errno, $errstr, $errfile, $errline){ //具體處理方法}function myNtice($errno, $errstr, $errfile, $errline){ //具體處理方法}set_error_handler('myError',E_USER_ERROR);set_exception_handler('myWarning',E_USER_WARNING);set_exception_handler('myNtice',E_USER_NOTICE);trigger_error('故意拋出個錯誤,還是很嚴重的哪一種!',E_USER_ERROR);
6. 屏蔽PHP錯誤提示
方法一:
在有可能出錯的函數前加@,然後or die("")
如: @mysql_connect(...) or die("Database Connect Error")
註:@其實它是錯誤抑制符,即即使出現錯誤,也無視出現的錯誤資訊,繼續執行下邊的代碼;好處是不會輸出錯誤資訊。
Or die當在指令碼中調用die()和exit()時,將會終止整個指令碼。它們都可用於阻止指令碼繼續執行,而使得某些重要的操作(如建立一條資料庫連接)不會發生。你還可以給die()和exit()傳遞一個將在瀏覽器中列印出來的字串。
方法二:
編輯php.ini ,將"display_errors =off" , 同時將log_error=on, error_log = /var/log/php-error.log
方法三:
在php指令碼前加error_reporting(0),屏蔽所有錯誤提示。
其中,error_reporting 配置錯誤資訊回報的等級。
文法:int error_reporting(int [level]);
傳回值:整數
函數種類:PHP 系統功能
相關推薦:
PHP錯誤處理方法執行個體
php錯誤處理和日誌記錄
PHP錯誤處理方法總結_PHP教程