【问题标题】:PHP Best Practice - Read GET/POST parameter multiple times or create variablePHP 最佳实践 - 多次读取 GET/POST 参数或创建变量
【发布时间】:2016-07-03 13:56:15
【问题描述】:

我想知道在这种情况下实际上最佳做法是什么。您会使用以下哪个代码 sn-ps?

doStuff($_GET["param"]);
doMoreStuff($_GET["param"]);

$variable = $_GET["param"];

doStuff($variable);
doMoreStuff($variable);

在性能方面有什么不同,甚至只是一个好的 PHP 代码应该是什么样子?

如果第一个更好,您建议在多少函数调用时使用变量?

【问题讨论】:

  • 一旦 GET 和 POST 变量必须在处理之前进行清理,您必须对其进行清理,然后分配给变量,因为它将在不同的地方使用。变量赋值并不会真正影响性能。

标签: php variables url-parameters


【解决方案1】:

您应该过滤全局变量$_GET 中的参数。所以最佳实践是将来自$_GET 的过滤数据存储在变量中,并在代码的其他部分使用它。过滤是一种很好的方法,因为它使您的代码更加安全。

您可以在此处阅读有关过滤输入的信息:http://php.net/manual/en/function.filter-input.php

【讨论】:

  • 没有理由不能将出现的 $_GET/$_POST 数组过滤回 $_GET/$_POST 数组
【解决方案2】:

如果未设置 $_GET["param"],您的代码将生成警告。

我会先验证$_GET['param'] 确实存在,然后做任何你想做的事情。

if(!isset($_GET['param'])){
    //fail here with exit() or exception, or whatever
}

//your code here, now you know for sure that $_GET['param'] is present
doStuff($_GET['param']); //or whatever you like

您还应该相应地进一步验证您的参数,如果它的整数检查 is_numeric(),最好在 (int) 之后进行转换。 empty() 也是你的朋友,但请注意,如果 $_GET['param']="0" empty() 将返回 true。

验证完成后,您可以选择其中一种方法,两者都可以。最终这将取决于您所处的情况。

【讨论】:

  • 如果没有设置参数 $_GET['param'] 给你 null 并且没有警告
  • 做任何你计划好的逻辑,向用户发出警告,或者你想做的任何事情。
  • @PrototypeX7 你显然是用display_errors = Off 运行的,而且从不看PHP 错误日志。当$_GET['param']$_GET 数组中不存在时执行$var = $_GET['param']; 会生成Notice: Undefined index: param
  • 顺便说一句,您的帖子并没有真正回答我的问题。我特别问,我的代码 sn-ps 哪个更好,或者如果存在多种情况,我应该如何使用它们。如果未设置参数,我没有询问如何防止错误。
  • 您绝对应该查看您的 PHP 错误日志。像这样的通知不是一个好的做法,因为我们在这里讨论的是好的做法。生产代码应在关闭display_errors 的情况下运行。顺便说一句,我的帖子回答了你的问题,因为最后我说 - 你的两种方法都很好。
【解决方案3】:

两者实际上是相同的;

$variable = $_GET["param"];

将清理您的样式,如果您在不同页面中使用相同的变量会更有用。

【讨论】:

    【解决方案4】:

    其实$_GET数组也是一个变量。因此,多次使用 $_GET 应该不是问题。当您为 GET 数据创建单独的变量时,您的脚本将需要更多内存。

    当您多次执行相同的操作(例如从用户输入中过滤某些内容)时,最好为此创建一个变量并且不要操作 $_GET 或 $_POST 数组。在我看来,如果您期望 $_GET 数组中的直接用户输入是令人困惑的,但它包含过滤/操作的数据。

    【讨论】:

    • 你没有理由不能将 $_GET/$_POST 数据清理回它来自的数组。
    • 当然可以。但是,在我看来,如果您期望 $_GET 数组中的直接用户输入,但它包含已经过滤/操作的数据,这会令人困惑。此外,如果你使用像 http_build_query() 这样的函数,它们依赖于 $_GET 变量的内容,并期望用户在里面输入。
    • 但是,如果您将过滤后的数据保留在 $_POST/$_GET 中,它会记录您在使用它的每一行代码中使用的数据。
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2021-03-07
    • 2015-06-25
    • 2017-09-12
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多