【问题标题】:Filters vs $_POST (or $_GET)过滤器与 $_POST(或 $_GET)
【发布时间】:2010-12-18 22:17:07
【问题描述】:

您应该使用哪一个来检查是否点击了表单提交按钮?

<input type="submit" name="action" value="Sign Up">
  1. if (isset($_POST['action'] &amp;&amp; $_POST['action'] == "Sign Up") ...
  2. if (isset(filter_input(INPUT_POST, 'action')) &amp;&amp; filter_input(INPUT_POST, 'action') == "Sign Up")

注意:我使用 $_POST['action] == 'Sign Up',因为我也使用 'action' 数组进行删除和注销,并且因为我的某些表单有两个提交按钮,所以我可以区分)。

【问题讨论】:

  • 第二个真的解析了吗?
  • @mario:不,不会。这是一个解析错误...

标签: php filter


【解决方案1】:

假设你有&lt;form method="post" ...&gt;,你应该使用$_POST。您可以检查单个字段,例如:

if ( isset($_POST['action']) )

或任何字段:

if ( 0 < count($_POST) )

或检查请求方法:

if ( $_SERVER['REQUEST_METHOD'] === 'POST' )

或以上的组合:)

我不建议检查提交按钮的值,如果它改变了,你也需要修改代码。更不用说如果网站是或变成多语言的,你需要做什么。

【讨论】:

  • 0 &lt; count()?为什么不count() &gt; 0
  • 这个表格我早就习惯了,除了可读性没有区别。 0 甚至可以省略,实际上只需要if ( count($_POST) )
【解决方案2】:

实际上并没有回答问题。但我会给不同的提交按钮提供不同的name,因此它们不会绑定到按钮上显示的值。这反过来又使更改按钮上的文本更不容易出错。

例如name='signup'name='action[signup]'

并分别与isset($_POST['signup'])isset($_POST['action']['signup']) 核对。

【讨论】:

    【解决方案3】:

    我不确定,但我想我曾经遇到过这个问题: 可以通过按 enter 发布表单,在这种情况下,不会发布按钮的值。因此,我强烈反对对三种不同的操作使用三个不同的提交按钮。相反,我会使用三种形式,并使用另一种方式来区分它们,比如在其中放置一个隐藏字段或发布到不同的 url(或者在表单 action 属性中放置类似 ?action=signup 的内容。

    【讨论】:

      【解决方案4】:

      如果它只是您想要的输入的确切值,同时期望一个非常具体的值,只需使用 #1。

      使用过滤器可以节省所需的代码量。与写出检查您获得的 IP 地址是否在私有范围内所需的所有代码相反,您可以将代码减少到仅此...

      $var = "192.168.2.1"; echo (int) filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE); // 0

      有关其他过滤器类型和选项标志,请参阅 http://www.php.net/manual/en/filter.filters.validate.php。此外,您可以将值传递给 callback function 以自定义过滤数据的方式。

      您还可以使用更少的代码更改/清理输入。见http://www.php.net/manual/en/filter.filters.sanitize.php

      $var = "te)st@test.com"; echo filter_var($var, FILTER_SANITIZE_EMAIL); //“test@test.com”

      虽然使用 filter_x 函数可以编写更少的代码,但我个人不知道与由实际冗长代码处理相比它的性能如何,我个人也不知道过滤器和消毒剂的可靠性。

      【讨论】:

      • filter_var() 如果您知道使用哪个,效果会很好。它们肯定比自己动手解决方案更快,而不是安全问题。但是 API 非常笨拙和冗长,以至于很少有人在实践中使用它们。我提倡new OOP input() vars,它允许$_GET-&gt;ip["adr"] 或只是$_POST-&gt;email["field"],以便更轻松地使用,从而减少不情愿的使用。
      • @mario: 很酷,尤其是链式。我更喜欢 bool $_POST-&gt;field-&gt;is_valid 方法。基本上跳过实际的字段名称,有时使用过滤器进行值检查而不是值更改。看起来通过一个简单的调整,您还可以添加函数重载 - 让用户 add 匿名过滤具有自定义函数名称的函数。可悲的是,它不像$obj-&gt;property = function () {/* */}; 那样简单,但至少它像function __call($fnc, $args) {$this-&gt;cst_fnc[$fnc]($args);} 一样简单。虽然我可能会被带走。
      • 其实我考虑过添加。虽然$_POST-&gt;is_int["field"] 已经成为可能(获取全局函数),但它需要更好的包装器方法来不破坏链接并且可读。理论上你可以在这里添加$_POST-&gt;myfunc=function($data){return "$data";}自定义方法。无论如何,仅使用通用过滤器函数实际上并不可行。您将需要特定于应用程序的验证。虽然它永远无法真正解决所有问题。一些验证需要更广泛的应用逻辑。
      • @mario:我的错 - 你是对的。就像$_POST-&gt;myfunc=function($data){return "$data";}__set() 一样简单。您仍然需要将自定义函数添加到通过__call() 访问的数组属性中,而不仅仅是设置属性。单独使用属性作为函数总是会失败,即使该属性是具有__invoke() 方法的对象。仍然存在$this 超出匿名函数范围的问题。
      • 我承认我还没有真正尝试过。 8} 但是,这也是 PHP 的一个问题——你不能像 Python 那样拥有未绑定的方法,$this 永远无法访问。但也许有办法通过闭包?但无论如何,我只会使用每个项目的定制版本并破解特定于应用程序的过滤器方法。由于修改了语义,它并不总是适用。如果一个项目的通用清理就足够了,我认为 PHPs filter_input_array() 实际上是相当不错的,如果你可以定义一个规则集并一次过滤。
      【解决方案5】:

      仅检查它是否存在,您不需要filter_varisset 就足够了。

      【讨论】:

      • 1和2在他的例子中都使用isset()
      • @Harmen:啊,没注意到。
      【解决方案6】:

      第一个是正确的:

      if (isset($_POST['action'] && $_POST['action'] == "Sign Up") ...
      

      因为在isset 中使用函数会触发解析错误。只有变量可以与isset 和其他语言结构(如empty)一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多