在PHP错误日志中包含$ _POST,$ _GET,$ _SERVER值

时间:2011-08-05 18:18:44

标签: php

我有这样的代码

try {
    header("Location: http://www.google.com\n-abc");
}
catch (Exception $e) {
    error_log(print_r($_POST, true));
    error_log(print_r($_GET, true));
    error_log(print_r($_SERVER, true));
}

没有try {} catch {}块,我可以在error_log中看到POST,GET和SERVER变量,但是使用try {} catch {}块,我只看到默认的PHP错误。

  1. 有没有办法在try {} catch {}块中显示POST,GET和SERVER变量?
  2. 有没有办法让PHP包含POST,GET和SERVER变量用于记录到文件的所有错误,而不仅仅是我添加了error_log的任何地方(print_r($ _ POST,true)); ....?

6 个答案:

答案 0 :(得分:2)

try / catch用于当你想抛出异常以防止php致命错误杀死页面或者使调试更容易时,一般来说。这就是你如何使用try / catch:

try {
    if($a === true)
    {
        header("Location: http://www.google.com\n-abc");
    }
    else
    {
        throw new Exception('$a was not true');
    }
}
catch (Exception $e) {
    error_log(print_r($_POST, true));
    error_log(print_r($_GET, true));
    error_log(print_r($_SERVER, true));
    echo $e->getMessage(); // $a was not true
}

您在示例中的catch块中没有看到错误日志的原因是因为您从未抛出异常,因此PHP永远不会查看该catch块以记录您的变量。

如果你只是想让你的例子工作,你只需抛出异常就可以在那个catch块中获得PHP:

try 
{
    throw new Exception('redirecting...');
}
catch (Exception $e) 
{
    error_log(print_r($_POST, true));
    error_log(print_r($_GET, true));
    error_log(print_r($_SERVER, true));
    header("Location: http://www.google.com\n-abc");

}

虽然这很愚蠢:))

答案 1 :(得分:1)

但像header这样的默认PHP函数不会抛出异常。

如果您希望它们抛出异常,则需要将错误处理程序设置为使用ErrorException

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

答案 2 :(得分:0)

我认为你在这里有一些问题/问题。

首先,try / catch块用于异常。 catch {}代码仅在抛出指定类型的异常时执行。

其次,header()函数不会抛出异常。相反,它只是直接生成PHP错误。

第三,要记录所有错误的变量,请查看set_error_handler(),这也应该解决上面的第二个问题。

答案 3 :(得分:0)

try / catch仅在您使用实际抛出异常的对象时才有效。 header()不是一个对象,永远不会抛出异常。就像我在回答your previous version这个问题时所说的那样,你需要设置一个自定义错误处理程序。

答案 4 :(得分:0)

这就是try / catch应该如何工作:catch块在try块中抛出异常时执行(仅在这种情况下)。

如果已经发送了标题,header()函数可能会生成警告,但它永远不会抛出异常。

回答你的问题:

  1. 你的catch块很好但你需要的代码实际上可以抛出异常(通常是面向对象的代码,但不一定)。但是,如果使用set_error_handler()创建自定义错误处理程序并在其中使用throw,则可以将PHP配置为将常规错误转换为异常。

  2. 与上述相同:set_error_handler()set_exception_handler()

答案 5 :(得分:0)

听起来你想在抛出错误时将一些额外的信息输出到你的日志中。您应该检查PHP中的自定义错误处理。您可以定义处理脚本中错误的特定方法,并添加默认情况下不存在的功能。PHP Set error handler

相关问题