【问题标题】:Determine if empty $_POST submitted确定是否提交了空 $_POST
【发布时间】:2011-11-17 10:52:04
【问题描述】:

我有一个包含表格数据的表单,每一行都有一个同名的复选框,以便它通过 POST 作为数组传递到 PHP 页面。一切正常,但我有一个与何时没有选择页面上的项目有关的问题 - 这是我需要以特定方式处理的特殊情况,但我试图弄清楚如何确定最佳方式告诉这种情况何时发生,就像$_POST 数组完全为空一样。

任何有助于确定何时将空数据集发布到 PHP 页面的策略?

【问题讨论】:

    标签: php


    【解决方案1】:

    您可以通过几种不同的方式完成此操作。

    //Method 1
    if($_POST) {
    //Do Stuff
    }
    
    //Method 2
    if(!empty($_POST)) {
    //Do Stuff
    }
    
    //Method 3 - For detecting if a form was submitted
    <input type="submit" name="submit" />
    if(sizeof($_POST)>1) {
    //Do Stuff
    }
    

    如果您的值为 0,方法 2 将失败,但您不必担心复选框。

    方法 3 依赖于您为提交按钮命名,因此至少在未检查任何内容时提交。然后你可以看看sizeof()返回是否大于1,看看有没有被检查。

    演示: http://wecodesign.com/demos/stackoverflow-7424062.php

    【讨论】:

    • 在引用isset($_POST)时,即使没有POST数据也不会一直设置吗?还是取决于它是 HTTP POST 还是 HTTP GET?
    • @Ben 你是对的,我已经删除了那个例子。我添加了一个演示链接来演示我的两种方法。
    • 演示中的输出是相同的,如果 a) 我只是访问该页面,b) 如果我提交表单而没有点击任何内容。正如我在问题中提到的,我需要确定 POSTed 数据为空且用户提交表单而不是简单地访问页面时的特殊情况。
    • 我想你误会了。进入该页面后,所有内容都是错误的,因为您尚未提交任何内容。如果你不提交任何东西,它仍然是假的;但是,如果您选择某些复选框,它会变为 true。
    • 我明白,但我的页面再次对所有错误的内容采取行动......,错误 = 删除,所以我需要通过点击检查它们存在的错误类型, etc 或 false,因为他们提交了一个空表单。
    【解决方案2】:

    使用empty 函数

    if( empty($_POST) ) {
    //do empty $_POST stuff here
    }
    

    【讨论】:

    • 对...但是如果页面没有被发布到,也就是说,有人只是通过链接直接访问了该页面,那不也会返回 true 吗?
    • 正确,但正如 Paul Grime 上面评论的那样,这就是您找到 HTTP 方法的方式。然而,页面仍然可以被 POST,只是有人可能没有发送任何表单数据。
    • 是的,我正试图准确地确定,当有人在没有任何表单数据的情况下发布。检查 $_POST 是否为空并且请求方法似乎是正确的解决方案。
    【解决方案3】:
    if ( !empty( $_POST["field"] ) ) {
        // Field sent
    } else {
        // Field empty
    }
    

    【讨论】:

      【解决方案4】:

      我想你已经回答了你自己的问题。如果$_POST 数组为空,则没有选中的复选框。

      【讨论】:

      • 对,但是我如何判断表单是否已提交......我需要区分案例A,用户刚刚访问页面,案例B,用户已将表单提交回页面没有发布任何数据。
      • 啊,我明白了,然后查看此链接以了解如何确定请求是否也是 POST - stackoverflow.com/questions/1538065/find-out-http-method-in-php
      • 完美,节省了我传递额外数据的时间。
      【解决方案5】:

      将隐藏的输入字段添加到具有已知值的页面。该字段将始终与 POST 数据一起传递,因此您将知道用户是通过表单提交而不是直接 URL 登陆的。很简单:-

      【讨论】:

      • 啊,是的,当然,一个额外的隐藏字段。我将使用$_SERVER['REQUEST_METHOD'] 我认为的解决方案,但这也可以,谢谢。
      【解决方案6】:

      (count($_POST) == 0) //returns boolean

      或者你的意思是当表单发布但没有输入信息时?

      【讨论】:

      • 是的,当表单发布但没有数据时——在我的表单中,没有数据意味着删除所有条目,所以我需要确定何时发布 && 为空。
      • 为什么不强制用户选中“全部”框?有时,用户可能会忘记选中一个框。或者至少,弹出一个模式对话框,询问他们是否确定要删除所有内容并强制他们说 OK。
      • 因为我使用复选框来允许用户将某些内容设置为启用/禁用。取消选中它会将其设置为禁用。在这种情况下,强迫他们选中复选框是没有意义的。
      【解决方案7】:
      <form>
      <input type="text" name="user" value="" />
      <input type="submit" name="post" value="Save" />
      </form>
      
      //php
      if (isset($_POST['post']))
      {
         //code here
      }
      

      【讨论】:

        【解决方案8】:

        提交表单时可以使用发布数据。鉴于以下情况:

        if($_POST)
        {
            // Bar
        }
        
        // Foo
        

        如果表单没有提交Foo会执行。

        如果表单提交Bar会执行Foo

        鉴于以下情况:

        if ($_POST)
        {
            // Bar
        }
        else
        {
            // Foo
        }
        

        如果表单没有提交Foo会执行。

        如果表单提交Bar会执行。

        至于您的其他问题,检查空数据或适当数据是基本的服务器端表单验证。如果您使用的库可以像这样简单:

        if ($_POST)
        {
            $form_helper = new FormHelper();
        
            $form_helper->validate($_POST["email"], "email");
            $form_helper->validate($_POST["password"], "password");
        
            if (! $form_helper->notifications())
            {
                // Bar
            }
        }
        

        对于您的特定情况(并且没有库),它可能是:

        if ($_POST)
        {
            if (empty($_POST["checklist"])
            {
                // Delete all entries.
            }
            else
            {
                // Do something else.
            }
        
            // Foo
        }
        

        【讨论】:

        • 对,但正如我所提到的,我需要处理通过 POST 提交数据并且为空的情况,当用户只是访问表单页面时,这些示例不会也触发代码 Foo ?
        • @Paul:除非有发布数据,否则它不会触发。至于空的,我刚刚给你看了。您需要验证表单数据。
        • 我认为有一个误解......请解释当用户只是访问页面而不发布数据时,Foo 中的代码不会被执行。
        • @Paul:然后把它移到 $_POST 代码块中?我阅读了其他一些 cmets 并将我的示例更改为我认为您正在尝试做的事情。
        • @Paul:没错,因为您忘记了 name 属性。添加它,看看会发生什么。
        【解决方案9】:

        这将检查是否输入了任何表单值 - 假设默认输入值 = ''

        $post = array_filter($_POST,'strlen'); //过滤所有空值

        //if html input submit button has NO name value       
        if (sizeof($post)):
              //Do stuff
            endif;
        
        // OR if html input submit button HAS a name value
            if (sizeof($post) > 1):
              //Do stuff
            endif;
        

        如果需要精确过滤,您可以使用回调函数

        $post = array_filter($_POST,function ($k){ return $k != '' || $k != 'my default value' || *some other condition etc etc* ; });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-13
          • 2011-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多