检查表单是否已提交 - PHP

145

如何最好地检查表单是否已提交,以确定我是否应将表单变量传递给我的验证类?

起初我认为可以这样做:

isset($_POST)

但那会一直返回 true,因为超全局变量在任何地方都有定义。我不想用以下方式迭代我的表单中的每个元素:

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

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

除了添加自己的标志之外,有没有更“简洁”的方法?


4
你可以创建一个具有特定名称的提交按钮,例如 submited,然后使用 PHP 的 if(isset($_POST['submited'])) 或者一个隐藏输入框... - Max Allan
2
你应该添加一个随机数来防止重放攻击在你的表单上。 - hakre
10个回答

239

为了一般性地检查是否有POST操作,请使用:

if ($_POST)

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

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

181

How about

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

73

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

在表单中尝试:

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

7
这是正确的答案。仅检查$_POST是不够的,因为它可能来自许多不同的地方...而不仅仅是表单提交。谢谢Tzshand。 - Houston
理想情况下,您现在应该使用 if (null !== (filter_input(INPUT_POST, 'macaddress'))){,这会让您养成使用 filter_input 的习惯。 - depicus
3
POST请求可以通过Ajax完成,这种方式不需要提交按钮,但这并非通用解决方案。 - Muhammad bin Yusrat
没错,它还可以检查由AJAX发布的任何变量。 - Tzshand

38

使用

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

1
但是有些表单可能会有多个按钮。 - Progrock
4
有时候,表单是通过 JavaScript 提交的,因此不需要/没有提交按钮。 - Waqas Malik

30
如果($_SERVER['REQUEST_METHOD'] == 'POST')。

15

试试这个

 <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
这种方法是最受推荐的,因为它似乎被“编程学院”认可为“最佳实践”。 - Genesis

2
我有同样的问题 - 还要确保在输入按钮中添加name = ""。好的,那个修复对我起作用了。
if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
    echo "stuff is happening now";
}

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

2

另外,对于IT技术相关内容,添加令牌并验证以检查数据是否来自外部始终是一个好习惯。以下是步骤:

  1. Generate a unique token (you can use hash) Ex:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
    
  2. Assign this token to a session variable. Ex:

    $_SESSION['form_token'] = $token;
    
  3. Add a hidden input to submit the token. Ex:

    input type="hidden" name="token" value="{$token}"
    
  4. then as part of your validation, check if the submitted token matches the session var.

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

只有在用户不检查元素并嗅探值以在其机器人中运行时,此方法才有效。 - c0d3x1337

0
你可以通过检查来确认。
if ($_SERVER['REQUEST_METHOD'] == 'POST') 

假设并强烈建议使用POST方法处理表单,而不是GET方法。
建议将表单处理程序和表单HTML页面分开,并从处理程序重定向到HTML页面,以防止用户重复提交表单。
在表单中添加一个令牌以防止垃圾邮件。

-6

你也可以使用以下方法:

is_array($_POST)

5
在我的电脑上,is_array($_POST) 始终返回 true。根据 http://stackoverflow.com/questions/5594020/php-check-if-post-is-array:`$_POST 是一个超全局数组,它总是被定义的除非在您的代码中您取消设置或以某种方式覆盖了 $_POST`,因此这似乎是预期的结果。请注意,以上是翻译后的内容,没有包含解释或其他额外信息。 - GitaarLAB
使用is_array($_POST)绝对不是检查表单是否已提交的正确方法。 - Lukas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接