【问题标题】:$_GET as parameters in PHP functions$_GET 作为 PHP 函数中的参数
【发布时间】:2025-12-10 07:00:01
【问题描述】:

我有同样的问题,但是...我根据使用标题的 if 语句将用户重定向到通过函数构造的动态页面。为了使该函数正常工作,它需要在标头的 GET 部分中传递参数。

根据提供的答案,这是一种不好的做法。我应该怎么做?

function page($title,$msg){
    $title = $_GET['title'];
    $msg = $_GET['msg'];
    echo '<h1>'.$title.'</h1>';

    echo '<p>';
    switch($msg){
        case 1:
            echo 'dwasdwadawdwadwa';
        break;
        case 2:
            echo 'wasdadwadwdad';
        break;
        default:
            echo 'wadasdasd';
        break;
    }
    echo '</p>';
}

ps:如有其他错误请随时指出。

我找到了this,但它并没有真正帮助我。

【问题讨论】:

  • 哪个答案?你和哪个问题有相同的问题?
  • 嗯,首先,不是来自函数的echo,而是将内容存储到函数返回的变量中,即return $func_html
  • 为什么你的函数接受的参数会立即被覆盖?
  • @ceejayoz 请参阅右侧边栏中的“已链接”部分
  • 这不是最佳做法,但也不是坏做法。由于这似乎是一个模板函数(太抽象,请下次发布真实代码),因此直接从 GET 参数中获取 $title 可能更合适。但是,必须在此处使用正确的转义 (htmlspecialchars)。

标签: php function parameters get


【解决方案1】:

虽然您不一定要将 $_GET 输入用于需要安全考虑的事情(在这种情况下),但不清理 URL 中的值是一种不好的做法。

您不仅应该检查恶意输入(尤其是当您使用输入来查询数据库时),还应该验证预期的整数值确实是整数,并且所需的字符串不为空。

此外,您的page($title, $msg) 函数接受$title$msg 并设置它们,即使它们不是passed by reference

  1. 如果您希望修改输入参数,请通过引用传递它们。

  2. 如果需要使用输入参数,不要立即覆盖。

  3. 如果您不需要输入参数并且只在函数本地使用来自 $_GET 的值,请在不带任何参数的情况下声明 page()

【讨论】:

    【解决方案2】:

    您链接的问题的答案表明函数不应依赖任何外部(例如全局)变量。 $_GET$_POST(以及其他)是“超级全局变量”,这是 PHP 的一种语言特性,可以在任何范围内使用它们。这意味着它们可能会在脚本中的任何位置被意外修改。

    帮助避免这种情况的一种方法是避免在方法中使用超级全局变量,而是 - 正如另一个问题的答案所暗示的那样 - 改为要求您从超级全局变量获得的变量的参数。

    例如,而不是:

    function add_user() {
      $user = $_GET['user'];
      // ...
    }
    add_user();
    

    你会使用:

    function add_user($user) {
      // ...
    }
    add_user($_GET['user']);
    

    在你的情况下,你想要的是:

    function page($title, $msg){
      echo '<h1>'.$title.'</h1>';
      echo '<p>';
      switch($msg){
        case 1:
          echo 'dwasdwadawdwadwa';
        break;
        case 2:
          echo 'wasdadwadwdad';
        break;
        default:
          echo 'wadasdasd';
        break;
      }
      echo '</p>';
    }
    

    然后,当您调用page 时,您将调用它:

    page($_GET['title'], $_GET['msg']);
    

    【讨论】:

    • "...unexpectedly modified from anywhere in your scripts" - 这是一个现实的问题吗?
    • @mario:是的。如果您正在调用修改 $_GET$_POST 变量的函数,以及从它们读取的其他函数,则更改函数调用的顺序可能会产生逻辑错误。
    • @mario:在这种情况下是虚构的,但完全现实和常见的错误原因。尽量减少函数的副作用总是一个好主意。这种心态是不可变性和无状态编程等实践的原因:*.com/questions/844536/…
    • @robjb:好吧,可能和可能是两个不同的东西。我从来没有见过这样的代码,结果出乎意料。
    • @mario:我会说,如果您正在从各种函数修改常用的全局变量,这很有可能。但是,这样做当然不是一个好主意,所以在开发良好的代码中不太可能。
    【解决方案3】:

    为什么需要使用GET?如果您使用更安全的 POST,您可以访问所有相同的属性

    【讨论】:

    • POST 比 GET 更安全吗? POST 的唯一优点是它允许您发送更多数据(文件上传、非常长的文本区域);但您不需要 Firebug、TamperData 或任何其他 webdev 工具来操作 POST 数据。
    • 它不会弄乱 url 的/显示用户数据。例如 login.php?username=iHaveacomputer&password=generic。要获取他们输入的信息,您需要做的就是输入站点的 url,然后按向下箭头键。与其鼓励使用 GET 消息,不如鼓励 POST,因为这就是它的用途。没有人想要 400 长的网址。
    • URL 混乱是一个合理的论点。安全恐慌不是。也请等待a few more 积分,直到您可以将简短的问题发布为 cmets。
    【解决方案4】:

    不确定我是否理解你的问题,但这里有一些我用来处理我的 ajax 调用的代码:

    $mc = new MyClass();
    echo $mc->{$_GET["operation"]}($_GET);
    

    这意味着“操作”是指您在 MyClass 中的方法名称,我不必为每个方法添加新的 switch 语句。现在我可以向 MyClass 添加一个函数“addRecord($args)”,我的 ajax 调用将如下所示:

    ajax_users.php?operation=addRecord&name=testuser&dob=1980-01-01
    

    您的 php 函数接收数组中的参数,因此在函数 addRecord() 中,您必须访问 $args['name']$args['dob'] 等变量,而您必须将多少参数传递给您的方法并不重要。

    确保在此处使用准备好的语句或正确转义以防止 sql 注入。

    【讨论】: