$ _POST vs. $ _SERVER ['REQUEST_METHOD'] =='POST'

时间:2009-01-03 16:56:23

标签: php

有些人称我的一个Snipplr提交“废话”,因为我使用的是if ($_SERVER['REQUEST_METHOD'] == 'POST')而不是if ($_POST)

检查请求方法对我来说似乎更正确,因为这是我真正想做的事情。两者之间是否存在一些操作差异,或者这仅仅是代码清晰度问题?

11 个答案:

答案 0 :(得分:156)

嗯,他们真的没有做同样的事情。

$_SERVER['REQUEST_METHOD']包含请求方法(惊喜)。

$_POST包含所有帖子数据。

POST请求可能不包含POST数据。

我检查了请求方法 - 实际上我从没想过测试$_POST数组。不过,我检查了所需的帖子字段。因此,一个空的帖子请求会给用户带来很多错误信息 - 这对我来说很有意义。

答案 1 :(得分:33)

if ($_SERVER['REQUEST_METHOD'] == 'POST')是正确的方法,您可以发送没有任何帖子数据的帖子请求。

答案 2 :(得分:15)

我曾经检查$_POST,直到遇到更大的POST数据和上传文件的问题。配置指令post_max_sizeupload_max_filesize - 如果超出任何指令,则不会填充$_POST数组。

所以“安全的方式”是检查$_SERVER['REQUEST_METHOD']。您仍然必须在每个isset()变量上使用$_POST,无论您检查还是不检查$_SERVER['REQUEST_METHOD']都无关紧要。

答案 3 :(得分:7)

如果您的应用程序需要对类型帖子的请求做出反应,请使用:

if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') { // if form submitted with post method
    // validate request, 
    // manage post request differently, 
    // log or don't log request,
    // redirect to avoid resubmition on F5 etc
}

如果您的应用程序需要对通过邮寄请求收到的任何数据做出反应,请使用:

if(!empty($_POST)) {  // if received any post data
   // process $_POST values, 
   // save data to DB,
   // ... 
}

if(!empty($_FILES)) { // if received any "post" files
   // validate uploaded FILES
   // move to uploaded dir
   // ...
}

这是特定于实现的,但您将同时使用+ $ _FILES超全局。

答案 4 :(得分:3)

您可以通过在大多数浏览器中点击回车键(即不点击提交按钮)来提交表单,但这不一定会将提交作为变量发送 - 因此可以提交一个空表单,即$_POST将为空,但表单仍将生成一个http发送请求到PHP页面。在这种情况下,if ($_SERVER['REQUEST_METHOD'] == 'POST')会更好。

答案 5 :(得分:1)

他们都是正确的。就个人而言,我更喜欢你的方法,因为它的冗长,但这完全取决于个人偏好。

关闭,运行if($ _ POST)不会抛出错误 - 无论请求是否与POST头一起发送,$ _POST数组都存在。在布尔检查中将空数组强制转换为false。

答案 6 :(得分:1)

$this->method = $_SERVER['REQUEST_METHOD'];
if ($this->method == 'POST' && array_key_exists('HTTP_X_HTTP_METHOD', $_SERVER)) {
    if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'DELETE') {
        $this->method = 'DELETE';
    } else if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'PUT') {
        $this->method = 'PUT';
    } else {
        throw new Exception("Unexpected Header");
    }
}

答案 7 :(得分:0)

只要我可能需要使用不止一种方法来访问我的PHP脚本,我实际上所做的就是:

if (in_array($_SERVER['REQUEST_METHOD'],array("GET","POST","DELETE"))) {
// do wathever I do 
}

答案 8 :(得分:-1)

它检查页面是否已通过POST调用(与GET,HEAD等相反)。 在菜单栏中键入URL时,将通过GET调用该页面。但是,当您使用method =“post”提交表单时,将使用POST调用操作页面。

答案 9 :(得分:-3)

这真的是6个,其他情况的6个。

针对您的方法的唯一可能的参数是$ _SERVER ['REQUEST_METHOD'] =='POST'可能不会填充在某些Web服务器/配置上,而$ _POST数组将始终存在于PHP4 / PHP5中(如果它不存在,你有更大的问题( - :)

答案 10 :(得分:-17)

它们都以相同的方式工作,但应该使用$_POST,因为它更干净。您可以向其添加isset()以检查其是否存在。