編寫程序時
無論怎樣小心謹慎
犯錯總是在所難免的
這些錯誤通常會迷惑PHP編譯器
如果開發人員無法了解編譯器報錯信息的含義
那麼這些錯誤信息不僅毫無用處
還會常常讓人感到沮喪
編譯PHP腳本時
PHP編譯器會盡其所能報告它遇到的第一個問題
這樣就產生一個問題
只有當錯誤出現時
PHP才能將它識別出來(本文後面對此問題進行了詳細描述)
正是由於這個緣故
編譯器指出出錯的那行
從表面上看來可能語法正確無誤
或者可能是根本就不存在的一行!
更好地理解錯誤信息可以大大節省確定並改正錯誤內容所花費的時間
因此
在本文中
我將努力闡明多種不同類型的PHP報錯信息
以及在開發過程中如何正確理解各種報錯信息的含義
本文中所講述的內容與您所應用的PHP的版本無關
因為本文所描述的各種錯誤並不限定於某一特殊版本的特定錯誤
另外我們假定您是一位初級或者中級程序員
並已經從事編程工作有半年或一年的時間
編譯器的工作方式
要搞清楚編譯器為什麼會報告某一行上存在錯誤
首先必須明確編譯器解析PHP代碼的機制
我並不打算在本文中對此進行詳細論述
但是
我們將會討論一些更易於引發錯誤的簡單概念
變量聲明
如果在一條語句中聲明一個變量
具體方式如下所示
$variable =
value
;
編譯器首先求出語句右半部分的值(即等號右邊的所有內容)
在一些編程書籍中
將此表示為語句的 RHS (右半部分)
恰恰正是語句的這一部分常常會引發錯誤
如果使用的語法不正確
就會出現解析錯誤
解析錯誤
Parse error:解析錯誤
unexpected T_WHILE in c://program files//apache group//apache//htdocs//script
php on line
每次確定了前一錯誤時
解析錯誤一個接一個地不斷出現
因為PHP在第一個解析錯誤之後就停止執行腳本
調試並糾正這一系列的錯誤往往會讓人覺得特別厭煩
而且
解析錯誤具有很少的信息
幾乎不報告錯誤所在的行號
具體原因就是當出現錯誤時
編譯器判定好幾行的語法看起來應該是有效的
直至遇到無效的語法
最可能的情形就是表達式中使用了預定義的字詞
例如;
while =
; // Bad ? while 就是一個預定義字詞
不能分配給一個值
預定義的字詞包括 while
function等
如果PHP使用 uses to evaluate your code
您不能使用這些預定義字詞來命名變量
而且如果您非要這樣做的話
PHP就會報出更多的錯誤
這是您無法忍受
關於這個問題
下面的示例可能會對您有所幫助
請咨詢閱讀一下下面所示的PHP 代碼
$b = somevalue
if($b == somevalue){
print Hello world!;
}
?>
錯誤位於$b =一行(在語句的末端缺少分號)
所以錯誤應該是解析錯誤:第
行缺少分號對吧?而不應該依據解析器判定的
Parse error: parse error
unexpected T_IF in c://program files//apache
group//apache//htdocs//ereg
php on line
在第
行
if() 語句的語法是正確的
那麼
編譯器是被什麼給搞糊塗了呢?線索就是unexpected T_IF 部分
出現 unexpected T_???錯誤時
它所表示的含義為
編譯器發現在預定義字不應該出現的位置出現
T_IF 代表 if()
T_WHILE 代表 while()
T_FOR 代表 for()等
值得慶幸的是
一些錯誤的原因也很簡單
語句沒有使用分號(;)結束
比如上面的示例
字符串中缺少引號
其他一些常見的錯誤
我見過的最常見的錯誤就是
當沒有使用大括號( } )結束一個函數或者一個循環時出現的錯誤
這很可能是最常見
最讓人煩的錯誤
具體代碼如下
function UselessFunction() {
for($i <
; $i <
; $i++){
}
將產生下列錯誤
Parse error: parse error
unexpected $ in c://program files//apache
group//apache//htdocs//ereg
php on line
由於函數 UselessFunction 沒有使用大括號( } )來結束
PHP編譯器不斷查找表示結束的大括號直至到達文件末尾為止
因為編譯器未找到一個匹配的大括號
就會報告文件末尾處有錯誤
如果正確地反映了代碼的層次結構
錯誤信息就會變得非常明顯
如果沒有標明代碼的層次結構
那麼最後要想查清楚到底忘記了什麼也會變得幾乎是不可能的
所以
請記住
一定要標明代碼的層次結構
Tab鍵可以很容易地實現這一點
對後續的開發人員來說
把握代碼框架並對其進行修改也會更容易一些
MySQL 錯誤
另一極其令人討厭的錯誤信息就是最常見的MySQL錯誤
這常常使 PHP新手感到頗為頭疼
Warning: Supplied argument is not a valid MySQL result resource in
上面所報告有錯的一行可能是
while($row = mysql_fetch_array($result)) {
參數 $result並不是一個有效的資源
在英語中它表示因為查詢失敗
將無法處理mysql_fetch_array
任一查詢的語法無效(您應該將查詢復制
粘貼到MySQL 控制台參考來進行測試)
或者與數據庫的連接失敗(這種情況下您應該再次檢查用戶名和口令等)
防止錯誤發生
第一步
智能代碼器可采取以下幾步來消除下列錯誤出現
· 在每一條語句的末尾處
不必考慮添加分號——這應該成為一種習慣
· 總是要盡可能標明代碼的層次結構
這可以使您能夠查看是否忘記在if 調用或函數末端等位置添加大括號
· 請使用可突出顯示語法的編輯器(如 HTML
Kit)
有了這類編輯器的輔助
您就能確定是否忘記了添加引號
是否缺少分號等
From:http://tw.wingwit.com/Article/program/PHP/201311/21338.html