2012-07-03 422 views
0

我寫了下面的代碼片段來處理錯誤。數據庫查詢錯誤,同時錯誤處理

(page.php文件被通過包括在索引頁:陣列(falseNamePage => page.php文件,.... ECT))

Perfoming一些測試,看看它是如何反應,予刪除一個頁面來自public_html的.php。

結果:

- 錯誤日誌確定

-alert電子郵件發送OK

- 記錄在DB:ERROR:

注意:未定義的變量:在/ home $數據庫/.../public_html/index.php on line 40

Warning:mysql_query()期望參數2是資源,null在第40行中的/home/.../public_html/index.php中給出「不可能與DB2連接」

我不明白爲什麼它連接失敗在這種情況下的數據庫併發回一個錯誤。

DB連接在所有其他情況下正常工作(刪除,選擇,更新,插入...)

function errorHandler($errno, $errstr, $errfile, $errline) 
    { 
    require_once('connection.php'); 
    $now = time(); 
    $date = date("Y-m-d H:i:s",$now);  
    switch ($errno) { 
     case E_NOTICE: 
     case E_USER_NOTICE: 
     case E_DEPRECATED: 
     case E_USER_DEPRECATED: 
     case E_STRICT: 

      ............ 5 first cases code............... 

     case E_WARNING: 
     case E_USER_WARNING:    

      $message_warning = "Warning : ".$errno." : ".$errstr." : ".$errfile." : ".$errline; 
      error_log ($message_warning ,0); 
      $mail = '[email protected]'; $sujet = $message_warning; $body_warning = $date." : ".$message_warning;        
      mail($mail,'=?UTF-8?B?'.base64_encode($sujet).'?=',stripslashes($body_warning)); 
      $query_warning =" INSERT INTO errorlog (severity,errno,errstr,errfile,errline,time) 
      VALUES ('WARNING','".$errno."','".$errstr."','".$errfile."','".$errline."','".$date."')";   
      $result_warning = mysql_query($query_warning,$database) or die("impossible to connect with DB2"); 
       break; 

     case E_ERROR: 
     case E_USER_ERROR: 

     ............... 2 last cases code .......... 
    }  
}  
set_error_handler("errorHandler"); 

最後一個問題是:

爲什麼是一個包含錯誤ECHOED 4次?

系統嘗試4次「打開流」嗎?

我所做的:

function errorHandler($errno, $errstr, $errfile, $errline) 
      { 
     if  ($errno == E_NOTICE) 
     { echo "<br/>".$errno."== E_NOTICE<br/>";} 
     if  ($errno == E_USER_NOTICE) 
     { echo "<br/>".$errno."== E_USER_NOTICE<br/>";} 
     if  ($errno == E_DEPRECATED) 
     { echo "<br/>".$errno."== E_DEPRECATED<br/>";} 
     if  ($errno == E_USER_DEPRECATED) 
     { echo "<br/>".$errno."== E_USER_DEPRECATED<br/>";} 
     if  ($errno == E_STRICT) 
     { echo "<br/>".$errno."== E_STRICT<br/>";} 
     if  ($errno == E_WARNING) 
     { echo "<br/>".$errno."== E_WARNING<br/>";} 
     if  ($errno == E_USER_WARNING) 
     { echo "<br/>".$errno."== E_USER_WARNING<br/>";} 
     if  ($errno == E_ERROR) 
     { echo "<br/>".$errno."== E_ERROR<br/>";} 
     if  ($errno == E_USER_ERROR) 
     { echo "<br/>".$errno."== E_USER_ERROR<br/>";} 
      }    
      set_error_handler("errorHandler"); 

結果:

2 == E_WARNING

2 == E_WARNING

2 == E_WARNING

2 == E_WARNING

+0

$ database是在connection.php中定義的? – powtac

+0

是$ database代表PhpMyAdmin中的「database」(常數名稱) – SunnyOne

+0

PHP的'mysql_ *'函數[已棄用](http://www.php.net/manual/en/faq.databases.php#faq.databases .mysql.deprecated)。 [建議的替代品](http://www.php.net/manual/en/mysqlinfo.api.choosing.php)也恰好是[更安全地使用](http://stackoverflow.com/a/60496/132382)。 – pilcrow

回答

0

你的問題很簡單,在我看來,它是YAPHPB:你在一個函數定義中使用require_once,希望該文件只包含一次 - 以形成函數的主體。

但是它不能這樣工作:這段代碼每次都會被解析(好吧,它有點簡化了,但其原因仍然相同)函數會被調用。因爲它是require_once,所以你的文件將只包含一次 - 只有在第一次調用該函數時。所有下一次調用將跳過該文件的包含,因此$數據庫不會被定義。

修復它的最簡單方法是用require替換require_once。但我認爲這個問題將會被涵蓋 - 但是沒有解決。真正的解決方案是重構你的代碼,使得你的$database實際上將成爲註冊表中的一個記錄 - 並且如果需要將會從該註冊表中被輕鬆提取。

有很多方法可以實現這種行爲:我們經常使用Zend_Registry組件。在this topic中有一些如何有效使用這個組件的例子。

+0

嗯,我剛剛使用了REQUIRE而不是required_once。在DB = OK記錄(但是我得到死亡(消息))。郵件發送=確定。但是......我在每個代碼塊中回顯自己的錯誤處理消息,並且我得到了4次我的自定義錯誤消息,儘管放置在不同的開關情況下。 AND Error logging出現4次...感謝您的幫助。 – SunnyOne

+0

你是什麼意思'錄音是好的,但死'執行'? – raina77ow

+0

3次這一個:[03-Jul-2012 11:27:12 UTC]警告:2:include(file.php)[0function.include0]:未能打開流:沒有這樣的文件或目錄:/ home /。 ../public_html/index.php:627 1次: [2012年07月03日11:27:12 UTC]警告:2:include()[0function.include0]:打開'file.php'失敗(include_path ='。:/ usr/lib/php:/ usr/local/lib/php'):/home/.../public_html/index.php:627 !真的很奇怪! – SunnyOne

0

當在connection.php中沒有函數定義和常量定義時,使用require而不是require_once

由於require_ 一次爲,所以當函數被第二次調用時,變量$數據庫將不可用。這裏設計的有點不好。

一個解決方案是將$數據庫作爲一個常量,因此無論connection.php是第一次還是第二次都包含,它就像一個全局變量。

+0

3次這一個:[03-Jul-2012 11:27:12 UTC]警告:2:include(file.php)[0function.include0]:未能打開流:沒有這樣的文件或目錄:/ home /。 ../public_html/index.php:627給出=>插入數據庫的3倍倍數////// 1次:[03-Jul-2012 11:27:12 UTC] Warning:2:include()[0function (include_path ='。:/ usr/lib/php:/ usr/local/lib/php'):/home/.../public_html/index.php:無法打開'file.php' 627 => die()在這一個。看來每個交換機發出錯誤號碼[2]。 – SunnyOne

+0

你確定自己寫了這個「snippet」還是你複製了它? – powtac

+0

我發現了這段代碼的一些部分,並將它轉換成比它做得更多。 – SunnyOne

1

也許connection.php之前已經包括在內,所以當你在代碼中使用require_once,它又包括connection.php。然後,$database變量將不會被定義,並且您將收到該錯誤消息。