【问题标题】:php error Function name must be a string phpphp error 函数名必须是字符串 php
【发布时间】:2026-01-20 16:50:01
【问题描述】:

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

致命错误:函数名必须是字符串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*

我在本地服务器上工作。

【问题讨论】:

  • 你应该先检查p是否存在于$_GET数组中。

标签: php dynamic include directory


【解决方案1】:
$p= $_GET('p');

应该是

$p= $_GET['p'];

【讨论】:

  • 现在我得到错误 failed to open stream: No such file or directory ,但是为什么?目录是否存在?
  • 为什么$folder要定义两次?
  • 因为有两个文件夹;每个对应一种语言。
  • 第二个 $folder 会覆盖第一个。
  • 但是如何以正确的方式编写代码以在我的网站中包含两个文件夹?我使用数组是正确的:-(
【解决方案2】:

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

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 文件的完整路径。根据您的设置,这可能允许用户包含您曾经打算以这种方式执行的文件并泄露您的系统/配置的内部详细信息。

【讨论】:

  • 我认为我可以使用 .htaccess 文件。但是您的代码肯定会更好。无论如何,现在我得到一个目录不存在的错误。请看我的更新。
  • .htaccess 无法保护您,除非您列出您希望允许包含的每个 VALID 文件。
  • 使用您的代码,第一行的{ 括号出现语法错误。同一行上的最后一个[ 应该是],我在尝试使用您的代码时对其进行了更正。但是第一行的{ 似乎是正确的。
  • 是的。 [ 是一个错字。现已修复。
  • 第一行的结尾if() 有另一个错字。除此之外,如何包含 en + de 两个文件夹以使您的代码正常工作?
【解决方案3】:
$p= $_GET('p');

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

用途:

$p = $_GET['p'];

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      一些注意事项:

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

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

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

      干杯

      【讨论】:

        最近更新 更多