在$ _REQUEST,$ _ GET和$ _POST中,哪个最快?


177

以下哪个代码会更快?

$temp = $_REQUEST['s'];

要么

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

6
您知道第三种情况。!isset($_REQUEST['s'])
弗朗兹,

5
别人清楚地了解您的代码有多重要?POST和GET是显式的,而REQUEST可能来自各种来源。我认为效率可以忽略不计,因为始终为每个请求加载REQUEST,POST和GET超全局变量。
凯文

Answers:


273

$_REQUEST默认情况下,包含的内容$_GET$_POST$_COOKIE

但这只是默认值,具体取决于variables_order;并且不确定您要使用Cookie。

如果必须选择,我可能不会使用$_REQUEST,而是根据我的应用程序应该做的事情(即,一个或另一个,但不能同时选择两个)来选择$_GET$_POST- :一般而言:

  • $_GET当有人您的应用程序请求数据时,您应该使用。
  • 而且你应该使用$_POST的时候有人推(或删除插入或更新)数据您的应用程序。

无论哪种方式,性能都不会有太大区别:与脚本的其余部分相比,这种区别可以忽略不计。


1
理想情况下,您应该始终能够使用$ _REQUEST。但这当然只是一个完美的世界。
泰勒·卡特

2
$ _REQUEST应该(或者至少曾经)比直接使用$ _POST和$ _GET昂贵。
2009年

3
对于性能差异的概念可以忽略不计,而对于维护的观点则更为重要:+1:$ _GET和$ _POST传达了$ _REQUEST无法实现的含义。
乔恩·克拉姆

9
使用$ _REQUEST不会导致XSS / XSRF。不了解XSS / XSRF的细微差别会导致XSS / XSRF。只要使用令牌缓解,就不会有问题,并且可以获得使用$ _REQUEST的好处(所有变量都在一个超全局变量中)。实际上,由于“ variables_order”,在基于其他超全局变量使用$ _REQUEST之前,我实际上对其进行了重建。我先处理$ _COOKIE,然后处理$ _GET,然后处理$ _POST。这样,POST变量的优先级最高,而cookie变量的优先级最低,这使我可以隐式修复许多错误(例如Adobe Flash和魔术引号)。
CubicleSoft

其名称为Get = get from,Post = post to
Grumpy

32

GET与POST

1)GET和POST都创建一个数组(例如array(key => value,key2 => value2,key3 => value3,...)。该数组包含键/值对,其中键是表单控件的名称,值是来自用户的输入数据。

2)GET和POST都被视为$ _GET和$ _POST。这些是超全局变量,这意味着它们始终可以访问,而不管作用域如何-您可以从任何函数,类或文件访问它们,而无需执行任何特殊操作。

3)$ _GET是通过URL参数传递给当前脚本的变量数组。

4)$ _POST是通过HTTP POST方法传递给当前脚本的变量数组。

什么时候使用GET?

使用GET方法从表单发送的信息对所有人都是可见的(所有变量名和值都显示在URL中)。GET对发送的信息量也有限制。限制约为2000个字符。但是,由于变量显示在URL中,因此可以将页面添加为书签。在某些情况下这可能很有用。

GET可用于发送非敏感数据。

注意:绝对不要将GET用于发送密码或其他敏感信息!

什么时候使用POST?

使用POST方法从表单发送的信息对于其他人是不可见的(所有名称/值都嵌入在HTTP请求的正文中),并且对要发送的信息量没有限制。

此外,POST支持高级功能,例如在将文件上传到服务器时支持多部分二进制输入。

但是,由于变量未显示在URL中,因此无法为页面添加书签。


6
请也添加有关请求的内容。
黑色曼巴

$ _REQUEST呢?
阿米尔卡利米

22

$ _GET从查询字符串或您的URL中检索变量。

$ _POST从POST方法中检索变量,例如(通常)形式。

$ _REQUEST是$ _GET和$ _POST的合并,其中$ _POST覆盖$ _GET。可以在自引用表单上使用$ _REQUEST进行验证。


3
+1这基本上就是我所教的。不像其他答案那样技术性强,但是更容易记住(GET从查询字符串POST到表单提交)。
jp2code 2014年

18

我建议使用$_POST$_GET明确。

无论如何,通过适当的站点设计,都不必使用$ _REQUEST,并且它具有一些缺点,例如使您容易受到CSRF/XSS攻击,以及由于将数据存储在URL中而产生的其他愚蠢行为。

两种方法中的速度差异均应最小。


8

使用请求。没有人关心这种简单操作的速度,而且它的代码更简洁。


7
一个很好的答案,警告:在许多情况下,应根据情况选择GET或POST,而不要使用两者之一。
ceejayoz

3
您是对的,没有人在乎,但是我认为使用$_REQUEST是错误的结论。看我的答案。
弗朗兹(Franz)

4
为什么使用$ _REQUEST比$ _GET或$ _POST更干净?$ _REQUEST在幕后执行相同的逻辑,选择GET或POST将给您更多控制权。
杰伊·曾

6
_REQUEST更卫生的说法需要详细说明。

