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

Posted

技术标签:

【中文标题】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)method="GET" 给出空 $_GET,method="POST" 给出非空 $_GET。为什么? (PHP 5.6.6) 【发布时间】:2015-07-06 08:34:21 【问题描述】:

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) 'param' => 字符串'some' (length=4)数组 (size=0)

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

【问题讨论】:

test.php/?param=some 更改为 test.php?param=some 会发生什么? (去掉test.php之后的/) 除此之外 ^ - 记得使用 !empty() 和/或 isset() “将 test.php/?param=some 更改为 test.php?param=some 会发生什么?” - 魔术 - @Maximus2012 你确定你有来自 GET 的空结果吗?不是来自 POST? 我对此并不完全确定,但执行test.php/ 【参考方案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 中获取任何数据。

【讨论】:

这是非常有用的解释。声望足够时投票,【参考方案2】:

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

【讨论】:

这是一个建议,但不是为什么这样的结果的答案 他们可以做他们现在正在做的事情,只是稍作修改。再次非常仔细地查看他们的代码,包括他们问题下留下的 cmets。 稍微修改了我的答案,包括简要解释为什么答案是这样的。虽然可以选择删除 /,但查询字符串的问题仍然存在。

以上是关于method="GET" 给出空 $_GET,method="POST" 给出非空 $_GET。为啥? (PHP 5.6.6)的主要内容,如果未能解决你的问题,请参考以下文章

"detail": "Method \"GET\" not allowed. 在 django 中调用端点

405 Method not Allow, methods=["POST", "GET"] 不工作

TypeError: date[("get" + method)] 不是 React-big-calendar 中的函数

我正在尝试从 post 方法获取令牌,但我得到 json 响应 "Get/Method?Not Allowed" 我为此使用 POST 方法

Heroku 错误 at=error code=H14 desc="No web processes running" method=GET path="/"

Heroku 崩溃错误:heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/fa