【问题标题】:Form action with parameters - parameters are not in $_GET or $_POST带参数的表单操作 - 参数不在 $_GET 或 $_POST 中
【发布时间】:2012-02-16 17:28:52
【问题描述】:

我正在重新实现一个客户端没有源代码并且正在失去对服务器的访问权限的 REST API...

我发现来电者正在发送帖子但没有发布数据。所有的参数都在 URL 中指定,或者如果它是一个发布表单会是什么动作。

像这样:

"POST http://foo.com/api/rest/?method=users.add_user&token=foo&section=bar&group=baz HTTP/1.1" 200 605 "-" "-" 

令我惊讶的是,这些参数既不在 $_GET 也不在 $_POST 中,而仅在 $_REQUEST 中可用。

我在这里遗漏了什么吗?为什么它们不在 $_GET 中作为访问的 URL 的一部分?显而易见的答案是“因为这是一个 POST,所以 GET 是未定义的”?

有人可以告诉我我对那些超级全球的误解吗?

【问题讨论】:

  • 这是一个长镜头,但 $_REQUEST 通常还包括 $_COOKIE。是否有可能在客户端的 cookie 中设置这些相同的密钥?
  • 您知道在 url 中指定参数是表单的“GET 方式”,而“POST 方式”会将它们发送到 http 正文中?我想这可能与此有关(虽然我不太了解 php)。如果使用 GET 作为方法会发生什么?
  • @ZPiDER - 帖子来自不受我控制的远程脚本,但我的问题与调试该过程无关。
  • @Andrew - 我不这么认为。 $_GET 和 $_POST 完全为空,$_REQUEST 包含 URL 中的所有变量...

标签: php post get request superglobals


【解决方案1】:

$_GET 和 $_POST 为空,因为您使用的是 POST 协议,但通过 GET 方法发送变量(在 URL 中编码它们)。

PHP 正在查找所使用的 POST 方法,因此它将 $_GET 变量中的信息设置为空,然后将表单的 POST 数据中发送的变量解析为 $_POST 变量,即:空。

另一方面,$_REQUEST 变量在不同的机制上运行,它将解析请求中的所有变量,无论它们来自 cookie、多部分数据、post、get 等。这就是你在那里看到它们的原因。

通常脚本和应用程序无论如何都会处理 $_REQUEST 数据,因为它是所有数据的更简洁的集合,并且由于从技术上讲,您不能在同一请求中拥有 GET 和 POST 数据,因此您不必担心关于数据集之间的冲突。

【讨论】:

  • 非常感谢。这正是我直到今天才学到的东西。非常感谢!
  • 那我提交表单到somepage.php?key=blah怎么办,即使没有POST数据,$_GET['key']还有呢?
  • 有一个警告。有时你明确地只想要一个正确发布的变量。在这种情况下,检查 $_POST 并忽略 $_REQUEST 是首选机制。这通常是当您采取“破坏性”操作(以某种方式更改数据)并且您真的不希望谷歌干扰时。
  • @Kolink 我见过一些情况,我从某些服务器/配置和 TBH 上的 POST 请求中收到 GET 变量,我从来没有真正费心去研究为什么这些情况是“哎呀,我没有更改表单方法”实例,我也不在乎,哈哈,但是我自己也看到过这种情况很少发生。我的猜测是有一个错误,但是由于大多数人在编码时正确地制定了他们的请求并在脚本中使用了适当的超全局,我认为这只是大多数人没有注意到它的情况,而那些注意到它的人,修复了他们的错误并没有注意到不在乎 PHP 被破坏了:P
猜你喜欢
  • 2015-08-21
  • 1970-01-01
  • 2015-03-02
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 2010-09-22
相关资源
最近更新 更多