$ _POST与$ _SERVER ['REQUEST_METHOD'] =='POST'


130

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

检查请求方法对我来说似乎更正确,因为这是我真正想要做的。两者之间在操作上有区别吗?还是仅仅是代码清晰性问题?


214
告诉那个家伙他很烂。
Vinko Vrsalovic

12
您应该使用===代替==此处0 == 'POST'
dave1010 2013年

5
$ _SERVER [“ REQUEST_METHOD”]在某些PHP + Apache2安装中可能包含HTTP GET请求的“ POST”。像我的 这就是我到达这里的方式。
Tiberiu-Ionuț Stan,2013年

3
@ Tiberiu-IonuțStan如果这是真的(我不相信),那是一个严重的错误。您可以提供指向PHP或Apache错误报告的链接吗?重现步骤?实际上,我就是不相信你。
Mark Amery 2014年

1
@ dave1010为什么会$_SERVER['REQUEST_METHOD']是数字0?据我所知,这是不可能的。
Mark Amery 2014年

Answers:


169

好吧,他们确实没有做同样的事情。

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

$_POST 包含任何帖子数据。

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

我检查了请求方法-实际上,我从未想过要测试$_POST阵列。不过,我检查了必填字段。因此,空的发布请求会给用户很多错误消息-这对我来说很有意义。


从理论上讲,请求方法可能是“ post”(小写或什至大小写混合)。PHP是否可以在GET和POST上自动清除它?
Boldewyn

经过简短测试后,我在WinXP上的PHP 5.2显然没有执行此操作,因此可能应该将request_method清除为大写。
Boldewyn

3
@Boldewyn不,不是这样,但是如果客户端在打算执行POST请求时向您发送请求“ post”或“ Post”的请求方法,则它们违反规范,因为HTTP方法区分大小写根据规范,规范仅定义POST方法,而没有定义post或Post或pOsT方法。我在这里的回答中对此有更详细的说明:stackoverflow.com/a/21511879/1709587。您是否要强制将该方法转换为大写形式以处理违反规范的客户端代码。
Mark Amery 2014年

而且由于它们不是一回事,所以有意义的是我们可以将它们用于不同的事情-输入和请求有效负载。我想知道这是否会使人烦恼:我使用$ _SERVER ['REQUEST_METHOD']弄清楚我们在做什么,并且我使用$ _REQUEST访问有效负载,这在概念之间保持了一点独立性(换句话说,我很少专门使用$ _POST或$ _GET)。
Grantwparks 2014年

@grantwparks听起来不错。$ _GET和$ _POST与数据的传输位置有关。考虑:“ curl -k -L -X POST -H'内容类型:text / csv'--data-binary \ @ sample.csv'test-script.php?test = 12345'”值“ test”填充$ _GET即使该方法是POST。
txyoji

37

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


17

我曾经检查过,$_POST直到遇到较大的POST数据和上传的文件的麻烦为止。存在配置指令,post_max_size并且upload_max_filesize-如果超过其中任何一个,$_POST则不填充数组。

因此,“安全方法”是检查$_SERVER['REQUEST_METHOD']。不过,您仍然必须isset()在每个$_POST变量上使用,并且无论您检查还是不检查都没有关系$_SERVER['REQUEST_METHOD']


9

如果您的应用程序需要根据post类型的请求做出反应,请使用以下命令:

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超全局变量。


3

他们都是正确的。就个人而言,我更喜欢您的方法的详细程度,但这实际上取决于个人喜好。

立即运行if($ _ POST)不会引发错误-$ _POST数组存在,无论请求是否通过POST标头发送。在布尔检查中,将空数组强制转换为false。


也许在2009年,但是一个空数组!= false
clockw0rk

您可能已经错过了“ cast”一词。“ if”结构内部的语句强制转换为布尔值,因此将空数组强制转换为布尔值false。即使在2020年
Eran Galperin

3

您可以在大多数浏览器中通过按Enter键(即,无需单击“提交”按钮)来提交表单,但这并不一定将Submit作为变量发送-因此可以提交空白表单,$_POST即将为空,但表单仍会已向php页面生成了一个http发布请求。在这种情况下if ($_SERVER['REQUEST_METHOD'] == 'POST')更好。


1
在这种情况下,$_POST它不会为空:它将是一个具有空值的数组。
TRiG 2010年

0
$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");
    }
}

4
尽管您的答案可能是正确的,但没有解释就没有帮助!请看看如何回答!谢谢!
jkalden

0

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

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

-1

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


-3

这实际上是六分之一,是其他情况的六分之一。

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


-17

它们的工作方式相同,但$_POST应使用,因为它更清洁。您可以添加isset()到它以检查它是否存在。


6
$_POST将始终存在,尽管它可能为空(强制转换为boolean false)。您所说的“清洁工”是什么意思?
TRiG 2010年

2
也许他的意思是说,键盘上需要输入的字符更少= P
朱利安(Julian)2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.