2010-08-19 39 views
1

在以前的票我asked about logging PHP errors in MySQL這給了我:PHP error_log中錯誤的MySQL

function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
     // mysql connect etc here... 
    $sql = "INSERT INTO `error_log` SET 
      `number` = ".mysql_real_escape_string($errno).", 
      `string` = ".mysql_real_escape_string($errstr).", 
      `file` = ".mysql_real_escape_string($errfile).", 
      `line` = ".mysql_real_escape_string($errline); 
    mysql_query($sql); 
    // Don't execute PHP internal error handler 
    return true; 
} 

// set to the user defined error handler 
$new_error_handler = set_error_handler("myErrorHandler"); 

我可以做這個工作,但只有當它是triggerred這樣的:

trigger_error("message here"); 

不過,我也想要錯誤處理程序被稱爲所有錯誤,如語法錯誤,如:

echo "foo; 

但是,這些錯誤是剛剛輸出到屏幕上,我做錯了什麼?

+0

我可以問你爲什麼要記錄這樣的錯誤嗎? – Chris 2010-08-19 19:25:21

+1

你不能用php錯誤處理程序處理不可捕捉的致命錯誤(並且語法錯誤是一個不可捕捉的致命錯誤)。這是不能做到的。 – ircmaxell 2010-08-19 19:30:39

+0

我想在系統中捕獲任何錯誤,而無需做任何其他更改。目前語法錯誤將意味着根本沒有任何報告 – robjmills 2010-08-19 19:32:22

回答

2

您只能使用自定義錯誤處理程序處理運行時錯誤。您的示例中的echo "foo錯誤發生在解析(即讀入)源文件中。由於PHP無法完全解析代碼,因此它也無法運行錯誤處理程序。

1

如果你不得不測試,如果語法正確,你可以用php_check_syntax功能,用文件名參數PHP Manual php_check_syntax

php_check_syntax還提供使用時會被錯誤字符串進行填充,至於第二個參數,女巫我記得

+0

我使用php_check_syntax魔術自動加載功能,當代碼在開發中時,它在許多問題上有很大幫助,在某些情況下不可捕捉(框架錯誤處理遠不是好的):) – canni 2010-08-19 19:49:50

0

這確實是錯誤日誌

  1. 的可怕的方式不需要不數據庫的一個優勢。你會爲特定的行號進行數據庫查找嗎?或者按文件名排列你的結果?數據庫本身就是許多錯誤的主體。
  2. 您已經被告知,在程序邏輯級別上捕獲解析錯誤是不可能的,因爲語法錯誤的程序永遠不會運行。

讓我們以您的代碼爲例。它會引發一個你永遠不會看到的MySQL錯誤(因爲查詢結構不完整)。以及發生任何其他錯誤。這就是我正在談論的。