gpt4 book ai didi

php - 在 php 中调试程序 - 如何显示错误?

转载 作者:搜寻专家 更新时间:2023-10-31 21:10:09 27 4
gpt4 key购买 nike

如何让 php 在 PRG (POST-Redirect-GET) 段内出现非 fatal error 时停止,这样您就可以看到错误消息,而无需用于重定向的后续 header() 消除错误消息?

Example 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 的错误,但随后会继续移动,点击 header() 并丢弃错误输出,因此您永远不会在屏幕上看到错误消息。

您可以暂时在标题之前放置一个die;(或exit;),或者注释掉标题以测试代码。然后,当代码运行时,取出 die; 或将 header 放回原处。但这在开发中效果不佳,因为我发现有很多次错误出现在我身上甚至不知道在那里。

有时您可以将标题向上移动到可能发生错误的位置上方。然而,在更一般的情况下,需要能够将查询字符串传递到 GET 部分,因此 header 必须位于 POST 部分的底部。

我认为这可能是 php 所说的 E_WARNING,“运行时警告(非 fatal error )。脚本的执行没有停止。”,但我不确定。

我正在运行 5.4.23:

error_reporting = E_ALL | E_STRICT
display_errors = "On"
log_errors = "On"
ignore_repeated_errors = "Off"

[我尝试删除的所有内容。 jack 在下面有答案。]

最佳答案

首先,您应该假设一切顺利,因此重定向应该发生在 inside 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;
}

关于php - 在 php 中调试程序 - 如何显示错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21819249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com