$_ POST vs. $_ SERVER [‘ REQUEST_方法’] = = ‘ POST’

有人说我提交的一个 Snipplr 文件是“垃圾”,因为我用的是 if ($_SERVER['REQUEST_METHOD'] == 'POST')而不是 if ($_POST)

对我来说,检查 request 方法似乎更正确,因为这才是我真正想要做的。这两者之间是否存在操作上的差异,或者这仅仅是代码清晰性问题?

253242 次浏览

它们的工作原理相同,但是应该使用 $_POST,因为它更干净。您可以将 isset()添加到它以检查它是否存在。

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

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

其实他们做的不一样。

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

$_POST包含任何发布数据。

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

我检查了 request 方法ーー实际上我从未考虑过测试 $_POST数组。不过,我检查了所需的文章字段。所以一个空的帖子请求会给用户很多错误消息——这对我来说是有意义的。

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

这真的是一个六分之一,其他情况的六分之一。

反对您的方法的唯一可能的参数是 $_ SERVER [‘ REQUEST _ 方法’] = = ‘ POST’可能不会在某些 web 服务器/配置中填充,而 $_ POST 数组将始终存在于 PHP4/PHP5中(如果它不存在,您将遇到更大的问题(- :)

我过去常常检查 $_POST,直到我遇到麻烦与较大的 POST 数据和上传的文件。有配置指令 post_max_sizeupload_max_filesize-如果超过其中任何一个,则不填充 $_POST数组。

因此,“安全的方法”是检查 $_SERVER['REQUEST_METHOD']。尽管如此,您仍然必须在每个 $_POST变量上使用 isset(),无论您是否检查 $_SERVER['REQUEST_METHOD'],这都没有关系。

你可以通过在大多数浏览器中按下回车键(即不点击提交按钮)来提交表单,但这并不一定会将提交作为一个变量发送——所以提交一个空表单是可能的,即 $_POST将是空的,但表单仍然会生成一个对 php 页面的 http 发送请求。在这种情况下,if ($_SERVER['REQUEST_METHOD'] == '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 superglobal。

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

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

只要我需要使用多个方法访问 PHP 脚本,我实际上要做的是:

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