检查表单是否已提交-PHP


122

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

首先我想也许是:

isset($_POST)

但这将永远返回true,因为在任何地方都定义了超全局变量。我不想用以下方法遍历表单的每个元素:

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

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

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


4
好吧,您可以制作一个具有特定名称的提交按钮,例如submited,然后使用php if(isset($_POST['submited']))或隐藏的输入...
Max Allan

2
您应该添加一个nounce来防止对表单进行重播攻击。
hakre 2011年

Answers:


191

对于一般检查是否有POST动作使用:

if (!empty($_POST))

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

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


69

实际上,提交按钮已经执行了此功能。

尝试填写表格:

<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)";
}

6
这是正确的答案。仅检查$ _POST是不够的,因为它可能是在许多不同的地方生成的,而不仅仅是从表单发布中生成的。谢谢Tzshand。
休斯顿

理想情况下,现在您应该使用if (null !== (filter_input(INPUT_POST, 'macaddress'))){它使您养成使用filter_input的习惯
depicus 2015年

2
可以使用Ajax完成POST,因为Ajax没有任何提交按钮,因此这不是通用解决方案。
穆罕默德·本·尤斯拉特

确实如此; 它也可以检查AJAX发布的任何变量。
Tzshand

34

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

1
最简单的解决方案。所有表格都应该有一个提交按钮!
Anh Tran

1
但是某些表格可能有多个按钮。
Progrock

2
@rilwis有时表单是由JavaScript提交的,不需要/没有提交按钮
Waqas Malik


14

试试这个

 <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'])){

    }

2
推荐使用此方法,因为它似乎被“编码学院”视为“最佳实践”。
Darkeden

1

另外,将令牌添加到表单并进行验证以检查数据是否不是从外部发送的,这也是一个好习惯。步骤如下:

  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'] ) ....

0

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

if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
    echo "stuff is happening now";
}

<input type="submit" name="add" value="Submit">

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.