gpt4 book ai didi

php - 当display_errors=0并且页面有错误时如何防止页面损坏?

转载 作者:行者123 更新时间:2023-12-02 05:55:35 25 4
gpt4 key购买 nike

晚上好,
当 display_errors=0 并且页面有错误并且我不知道什么“条件、代码等...”会导致这些错误时,如何设置自定义错误或防止页面损坏?
例如,在这段代码中:

<?php
/////////////////////////////////////////////
ini_set("display_errors" , "0");
/////////////////////////////////////////////
$html = '
<table>
<tr>
<td><img src="img0.gif" /></td>
<td><img src="img1.gif" /></td>
<td><img src="img2.gif" /></td>
</tr>
</table>
';
/////////////////////////////////////////////
$dom = new domDocument();
$dom -> loadHTML($html);
$xpath = new domXPath($dom);
/////////////////////////////////////////////
$query = $xpath->query('.//table/tr/td');
$image = $query->item(1000000000); // <<---- item number
$img_src = $image->getElementsByTagName('img')->item(0)->getAttribute('src');
echo $img_src;
/////////////////////////////////////////////
?>

在该代码中,因为没有 item(1000000000) ,所以会导致错误..
和因为display_errors" , "0"所有错误将被隐藏并且页面将被损坏
那么,如何防止这种损害呢?
我知道我可以通过添加简单的条件来防止它,例如:
if( $image <1 ){ die('error msg'); }之前$img_src变量
但是如果我有超过 10000 行的大代码并且我不知道到底什么代码会导致错误怎么办!!
我们可以通过 httaccess 来阻止它吗?通过检查页面源是否为空重定向到错误页面..
或者我们可以通过 php 本身的一些函数来阻止它吗?
有任何想法吗 ?

最佳答案

您可以使用set_error_handler 。要设置错误情况下的回调,您可以在其中终止脚本进一步执行。

更新
刚刚发现自定义错误处理程序不适用于 E_ERROR 和其他错误类型。这是 PHP 文档

The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

这是我在互联网上找到的一种解决方法,我已经使用您的脚本对其进行了测试,并且工作正常。
将以下代码添加到脚本的开头:

// execute on shutdown
function shutdown_handle(){
// get last error details if any
$lerror = error_get_last();

// if there is a Fatal (E_ERROR Type) las error then redirect to error page
if($lerror && $lerror['type'] == E_ERROR)
header('Location:error_page.php');
}
// register our shutdown handler
register_shutdown_function('shutdown_handle');

这会注册一个关闭函数,该函数在脚本因 fatal error 而终止时执行,无论 display_errors 是打开还是关闭。

然后我们检查最后一个错误是否是 fatal error ,如果是,我们重定向到 error_page.php。

注意:需要注意的一件事是,如果 display_errors 为 ON,重定向仍然有效。我已经测试过它并且工作正常。这可能是因为我的服务器上启用了output_buffering。

更新2:
这是完整的 PHP 文件,其中添加了您的代码和关闭处理程序。这工作得很好并重定向到 error_page.php。将此更改为您要重定向到的页面。:

<?php
////////////////////////////////////////////////
// Shutdown handler to catch E_ERROR on shutdown
// even with display_errors OFF

// function which will execute on shutdown
function shutdown_handle(){
// get last error details if any
$lerror = error_get_last();

// if there is a Fatal (E_ERROR Type) last error
// then redirect to error page
if($lerror && $lerror['type'] == E_ERROR)
header('Location:error_page.php');
}
// register our shutdown handler
register_shutdown_function('shutdown_handle');
//////////////////////////////////////////////////

/////////////////////////////////////////////
ini_set("display_errors" , "1");
/////////////////////////////////////////////
$html = '
<table>
<tr>
<td><img src="img0.gif" /></td>
<td><img src="img1.gif" /></td>
<td><img src="img2.gif" /></td>
</tr>
</table>
';
/////////////////////////////////////////////
$dom = new domDocument();
$dom -> loadHTML($html);
$xpath = new domXPath($dom);
/////////////////////////////////////////////
$query = $xpath->query('.//table/tr/td');
$image = $query->item(1000000000); // <<---- item number
$img_src = $image->getElementsByTagName('img')->item(0)->getAttribute('src');
echo $img_src;
/////////////////////////////////////////////
?>

关于php - 当display_errors=0并且页面有错误时如何防止页面损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7428701/

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