2010-07-26 88 views
1

当我做重定向时,不显示错误。 我用笨的框架,并在我的index.php文件有重定向前显示错误

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

。 当我的代码中发生某些事情时(例如某些'未定义索引'错误),并且我重定向到另一页时 - 错误未显示。如何避免这种情况 - 打破重定向并显示错误?

重定向功能只是一个简单的标题:

header('Location: ' . $uri); 

我假定这是一件与输出缓冲器连接。我试图用ob_start()打开缓冲区(在index.php中),但没有任何反应。

谢谢。

+0

我有同样的问题。以前,我会得到一个“头文件已发送”警告,除了错误本身,这很好。 – scribu 2011-08-24 22:02:59

回答

1

我采取的方法是使用自定义错误处理程序,该错误处理程序在任何错误时抛出异常;这确保我在开发过程中不会遗漏任何东西。抛出异常将导致您的代码立即中止,因此避免重定向。对于生产站点,我禁用了这个功能(当然也禁用了display_errors)。我已经包含了简单的代码来做到这一点。

/** 
* Function to throw exceptions on any errors. 
*/ 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    // Ignore suppressed errors 
    if (error_reporting() == 0) { 
     return; 
    } 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 

// Report ALL errors 
error_reporting(E_ALL | E_STRICT | E_NOTICE); 
// Enable error display 
ini_set('display_errors', 1); 
// Set the error handler 
set_error_handler('exception_error_handler'); 

请注意,这应该在脚本执行过程中尽早完成,以捕获所有错误。另请注意,error_reporting()调用可能会导致太多的错误报告给您;我们发展到一个非常严格的标准,我发现即使是E_NOTICE类型的错误也会抛出异常,这为我节省了很多痛苦,但这取决于您。

+0

谢谢,但它并不适合我:( exception_error_handler工作()甚至不叫我,(我试过在它的开头模具())正如我在这个问题提到的 - 我不看到“通知”的错误... // PS我已经尝试了一些代码和它似乎并没有显示甚至警告封邮件 – DCrystal 2010-07-26 11:21:49

+1

笨可以安装自己的错误处理程序 - 看到这个以获取更多信息 - HTTP:// codeigniter.com/user_guide/general/errors.html – 2010-07-26 11:35:31

+0

再次感谢,我只是忘了这... – DCrystal 2010-07-26 11:47:07

1

在您的application/config/config.php文件中,您需要设置错误报告级别以捕获php错误。

一旦这个选项是所有的php错误应记录在系统/日志文件夹。

因为重定向功能使用标题重定向,所以没有内容(甚至错误)发送到浏览器,否则您的重定向将停止工作。

编辑: 至于我可以看到你想要做1 3件事:

选项1 显示错误并没有做任何重定向的。如果是这种情况,只需从错误处理程序中删除重定向功能即可。

选项2 显示错误但在一段时间后重定向。如果这是你看着做不同类型的报头重定向的情况:

header("refresh:5;url=/somewhere/else"); 

这将5秒后浏览器重定向到某个地方/人。

选项3 有条件地做重定向(如果在开发中显示错误,如果不是在开发中则不显示错误)。

为此,向Code Igniter错误处理程序添加条件语句以测试您是否处于发展模式,或检查您的IP,然后根据这些进行重定向。

这是那种你正在寻找做的事情吗?或者更像是只有重定向,如果没有PHP错误?如果是这样,你从哪里调用重定向功能?

+0

我在问题中提到,我在index.php中使用error_reporting(E_ALL)。在文件中的Loggin是不适当的方式我的情况 - 因为我想看到的错误,同时测试的东西 的主要目的是阻止重定向和@EI雅博建议用例外的情况 - 虽然我不认为这是最好的办法,我仍然确信它是与输出缓冲水平... – DCrystal 2010-07-26 13:16:10

+0

是的,我想只做一个重定向,如果没有errors.Redirect函数是从控制器调用。 现在我只需要添加条件重定向功能,如果ob_get_contents()不为空 - >我不这样做重定向.. – DCrystal 2010-07-27 08:22:12

0

默认情况下,你会得到一个“无法修改标题信息 - 已经发送了头......”。如果你没有得到这个,这意味着有一个自定义的错误处理程序。

为了使重定向停止遇到错误时,要么完全删除错误处理程序,或调用flush()在它的结束:

function my_error_handler($errno, $errstr, $errfile, $errline) { 
    // error handling code 

    flush(); 
} 
set_error_handler('my_error_handler');