0

我需要一些帮助来处理 PHP 中的错误。我使用 MVC 模式开发了一个用于时间跟踪的软件。这意味着在控制器中完成所有工作之后,我会包含一些模板文件。这些 PHP 模板包含require_once $templatePath.$hash['template']['file']并包含 HTML 和 PHP 的简单混合。

现在我的问题是,在错误(不是异常)上,我的 HTML 输出已经被解析,直到错误发生。现在用户只能看到网站的一些片段。我设置了自己的错误处理set_error_handler( array($this, 'handleErrors') );,将错误写入我的数据库,然后停止 PHP 执行。

现在我想为用户提供一个干净的输出,但是到目前为止如何删除当前的输出?如果出现错误,我想为用户显示一个特殊的消息输出。如果这不起作用,我希望将用户重定向到静态 HTML 站点(模板)。

任何想法如何实现这一点?

编辑:我用我的函数处理的错误是例如警告使用不存在的数组键或关于不推荐使用的函数等的通知。

[8] Undefined index: email at ../users.tpl in line 51

通常这种错误不应该发生......但如果我想为用户提供一个很好的输出。

4

3 回答 3

0

据推测,您的所有输出最终都以字符串形式出现。因此,当我们谈论缓冲您的所有内容时,在非常高的级别上,我们谈论的是保留您的输出以在最后将其刷新给用户。我确信有一千零一种不同的方法可以做到这一点......但是让我们考虑一个非常基本的想法,并考虑 MVC 格式。

假设我有我的基本页面 index.php,通过它发送所有内容(通过 mod_rewrite 或类似方式)。index.php 是开始和结束;它启动对控制器的调用,并显示视图的结果。

如果我的 index.php 从调用控制器开始,该控制器可能是“用户”控制器,位于http://www.example.com/users。这当然是http://www.example.com/index.php?p=users,并且可能携带一些发布数据来查询数据库。

所以 index.php 可能看起来像:

<?
$buffer = file_get_contents( 'templates/header' );
$error = "";
// Load the "users" controller
$controller = $registry->loadController($_GET['p']);

// Returns false on error
$temp = $controller->getBiographyByName( $_POST['name'] )
if ($temp) {
  $buffer .= $temp 
} else {
  $error = "An error occurred while attempting to load Biography for ".$_POST['name'];
}
// do everything else...

if( $error !== "" ) print( $error );
else print( $buffer );

我试图让它尽可能简单,并假设有一些后台逻辑($registry)可以处理查找和加载正确的控制器。这些控制器将指示使用哪些模型,以及将哪些模板加载到视图中。这个想法是缓冲所有内容,并且仅在内容可以显示时才输出。

同样,这非常简化,但我希望它有所帮助。

于 2013-05-23T23:18:52.840 回答
0

在出现错误之前,我在内容渲染方面遇到了同样的问题,我尝试使用输出缓冲,但它似乎不起作用,所以我所做的就是将用户重定向到一个很好的错误页面,上面说发生了UNEXPECTED错误。在您的情况下,如果您选择使用我的方法,您显然会首先注册错误,然后重定向。

此致。

于 2013-05-23T22:56:16.680 回答
-1

使用输出缓冲: http: //php.net/manual/en/function.ob-start.php。在您希望向用户输出(任何 HTML、消息等)的第一个位置启动它。刷新(发送给用户)或清理(丢弃)输出缓冲区,具体取决于一切是否成功或是否存在错误以及您的错误函数是否被调用。

例如:

function handleErrors(){
    //whatever you're doing to log

    ob_end_clean();

    //Whatever you do to output your standard error page and stop execution.
}
于 2013-05-23T22:56:27.860 回答