得到错误在类中抛出php脚本名称

时间:2016-08-23 08:31:14

标签: php mysql mysqli

我正在使用Bennett Stone php包装类进行mysqli操作。班级工作正常,没有任何问题。其中有一个函数(下面分享),它向管理员发送任何类型的mysqli错误。

问题

有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<noreply@'.$_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;   
    }
}

2 个答案:

答案 0 :(得分:2)

将这些行放在代码上方的某处:

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。这个包装类很糟糕。利用几乎所有存在的不良做法。

答案 1 :(得分:-1)

您可以执行的操作是捕获异常并编辑错误消息,其中包含magic php constPHP: 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();
    // ...
}