有些人称我的一个Snipplr提交“废话”,因为我使用的是if ($_SERVER['REQUEST_METHOD'] == 'POST')
而不是if ($_POST)
检查请求方法对我来说似乎更正确,因为这是我真正想做的事情。两者之间是否存在一些操作差异,或者这仅仅是代码清晰度问题?
答案 0 :(得分:156)
嗯,他们真的没有做同样的事情。
$_SERVER['REQUEST_METHOD']
包含请求方法(惊喜)。
$_POST
包含所有帖子数据。
POST请求可能不包含POST数据。
我检查了请求方法 - 实际上我从没想过测试$_POST
数组。不过,我检查了所需的帖子字段。因此,一个空的帖子请求会给用户带来很多错误信息 - 这对我来说很有意义。
答案 1 :(得分:33)
if ($_SERVER['REQUEST_METHOD'] == 'POST')
是正确的方法,您可以发送没有任何帖子数据的帖子请求。
答案 2 :(得分:15)
我曾经检查$_POST
,直到遇到更大的POST数据和上传文件的问题。配置指令post_max_size
和upload_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()
以检查其是否存在。