{錯誤類型}: {錯誤原因} in {錯誤文件} on {錯誤行數}
說明了在哪個文件的哪一行中因何種原因出現了何種錯誤。
常見的錯誤類型一般有下面幾種:
Parse error(解析錯誤)一般都伴隨着Syntax errors(句法錯誤) ,說明你的程序不符合PHP的語法。
它是級別最高的錯誤,整個腳本根本不會被執行。
一般都是由一個表達式缺少";" 或各種括號引號不成對引起的。看詳細的信息就能知道問題的所在。
一般句法錯誤都會給你提示一個解析器代號,告訴你出現的問題是在哪里。比如:
Parse error: syntax error, unexpected T_STRING in xxx.php on line 9
T_STRING 是一個解析器代號,顧名思義,它代表字符串,很多錯誤原因都會帶解析器代號。通過它你可以更直接的了解到錯誤的原因。
unexpected意思是非預期的,換句話說也就是多余的。
更多解析器代號請參考:http://www.php.net/manual/zh/tokens.php 或php手冊 英文版中叫:List of Parser Tokens 中文版中叫:解析器代號列表
上面的錯誤的意思是說你的第九行有一個非預期的字符串。
我的代碼:
1-7: 略
8 : test(array('a'))
9 : xxx();
10 : >
這個問題如何解決呢?把第九行的xxx刪掉,的確符合PHP語法了。
但是那不是我想要的,實際上是我的第8行缺少了一個";",解決辦法是在第8行結尾加分號。
注意:這個例子還說明了一個問題,錯誤報告說是哪行,問題不一定就非在哪行,也可能是它的前面一行或幾行造成的。最典型的例子是某程序提示出錯行數在 文件的最后一行,你去看,發現那行除了“>”以外沒有別的字符,這種情況一般是缺少引號導致的。你要往前面找不成對的引號或者別的什么標點。如果你 非要抬杠,認准了行號不松口,那就不是php的問題了。
Fatal Error(致命錯誤),僅次於Parsing Error的錯誤,執行到發生錯誤的行時,腳本會終止運行。
在程序符合PHP語法的基礎上,使用了未定義的函數,或require一個不存在的文件,死循環導致程序執行超時,都會導致fatal error。
一般表現為:
Fatal Error: Call to undefined function func() in php100.php on line 某某
就是說在某某行你調用了一個未定義的func函數,這時候一般就是看你是否忘了包含該包含的文件,是否寫錯了函數名,是否寫錯了文件名。(PHP100.com)
Warning(警告),比致命錯誤級別稍低,但程序不會因為腳本錯誤而終止。
一般出現在include一個不存在的文件,或者一個程序需要一個參數,但是你沒傳參數,並且你也沒指定參數的默認值。
Warning視情況可以避免出現,實在沒法避免,可以加@強行屏蔽。
Notice(通知),級別最低,一般可以無視,不會影響到腳本的運行。多數發生在變量或數組下標未定義的情況。
注意:多數notice都可忽略,但是少數的notice也可能會反映出比較嚴重的問題。
比如 Notice: Undefined variable: sql in xxx.php on line xx
你看到有個變量"sql"未定義,這就可能很危險了,在register_globals=on的情況下,沒准這個錯誤直接就成為了別人操作數據庫的后門。
此外還有一些別的類型的錯誤,平時不常見,我就不多說了。
總結
綜上所述,PHP的錯誤提示會告訴我們很多事情,為我們查找錯誤提供了極大的方便。好好利用它,會大大的提高我們的工作效率和工作質量。
不過,它帶來好處的同時,也可能會透露服務器的敏感信息,容易讓攻擊者發現服務器的漏洞。
php開發環境一定要打開全部錯誤提示,打開錯誤顯示。最大限度的減少事故的發生。
生產環境千萬要把錯誤顯示關閉,改用日志來記錄錯誤。別給有心人以可乘之機。
不同的錯誤種類包括:
E_ERROR:通常會顯示出來,也會中斷程序執行。
E_WARNING:通常都會顯示出來,但不會中斷程序的執行。
E_NOTICE:在腳本正常運行下發生的代碼錯誤。
E_PARSE:語法解析錯誤。
E_CORE_ERROR:在PHP啟動時發生的致命錯誤。
E_CORE_WARNING:報告在PHP啟動時發生的非致命性錯誤。
E_COMPILE_ERROR:編譯時發生的致命錯誤,指出腳本的錯誤。
E_USER_ERROR:用戶產生的錯誤信息。
E_USER_WARNING:用戶產生的警告信息。
E_USER_NOTICE:用戶引發的注意消息。
E_STRICT:編碼標准化警告,運行時發生的錯誤。
E_RECOVERABLE_ERROR:接近致命的運行時錯誤,若未被捕獲則視同E_ERROR。
E_ALL:捕獲所有的錯誤和警告。