2016-08-23 38 views
0

我正在使用Bennett Stone php包裝類進行mysqli操作。班級工作正常,沒有任何問題。裏面有一個函數(在下面分享),它發送一封電子郵件給管理員,用於任何類型的mysqli錯誤。得到錯誤在類內部拋出php腳本名稱

問題

有使用這個類的腳本100的,我無法找出哪些腳本拋出的任何特定的錯誤。

我想

我想要得到錯誤源於劇本的內部類從那裏起源查詢的完整路徑。例如,test.php包含查詢&後執行,如果任何錯誤出來,然後我想錯誤處理函數內的test.php的完整路徑以及錯誤細節(下面共享)。

我能做些什麼

類修改我可以用我自己的

我得到的信息是這樣做的:

Error at 2016-08-23 05:44:18: 
Query: SELECT email FROM users WHERE 
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 

錯誤處理功能

public function log_db_errors($error, $query) 
{ 
    $message = '<p>Error at '. date('Y-m-d H:i:s').':</p>'; 
    $message .= '<p>Query: '. htmlentities($query).'<br />'; 
    $message .= 'Error: ' . $error; 
    $message .= '</p>'; 

    if(defined('SEND_ERRORS_TO')) 
    { 
     $headers = 'MIME-Version: 1.0' . "\r\n"; 
     $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
     $headers .= 'To: Admin <'.SEND_ERRORS_TO.'>' . "\r\n"; 
     $headers .= 'From: systems<[email protected]'.$_SERVER['SERVER_NAME'].'.com>' . "\r\n"; 

     mail(SEND_ERRORS_TO, 'Database Error', $message, $headers); 
    } 
    else 
    { 
     trigger_error($message); 
    } 

    if(!defined('DISPLAY_DEBUG') || (defined('DISPLAY_DEBUG') && DISPLAY_DEBUG)) 
    { 
     echo $message; 
    } 
} 
+3

[debug_backtrace(HTTP:/ /php.net/debug_backtrace)可能會幫助你。 –

+0

由於@JonStirling的狀態 - [Debug Backtrace](http://php.net/debug_backtrace)是你想要在這裏探索的 – Martin

+0

@Martin,如下所述,PHP中的例外默認提供了一個堆棧跟蹤,因此存在無需手動編寫任何代碼。 –

回答

1

把這些線以上所有代碼的地方:

ini_set('display_errors', 0); 
ini_set('log_errors',  1); 
error_reporting(E_ALL); 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

,你將有記錄有堆棧跟蹤每個錯誤。雖然所有這些濃密的「log_db_errors」內容都將被丟棄。

問題解決了。

注意:這個包裝類非常糟糕。利用幾乎所有存在的不良習慣。

+0

class do contains - mysqli_report(MYSQLI_REPORT_STRICT); - 內部 - 公共函數__construct()。你想讓我將MYSQLI_REPORT_ERROR和MYSQLI_REPORT_STRICT一起添加嗎?我無法在現場服務器上測試,因此我只是想確定一下。 –

+0

是的,確切地說。這是按照我的答案書寫的方式進行操作的關鍵。您可能還需要添加'ini_set('display_errors',0);'以確保沒有任何內容會寫入畫面 –

+0

ok。謝謝。讓我來驗證一下。 –

-1

你可以做的是捕獲異常,並修改錯誤信息,使用一些magic php const它:PHP: Magic constants

例子,在你的班上,圍繞查詢:

try { 
    // your query 
} catch (Exception $e) { 
    // launch your log_db_errors() function, with some of const, like __CLASS__, __LINE__, etc : 
    $error = '[' . __FILE__ . '][' . __CLASS__ . '::' . __FUNCTION__ . '][' . __LINE__ . '] : ' . $e->getMessage(); 
    // ... 
} 
+1

1.捕捉從未拋出的異常沒有意義。 2.所有這些信息已經存在於例外情況中,因此沒有必要手寫它。 3.捕捉例外權利是一種可怕的做法,扭曲了例外機制的整體觀念。 –

相關問題