在PHP中调试PROGRAM - 如何显示错误?

时间:2014-02-17 01:27:58

标签: php

如何让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"

[我尝试删除的所有内容。杰克的答案如下。]

2 个答案:

答案 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']; 您可以查看输入是否为空:在被标题();

重定向之前