0
$admpage=md5($_SERVER[DOCUMENT_ROOT]).'.php';
if(!@include($admpage)){echo "error opening Adminpage";}

所以,如果没有这样的文件,应该会有 error error opening Adminpage

但是,如果在包含的文件中是代码中的错误,它不会显示任何内容。

换句话说,我需要在包含时关闭错误报告,但在执行包含文件时打开它们。

PS
我试过eval(),但那更糟@include()

PPS
我需要包含任何文件,但如果错误(包含或执行时),则显示错误但从不显示文件名

4

3 回答 3

2

看来,您的目标是禁止包含不存在的文件的错误消息。

您可以这样做:

$old = ini_set('display_errors', 0);  // Do not show errors to client
$fileExists = file_exists($someFile) && is_readable($someFile);
ini_set('display_errors', $old); // Restore old value
if (!$fileExists)
   die('Error opening admin page');
include($someFile);

为什么要这么多步骤?

file_exists并且还会is_readable在某些情况下打印错误消息:可能存在safe_modeopen_basedir限制问题(并非每个人都已经使用 PHP 5.3)。服务器也可能运行suPHP它也会使文件不可读。

为什么是错的?

您的概念:依靠隐蔽文件的名称进行伪身份验证称为“隐蔽安全”。例如,任何有权访问您的浏览器历史记录的人都会知道该 URL。这不是很安全...

我的回答:简单地关闭display_errors就像设置error_reporing为零一样安全:根本不是。例如:一旦安装了自定义错误处理程序,这两个设置都将被“忽略”。自定义错误处理程序有责任相应地检查这些值。

php.ini您可能会考虑为您的生产和开发环境使用不同的设置。理想情况下,第一个应该不显示任何错误消息,而后者应该溢出所有错误消息。


继续阅读:

于 2013-09-29T13:40:28.433 回答
0

什么事file_exists

if(!file_exists($admpage)){echo "error opening Adminpage";}

如果您真的想在像这样包含时关闭错误报告:@include("script.php"); 然后将文件中的代码包装在一个函数中,例如myFunc(),然后在包含之后调用它。

于 2013-09-29T13:14:41.597 回答
0

仅在文件确实存在时使用:

if (file_exists($admpage) && is_readable($admpage)) {
  include($admpage);
}
于 2013-09-29T13:16:42.310 回答