【发布时间】:2012-06-30 19:40:52
【问题描述】:
m 维护一个项目,该项目必须兼容 PHP 4.X 到 5.2。该项目有几个错误没有得到很好的处理。
我想要做的是将用户重定向到一个“不错的”错误页面,并将错误记录在数据库中。为了跟踪用户、文件和错误消息。到目前为止,这是我尝试过的:
set_error_handler("myErrorHandler");
/**
*My function to handle errors
*/
function myErrorHandler( $errno , $errstr , $errfile="nofile" , $errline=0 , $errcontextArray=NULL ){
session_start();
if (!isset($errno)|!isset($errstr)) {
exit(0);
}
if (!mysql_ping()) {
require '../Connection/databaseinfo.php';
}
$id_user = $_SESSION['ident'];
$errstr = GetSQLValueString($errstr, "text");
$errfile = GetSQLValueString($errfile, "text");
$errline = GetSQLValueString($errline, "int");
$sql = "insert into error_history
(id_user, message, file, line)
values ($id_user, $errstr, $errfile, $errline)";
mysql_query($sql) or die (mysql_error());
// header("location:error.php"); ---> I can't (see comment below)
echo "<script type='text/javascript'> window.location.href='error.php';</script>";//Redirection dégueulasse //TODO: trouver mieux
return true;
}
为什么不header()?因为错误可以在页面中的任何位置触发,因此标头已经发送。
为什么不把header() 和obstart(), ob_flush() 放在一起呢?因为已经有很多页面在生产中,我不能全部修改。
我的问题是:
- 我做错了吗?
- 有没有更好的方法来处理 重定向?
【问题讨论】:
-
鉴于您的限制,我认为没有更好的方法。你显然不能通灵并在错误之前失败,所以你能做的最好的就是尽早失败。另一种选择是完成页面加载,并带有通过 CSS 启用的大橙色 ERRORS WERE ENCOUNTERED 横幅,或通过相同类型的 javascript 进行修改,但如果您的页面数据库繁重,这可能是高度未定义的。
-
请问这些错误究竟是什么?我更喜欢以这样一种方式组织我的代码,即任何可能导致严重错误以要求中止的处理都在我输出任何东西之前完成(如果可能的话)(我接受它并不总是如此),你可能会问错误的问题(也许问题应该是“我怎样才能首先防止这些错误发生?”)。以上可能是最好的方法,但在我在这方面发表意见之前,我更愿意看看你可能会遇到什么错误。
-
谢谢,我也想知道
meta refresh=0;url=error.php。但我不确定。 -
@DaveRandom 表单输入多为空,
$_GET参数错误。由于项目足够大,一些旧页面是使用 erm Dreamwaver 编码的。所以代码肯定缺乏控制。我希望这个错误处理系统能够帮助我找到受影响最大的页面并进行调试。 -
很公平,在这种情况下,我认为您可能走的是最佳路线。浏览器在正确处理
<head>之外的<meta>重定向方面可能会出现问题,但<script>方法在这些日子里几乎无处不在。
标签: php mysql error-handling php4