【问题标题】:Checking if form has been submitted - PHP检查表单是否已提交 - PHP
【发布时间】:2011-12-04 10:01:24
【问题描述】:

检查表单是否已提交以确定是否应将表单变量传递给验证类的最佳方法是什么?

首先我想也许:

isset($_POST)

但这将始终返回 true,因为在任何地方都定义了超全局。我不想遍历表单的每个元素:

if(isset($_POST['element1']) || isset($_POST['element2']) || isset(...etc

在写这个问题时,我想到了一个更基本的解决方案,添加一个隐藏字段作为我可以检查的标志。

有没有比添加我自己的标志更“干净”的方法?

【问题讨论】:

  • 好吧,您可以创建一个具有特定名称的提交按钮,例如 submited,然后使用 php if(isset($_POST['submited'])) 或隐藏输入...
  • 您应该添加一个通知以防止对您的表单进行重放攻击。

标签: php forms validation


【解决方案1】:

一般检查是否有 POST 操作使用:

if (!empty($_POST))

编辑:如 cmets 中所述,此方法在某些情况下不起作用(例如,带有复选框和没有名称的按钮)。你真的应该使用:

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

【讨论】:

    【解决方案2】:

    怎么样

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        使用

        if(isset($_POST['submit'])) // name of your submit button
        

        【讨论】:

        • 最简单的解决方案。所有表单都应该有一个提交按钮!
        • 但有些表单可能有多个按钮。
        • @rilwis 有时表单由 JavaScript 提交,不需要/没有提交按钮
        【解决方案5】:

        你也可以使用:

        is_array($_POST)
        

        【讨论】:

        • is_array($_POST) 总是给出 true (在我的机器上)。根据stackoverflow.com/questions/5594020/php-check-if-post-is-array$_POST is a superglobal array which is always definedunless somewhere in your code you either unset or overwrite $_POST somehow,所以似乎预计这总是返回true..
        • is_array($_POST) 绝对不是检查表单是否提交的方法。
        【解决方案6】:

        其实提交按钮已经完成了这个功能。

        在表格中尝试:

        <form method="post">
        <input type="submit" name="treasure" value="go!">
        </form>
        

        然后在 PHP 处理程序中:

        if (isset($_POST['treasure'])){
        echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
        }
        

        【讨论】:

        • 这是正确答案。仅检查 $_POST 还不够好,因为它可能是从许多不同的地方生成的……而不仅仅是从表单帖子中生成的。谢谢 Tzshand。
        • 理想情况下,您现在应该使用if (null !== (filter_input(INPUT_POST, 'macaddress'))){,这会让您养成使用 filter_input 的习惯
        • POST 可以用 Ajax 完成,它没有任何提交按钮,所以这不是一个通用的解决方案。
        • 确实如此;它还可以检查 AJAX 发布的任何变量。
        【解决方案7】:

        试试这个

         <form action="" method="POST" id="formaddtask">
              Add Task: <input type="text"name="newtaskname" />
              <input type="submit" value="Submit"/>
         </form>
        
            //Check if the form is submitted
            if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['newtaskname'])){
        
            }
        

        【讨论】:

        • 这种方法是最推荐的,因为它似乎被“编码学院”认可为“最佳实践”。
        【解决方案8】:

        我遇到了同样的问题 - 还要确保在输入按钮中添加 name=""。好吧,那个修复对我有用。

        if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
            echo "stuff is happening now";
        }
        
        <input type="submit" name="add" value="Submit">
        

        【讨论】:

          【解决方案9】:

          另一方面,向您的表单添加一个令牌并验证它以检查数据是否不是从外部发送的,这也是一个很好的做法。步骤如下:

          1. 生成唯一令牌(可以使用哈希) 例如:

            $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
            
          2. 将此令牌分配给会话变量。例如:

            $_SESSION['form_token'] = $token;
            
          3. 添加隐藏输入以提交令牌。例如:

            input type="hidden" name="token" value="{$token}"
            
          4. 然后作为验证的一部分,检查提交的令牌是否 匹配会话变量。

            Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....
            

          【讨论】:

          • 这仅在用户不检查元素并嗅探要在其机器人中运行的值时才有效
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-24
          • 1970-01-01
          • 1970-01-01
          • 2013-05-22
          • 1970-01-01
          相关资源
          最近更新 更多