2016-08-23 18 views
0

私はmysqli操作のためにBennett Stone php wrapperクラスを使用しています。クラスは何の問題もなく正常に動作しています。その中には、mysqliエラーのある種類の電子メールを管理者に送信する機能(以下で共有)があります。クラス内にPHPスクリプト名を投げてエラーが発生する

問題

このクラスを使用してスクリプトの100ののがありますが、私は、任意の特定のエラーがスローされたスクリプトを見つけることができないのです。

は私が

をしたい私は、クエリが元の場所からのクラスの内部エラー元のスクリプトのフルパスを取得したいです。例えば、test.phpにはクエリ&が含まれています。何らかのエラーが出てきたら、エラー処理の中でtest.phpの完全なパスとエラーの詳細(以下で共有します)が必要です。機能

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; 
    } 
} 
を扱う

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 

がエラー:私は私はこのような詳細情報を取得しています私自身の

によって行うことができます

クラスの変更を行うことができますどのような

+3

[debug_backtrace](のhttp:/ /php.net/debug_backtrace)が役に立ちます。 –

+0

@JonStirlingの状態 - [Debug Backtrace](http://php.net/debug_backtrace)は、ここで私が以下に述べたように@Martin – Martin

+0

を探検したいものです。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"のものはすべて破棄されますが。

問題が解決しました。

NB。このラッパークラスはひどいです。ほぼすべての悪い習慣が存在する。

+0

クラスにはこれが含まれています - mysqli_report(MYSQLI_REPORT_STRICT); - inside - パブリック関数__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.例外を適切に捕捉することは、例外メカニズムの考え方を変える恐ろしい習慣です。 –