0

我正在构建一个动态网站,但由于错误,页面没有显示

致命错误:函数名必须是字符串 php

在线上

 $p= $_GET('p');

包含文件的整个代码是

 $folder = 'de/';
 $folder =  'en/';
 if(!empty($_GET['p'])){

 $pages = scandir($folder,0);
 unset($pages[0],$pages[1]);
 $p= $_GET('p');
 if(in_array($p.'.inc.php', $pages)){
 include($folder.'/'.$p.'.inc.php');

 }else{
 echo 'error message';
 }
 }else{
  include($folder.'home.inc.php');    
 }

我的代码有什么问题?

更新

我已经更新了代码,但现在我得到了错误

*failed to open stream: No such file or directory*

我正在本地服务器上工作。

4

5 回答 5

6
$p= $_GET('p');

应该

$p= $_GET['p'];
于 2013-10-10T16:10:49.967 回答
1

你的代码效率很低。为什么要将目录的内容吞入一个数组,然后在您可以简单地拥有时搜索该数组:

if (isset($_GET['p']) {
    $file = $folder . $_GET['p'] .'.inc.php';
    if (is_readable($file)) {
       include($file);
    } else {
       die('error');
    }
} else {
    include($folder.'home.inc.php');    
}

这比您复杂的逻辑要简单得多。但是,它也容易受到完全相同的漏洞的影响:您允许用户指定*.inc.php服务器上任何他们知道路径名的文件的完整路径。根据您的设置,这可能允许用户包含您曾经打算以这种方式执行的文件,并泄露您的系统/配置的内部详细信息。

于 2013-10-10T16:20:29.917 回答
0
$p= $_GET('p');

你真的没有注意到你在使用括号吗?

利用:

$p = $_GET['p'];
于 2013-10-10T16:11:37.387 回答
0

$p= $_GET('p');它应该是$p= $_GET['p'];

于 2013-10-10T16:11:58.150 回答
0

错误似乎 $_GET('p') 应该是 $_GET['p'] 。

几点考虑:

if(!empty($_GET['p'])) 可以改为 if (array_key_exists('p', $_GET) && !empty($_GET['p'])。PHP 总是抱怨数组索引,这是防止它的好方法。

在 unset($pages[0],$pages[1]); 上,如果数组没有返回 2 个元素,它将返回 null 并且 PHP 的 unset 函数会报错。更好的方法是检查 $pages 变量上是否有元素;

如果 scandir 不返回任何元素,不确定它是否会返回 null 或数组,所以在这种情况下 if(in_array($p.'.inc.php', $pages)) 会抛出错误。

干杯

于 2013-10-10T16:17:43.293 回答