修复PHP警告/错误

时间:2011-12-17 16:22:53

标签: php error-handling

有时我的脚本会产生错误,主要是警告。 我有时会想到为什么会发生这种情况,但我也不知道为什么会发生这种情况。

现在我的问题:如果显示警告,我可以看到变量中的内容吗?

  

“警告:在......”中为foreach()提供的参数无效;

我收到此消息但没有任何线索,变量中有什么。 问题是,它是一个运行几个小时的脚本,具有不同的数据,因此很难重现它。因为,我不知道变量中有什么。

我需要这种警告/错误/通知/致命错误等。

感谢您的帮助。

P.S。

4 个答案:

答案 0 :(得分:1)

你有一整篇专门针对错误的php:http://www.php.net/manual/en/book.errorfunc.php

来自php手册:http://www.php.net/manual/en/function.set-error-handler.php

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }

    switch ($errno) {
    case E_USER_ERROR:
        echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
        echo "  Fatal error on line $errline in file $errfile";
        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
        echo "Aborting...<br />\n";
        exit(1);
        break;

    case E_USER_WARNING:
        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
        break;

    case E_USER_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;

    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    /* Don't execute PHP internal error handler */
    return true;
}

答案 1 :(得分:0)

有很多警告/错误,通常你应该只应用逻辑。

Warning: Invalid argument supplied for foreach() in ....

这意味着foreach中的某些变量无效:

foreach ($array as $value)

foreach ($array as $key => $value)

如果您的脚本与该确切语法不匹配,或者$ array不是实际数组,则会触发错误。

答案 2 :(得分:0)

为日志记录的长期使用设计一个debbuging变通方法并不容易。基本上在这种情况下,您需要使用:

调整特定的foreach
foreach (must_be_array($var) as $whatever) ...

然后定义断言函数:

function must_be_array($var) {
     if (is_array($var)) return $var;

     print_r(array_slice(debug_backtrace(), 1));

     // return array();    // to remove now redundant warning
}

debug_backtrace提供了额外的上下文信息(称为函数和参数可能会有所帮助)。但是它不会告诉你数组变量应该是什么。它仍然是一个空变量。

答案 3 :(得分:0)

查看set_error_handler()debug_backtrace()

此外,如果有一个特定的行/ foreach循环定期产生此错误,请在它之前的行上添加类似这样的代码......

if (!is_array($shouldBeAnArry)) {
  // log something here, including data about the variable
  // from var_dump(), debug_backtrace() etc etc
} else {
  // do the loop
}

所有错误/警告等都是如此 - 如果弹出错误,请添加一些验证以在之前对线路上的错误原因进行反击。