如何让php停止PRG(POST-Redirect-GET)段内的非致命错误,这样您就可以看到错误消息,而不会使用后续的header()来重定向消除错误消息?
示例Caller.htm
<form method="post" action="Callee.php">
<input type="text" name="PostData" />
<input type="submit" value="Go" />
</form>
示例Callee.php:
<?php
// POST section:
if($_POST) {
$var = $x; // non-fatal error: $x is missing.
header("Location: ". $_SERVER['REQUEST_URI']. 'Query'); die; // Redirect & GET
}
// GET section
// ...
当测试时,php会报告缺少的$ x的错误,但随后继续移动,点击标题()并丢弃错误输出,因此您永远不会在屏幕上看到错误消息。
您可以在标题前暂时放置die;
(或exit;
),或者注释标题以测试代码。然后当代码工作时取出die;
或重新插入标题。但这在开发中效果不佳,因为我发现错误多次出现,我甚至没有知道在那里。
有时您可以将标题向上移动到可能发生错误的位置。但是,在更一般的情况下,需要能够将查询字符串传递给GET部分,因此标题必须位于POST部分的底部。
我认为这可能是php调用E_WARNING,“运行时警告(非致命错误)。脚本的执行没有停止。”,但我不确定。
我正在运行5.4.23:
error_reporting = E_ALL | E_STRICT
display_errors = "On"
log_errors = "On"
ignore_repeated_errors = "Off"
[我尝试删除的所有内容。杰克的答案如下。]
答案 0 :(得分:2)
首先,您应该认为事情是正确的,因此重定向应该在内部 try
范围内进行:
if($_POST) {
try{
$var = $x; //BAD CODE, $x is missing.
header("Location: ". $_SERVER['REQUEST_URI']); // Redirect & GET
} catch (Exception $e) {
echo $e->getMessage();
}
exit;
}
现在,如果您希望代码在警告和通知上抛出异常,请查看ErrorException
并定义一个自定义错误处理程序,将其转换为异常:
function exception_error_handler($errno, $errstr, $errfile, $errline )
{
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
以上代码摘自文档。
最好,您需要使用错误记录器(related question):
// ...
} catch (Exception $e) {
$logger->fatal($e); // or $this->fatal($e);
}
将它们放在一起
function exception_error_handler($errno, $errstr, $errfile, $errline )
{
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
if($_POST) {
try{
$var = $x; //BAD CODE, $x is missing.
header("Location: ". $_SERVER['REQUEST_URI']); // Redirect & GET
} catch (Exception $e) {
echo $e->getMessage(); // or log the exception
}
exit;
}
答案 1 :(得分:0)
尝试回复您的输入;
echo $ _SERVER ['REQUEST_URI']; 您可以查看输入是否为空:在被标题();
重定向之前