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

method="GET" gives empty $_GET, method="POST" gives non empty $_GET. Why? (PHP 5.6.6)

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 给出如下内容:

array (size=0)
empty
array (size=0)
empty

提交 submit_post.php 输出如下:

array (size=1)
'param' => string 'some' (length=4)
array (size=0)
empty

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

不要在表单操作中放置任何 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>

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

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

您可能对超全局变量名称 POST 和 GET 过于直白。 $_GET 是解析后的查询字符串,它独立于 HTTP 方法,即它将始终存在,即使是 POST、PUT 和 DELETE 请求。 $_POST 是解析的 HTTP body 当符合某些约束时(content-type header 必须指定 application/x-www-form-urlencodedmultipart/form-data,我认为该方法确实必须是 "POST" - "PUT" 不会那样工作,并且 "DELETE" 不能有 HTTP body)。请注意,当不符合约束条件时,即使您使用 POST 方法,您也不会在 $_POST.

中获取任何数据