2
如果您希望用户能够复制URL并执行相同的操作,则建议使用GET,即(它的URL像'google.com/q=searchWord'这样可见,而POST应该用于将数据发布到网站上只应插入一次,或大量的数据是活动的,并且用户不应该能够保持URL一样在数据库中插入数据时,在登录等等
迪恩·米汉

7

不用担心 但是,您仍然应该使用第二种解决方案(对所有这些变量都不存在进行额外检查),因为存在安全问题$_REQUEST(因为$_GET并且$_POST不是该数组的唯一来源)。

$_REQUEST我相信昨天有一篇关于昨天问题的文章。我去找吧

编辑:哦,好吧,不是直接发布,而是在这里:http : //kuza55.blogspot.com/2006/03/request-variable-fixation.html


6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

使用它是因为它更安全并且不会造成明显的速度差异


根本不是一个不好的解决方案。它可以解决与之相关的安全漏洞,$_REQUEST但仍然允许以任何一种方式访问​​同一脚本(在我的情况下,同一脚本用于不同的“操作”,有时$ _GET可以,但是有时我需要$ _POST以隐藏/保护数据)。
Xandor

4

由于黑客可以设置将覆盖$ _POST或$ _GET值的cookie,因此涉及某些安全问题。如果您处理敏感数据,则不建议使用$ _REQUEST。– Xandor

你不能使用$_GET替代$_POST一些情况。

什么时候 ??

  • 当您要上传文件时。
  • 当您不显示网址中的数据时。

GET对发送的信息量也有限制。限制约为2000个字符。

其他情况很少有,您无法使用来检索数据 $_POST

什么时候 ?

  • 在URL中传递数据时。

休息服务

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

没有错用$_REQUEST

但是,这样做的方法是显式检查$ _SERVER ['REQUEST_METHOD'],而不是依靠$ _POST对于GET为空。


1
有关$_SERVER['REQUEST_METHOD']用于检查脚本是否将被任一脚本调用的良好建议。但是说没有错$_REQUEST不是100%正确。由于黑客可以设置将覆盖$ _POST或$ _GET值的cookie,因此涉及某些安全问题。如果您处理敏感数据,则不建议使用$_REQUEST
Xandor

我已经在回答中添加了您的评论,这对您有所帮助
Parth Chavda '19

3

$ _GET从查询字符串或您的URL中检索变量。

$ _POST从POST方法中检索变量,例如(通常)形式。

$ _REQUEST是$ _GET和$ _POST的合并,其中$ _POST覆盖$ _GET。可以在自引用表单上使用$ _REQUEST进行验证。


2
覆盖取决于request_order并且也可能包含cookie值,这就是为什么它不是一个非常可靠也不有用的功能的原因。
杰克

1

我将使用第二种方法,因为它更加明确。否则,您将不知道变量来自何处。

为什么仍然需要同时检查GET和POST?当然,只使用其中之一才有意义。


1
我以前见过,GET仅用于一项(例如,将其移动),并且POST用于多个项(带有复选框的表单...)。
弗朗兹(Franz)

1

我只使用_GET或_POST。我更喜欢控制。

我不喜欢OP中的任何代码片段,因为它们会丢弃有关使用哪种HTTP方法的信息。而且该信息对于输入卫生很重要。

例如,如果脚本从将要输入到数据库的表单中接受数据,则该表单最好使用POST(仅将GET用于幂等动作)。但是,如果脚本通过GET方法接收输入数据,则应该(通常)将其拒绝。对我来说,这种情况可能需要向错误日志中写入安全冲突,因为这是有人尝试尝试的标志。

使用OP中的任何代码片段,都无法进行这种清理。


实际上,编写一个小页面将您想要的内容发布到页面上非常简单。因此,除非您依靠发送的引荐来源标头,否则后变种比获取变种更安全。我认为显式$_POST方法的最大优点是可以防止搜索引擎爬网程序执行以下操作:thedailywtf.com/Articles/WellIntented-Destruction.aspx
Duroth,2009年

我没有说相反的话。我说的是,如果HTML表单使用POST,并且处理它的脚本通过GET接收表单的数据,那么脚本将希望了解它,而不是像kobra的两个示例一样抛弃这一事实。(顺便说一句:推荐人也不安全。)

1

我会用$_POST$_GET因为与$_REQUEST它们的内容不同,它不受variables_order
什么时候使用$_POST$_GET取决于执行哪种操作。更改从服务器处理的数据的操作应通过POST请求完成,而其他操作应通过GET请求完成。举个例子,删除用户帐户的操作不应在用户单击链接后直接执行,而可以通过链接查看图像。


1

我用这个

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

该语句验证$ _REQUEST是否具有多个参数($ _REQUEST中的第一个参数将是可以在需要时使用的请求uri,某些PHP软件包不会返回$ _GET,因此请检查$ _GET是否大于1。默认情况下,它将是$ _POST。


0

您过早优化。另外,出于安全原因,您应该真正考虑是否应将GET用于正在发布的内容。


3
请不要试图告诉人们POST的安全性比GET的安全性高。

我没有。重点是应该对它们的使用进行一些考虑,而不应公然互换使用,因为“只需键入REQUEST会容易得多”。
亚历克斯·布拉塞特维克09年

如果您的意思是kobra应该检查数据是否使用预期的方法发送,那么我同意。他的两个代码示例均无法进行此类测试。

0

这很丑陋,在实时发布代码时,我不建议将其作为最终解决方案,但是在构建rest函数时,有时可以使用“ catch-all”参数捕获器:

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

甚至可能有人添加了创意来处理命令行参数或来自IDE的任何东西。一旦确定了给定的休息功能在做什么,就可以为该给定的调用选择一个合适的功能,以确保获得所需的部署版本。假设设置了“ REQUEST_METHOD”。

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.