在我的functions.php中,我在网站的页面模板中使用了一组函数。我想知道处理错误的最佳方法是什么。目前,我的functions.php看起来像这样:
// include database
require_once 'system/db.php';
// Functions
// =========
function getUrlsPhotos($db, $resultId) {
$query = "SELECT * FROM pictures WHERE result_id=$resultID ORDER BY id ASC";
$results = $db -> query($query);
// Was there an error?
if ($db -> error) {
$output = 'error_getting_photos';
} else {
// loop for getting photos... ... ...
$output = $array_photos;
}
return $output;
}
function getActivityName($db, $activitiesId) {
$query = "SELECT * FROM activities WHERE id=$activitiesId LIMIT 1";
$results = $db -> query($query);
if ($db -> error) {
$output = 'db_error_getting_activityname';
} else {
$result = $results -> fetch_assoc();
$output = $result;
}
return $output;
}
我的目标是以某种方式查看是否发生了错误,当然用户没有看到错误。处理所有功能错误的有效方法是什么?我需要初始化什么?
--- 编辑: ---
阅读有关错误处理的更多信息,我想出了以下用于在我的数据库中存储错误的脚本:
<?php
function errorHandler($errno, $errstr, $errfile, $errline) {
static $db;
if (empty($db)) {
$db = new PDO(DSN, DBUSER, DBPASS);
}
$query = "INSERT INTO errorlog (severity, message, filename, lineno, time) VALUES (?, ?, ?, ?, NOW())";
$stmt = $db->prepare($query);
switch ($errno) {
case E_NOTICE:
case E_USER_NOTICE:
case E_DEPRECATED:
case E_USER_DEPRECATED:
case E_STRICT:
$stmt->execute(array("NOTICE", $errstr, $errfile, $errline));
break;
case E_WARNING:
case E_USER_WARNING:
$stmt->execute(array("WARNING", $errstr, $errfile, $errline));
break;
case E_ERROR:
case E_USER_ERROR:
$stmt->execute(array("FATAL", $errstr, $errfile, $errline));
exit("FATAL error $errstr at $errfile:$errline");
default:
exit("Unknown error at $errfile:$errline");
}
}
set_error_handler("errorHandler");
我的问题:
答案 0 :(得分:1)
使用set_error_handler
并创建一个(理想情况但不是必需的)类来处理错误。
set_error_handler(array("ErrorHandling", "doHandleErrors"), E_USER_ERROR | E_NOTICE | E_USER_NOTICE | E_ERROR);
注意: 这不会捕获致命错误。要处理致命问题,我会使用register_shutdown_function()
。
你的课将是这样的;
<?php
class ErrorHandling {
//Methods need to be static
public static function doHandleErrors($strErrorCode, $strErrorMsg, $strErrorFile, $intErrorLine) {
//Handle errors.
//Depending on the $strErrorCode, you would either display the message, or display a http status code 500 & direct to a 500 error page.
//Depending on the severity of the error, e-mail your programmers.
//Try not to display any errors to the consumer/user
//Make the error something like "Ooops, something went wrong." and not "An error occured on file.php, line 23."
//But that may be more a question for UX.se
}
}
放置此错误处理函数以便对我的所有php函数有效的最佳位置是什么?将它放在我的functions.php的开头就足够了吗?
在建立数据库连接之前,我会将set_error_handler(array("ErrorHandling", "doHandleErrors"), E_USER_ERROR | E_NOTICE | E_USER_NOTICE | E_ERROR);
放在您的主“脑文件”中,这样我们就可以使用您的自定义错误处理程序来处理数据库连接问题。
此解决方案的一个缺点当然是,如果数据库已关闭,则无法获得通知。在这种情况下,如何获得通知电子邮件?
使用自定义错误处理程序,您可以捕获错误/异常并通过电子邮件发送给程序员,然后优雅地终止该过程,向最终用户显示500 Internal Server Error
或503 Service Unavailable
页面。
答案 1 :(得分:0)
您可以在php中使用 set_error_handler 进行自定义错误处理
检查更多
http://php.net/manual/en/function.set-error-handler.php