方法=" GET"给出$ _GET,方法=" POST"给出非空$ _GET。为什么? (PHP 5.6.6)

时间:2015-04-27 18:31:38

标签: php forms post get submit

test.php的

<?php
var_dump($_GET);
var_dump($_POST);

submit_get.php

<form action="test.php?param=some" method="GET">
  <input type="submit" value="Submit">
</form>

submit_post.php

<form action="test.php?param=some" method="POST">
  <input type="submit" value="Submit">
</form>

提交submit_get.php给出如下内容:

  

数组 (size = 0)
数组   (size = 0)
空白

提交submit_post.php输出如下内容:

  

数组 (size = 1)
&#39; param&#39; =&GT;字符串&#39; some&#39;   (长度= 4)
数组 (size = 0)

所以,我不太明白POST和GET方法是如何与$ _POST和$ _GET PHP变量连接的,以及为什么提交的表单方法=&#34; POST&#34;输出空$ _POST和非空$ _GET?

2 个答案:

答案 0 :(得分:1)

通过GET发送的表单需要在表单中定义所有值。然后,浏览器将根据这些值创建查询字符串(根据表单评估规则,“成功控件”等内容)。创建此查询字符串意味着将替换操作URL中的任何现有查询字符串。如果您需要在查询字符串中包含固定值,请使用隐藏的表单字段。

使用POST表单时,表单中的所有数据都会进入请求正文,而不是替换查询字符串。因此,没有替换发生,并且操作URL中的查询字符串仍然存在。

你可能正在使用超全局变量名POST和GET太字面了。 $_GET是解析的查询字符串,它独立于HTTP方法,即它始终存在,即使有POST,PUT和DELETE请求也是如此。 $_POST是符合某些约束时解析的HTTP主体(内容类型标头必须指定application/x-www-form-urlencodedmultipart/form-data,我认为该方法必须是“POST” - “PUT”不会以这种方式工作,“DELETE”不能有HTTP主体。请注意,如果不符合约束条件,即使您使用POST方法,也不会在$_POST内获取任何数据。

答案 1 :(得分:0)

不要在表单操作中放置任何URL参数。创建一个隐藏的输入并填充它。在调用POST时将参数作为URL中的查询字符串传递给该参数作为GET,而不是POST。这就是我们创建隐藏输入的原因,以便它将作为POST传递而不是GET。

<form action="test.php" method="POST">
    <input type="submit" value="Submit">
    <input type="hidden" name="param" value="some">
</form>