我正在使用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;
}
}
答案 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 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();
// ...
}