2009-12-17 28 views
160

以下哪些代碼會更快?

$temp = $_REQUEST['s']; 

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

還有第三種情況,你知道。'!isset($ _ REQUEST ['s'])' – Franz 2009-12-17 22:10:16

+4

其他人對你的代碼的理解有多重要?POST和GET是明確的,而REQUEST可能來自不同的來源。我認爲效率很低因爲REQUEST,POST和GET超全局變量總是爲每個請求加載。 – Kevin 2009-12-17 22:31:50

回答

241

$_REQUEST默認情況下包含$_GET,$_POST$_COOKIE的內容。

但這只是一個默認值,取決於variables_order;並不確定你想使用cookie。

如果讓我選擇,我可能不會使用$_REQUEST$_GET$_POST我會選擇 - 這取決於我的應用程序應該做的事情(即一個或另一個,但不能同時):一般說:

  • 你應該當有人從您的應用程序請求數據使用$_GET
  • 而當有人推送(插入或更新;或刪除)數據您應用程序時,您應該使用$_POST

無論哪種方式,性能沒有太大差別:與腳本的其餘部分相比,差別不會太大。

+1

理想情況下,你應該永遠是abl e使用$ _REQUEST。但那當然只是一個完美的世界。 – 2009-12-17 22:16:22

+33

一個完美的世界,XSS是不可能的...... – 2009-12-17 22:30:34

+2

$ _REQUEST被認爲(或者至少曾經是)比直接使用$ _POST和$ _GET更加昂貴。 – 2009-12-17 22:47:58

8

使用請求。沒有人關心這種簡單操作的速度,而且代碼更簡潔。

+7

好的答案,在許多情況下,應根據情況選擇GET或POST,而不是使用任何一種。 – ceejayoz 2009-12-17 22:11:11

+3

你是對的,沒有人在意,但在我看來,使用'$ _REQUEST'是錯誤的結論。看到我的答案。 – Franz 2009-12-17 22:13:24

+4

與$ _GET或$ _POST相比,爲什麼使用$ _REQUEST更清潔? $ _REQUEST在場景後面執行相同的邏輯,選擇GET或POST可以給你更多的控制權。 – 2009-12-17 22:17:31

1

我會使用第二種方法,因爲它更明確。否則,你不知道變量來自哪裏。

爲什麼你需要同時檢查GET和POST?當然使用其中一種只會更有意義。

+1

我以前見過這種情況,'GET'只用於一個項目(例如移動它)和'POST'以獲取其中的多個項目複選框...)。 – Franz 2009-12-17 22:12:21

7

別擔心。但是您仍然應該使用第二種解決方案(再加上額外檢查是否存在這些變量),因爲$_REQUEST存在安全問題(因爲$_GET$_POST不是該陣列的唯一來源)。

昨天有一篇關於$_REQUEST的問題,我相信。讓我去找它。

編輯:哦,不直接在後,但在這裏它是無論如何:http://kuza55.blogspot.com/2006/03/request-variable-fixation.html

17

我建議使用$_POST$_GET明確。

無論如何,使用$ _REQUEST對於正確的網站設計來說應該是不必要的,它帶來了一些缺點,例如讓您更容易發現CSRF/XSS攻擊和其他來自URL中數據存儲的愚蠢行爲。

速度差異應該是最小的任一方式。

0

您正在過早優化。另外,出於安全原因,您應該考慮是否將GET用於發佈內容。

+2

請不要試圖告訴民衆,關於POST比任何東西都更安全關於GET。 – 2009-12-17 22:23:07

+0

我沒有。要點是,他們的使用應該考慮一下,而不是公然交替使用,因爲「只需輸入REQUEST就可以了。 IER」。 – 2009-12-17 22:29:17

+0

如果您的意思是kobra應該使用預期的方法檢查數據是否已發送,那麼我同意。他的任何一個代碼示例都使這種測試變得不可能。 – 2009-12-17 22:39:57

1

我只用過_GET或_POST。我更喜歡控制。

我不喜歡OP中的任何代碼片段,他們放棄了使用HTTP方法的信息。這些信息對於輸入消毒是重要的。

例如,如果腳本接受要輸入到數據庫中的表單的數據,那麼表單最好使用POST(use GET only for idempotent actions)。但是,如果腳本通過GET方法接收輸入數據,那麼它應該(通常)被拒絕。對我而言,這種情況可能需要在錯誤日誌中寫入安全違規行爲,因爲這是某人正在嘗試的某種信號。

在OP中的任一代碼片段中,這種消毒是不可能的。

+0

實際上,寫一個小頁面可以簡單地寫出任何你想要的頁面。所以除非你依賴發送的引用頭信息,否則後變量比獲得變量更安全。我認爲明確的'$ _POST'的最大優點是阻止搜索引擎爬行者做這樣的事情:http://thedailywtf.com/Articles/WellIntentioned-Destruction.aspx – Duroth 2009-12-17 22:50:46

+0

我沒有說任何相反的事情。 我說的是,如果HTML表單使用POST並且處理它的腳本通過GET接收表單的數據,那麼腳本會想知道它,而不是像Kobra的例子那樣拋棄這個事實。 (順便說一句:引用者也不安全。) – 2009-12-17 23:16:55

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

使用,因爲它是更安全,它不會使明顯的速度差異

1

我會用$_POST,並$_GET因爲不同於$_REQUEST其內容不受variables_order影響。
何時使用$_POST$_GET取決於正在執行什麼樣的操作。更改從服務器處理的數據的操作應通過POST請求完成,而其他操作應通過GET請求完成。舉個例子,刪除用戶賬戶的操作不應該在用戶點擊鏈接後直接執行,而查看圖像可以通過鏈接完成。

18

$ _GET從查詢字符串,或者網址檢索變量。>

_POST $檢索從POST方法的變量,如(通常)的形式。

$ _REQUEST是$ _GET和$ _POST的合併,其中$ _POST覆蓋$ _GET。很好地使用$ _REQUEST自我更新形式進行驗證。

+2

+1這基本上是我教過的東西。不像其他答案那樣具有技術性,但更容易記住(從查詢字符串'GET',從表單提交'POST')。 – jp2code 2014-04-04 14:58:45

+0

酷酷且簡單的瞭解這個概念。 – 2014-09-22 09:47:41

28

GET與POST

1)GET和POST創建一個陣列(例如陣列(密鑰=>值,鍵2 =>值2,KEY3 =>值3,...))。該數組包含鍵/值對,其中鍵是表單控件的名稱,值是來自用戶的輸入數據。

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中,因此無法爲頁面添加書籤。

+2

請加上一些關於REQUEST的內容。 – 2017-03-03 09:46:17

5

$ _GET從查詢字符串,或者網址檢索變量。>

_POST $檢索從POST方法的變量,如(通常)的形式。

$ _REQUEST是$ _GET和$ _POST的合併,其中$ _POST覆蓋$ _GET。很好地使用$ _REQUEST自我更新形式進行驗證。

+1

重寫取決於['request_order'](http://www.php.net/manual/en/ini.core.php#ini.request-order),也可能包含cookie值,這就是爲什麼它不是非常可靠也不實用的功能。 – 2014-04-21 07:09:24

2

無論速度,當你使用檢索到$ _GET數據,$ _ POST或$ _REQUEST

但不管是你不能在某些情況下可以使用$_GET替代$_POST

何時?

  • 當你想上傳文件。
  • 當你不會在url中顯示數據。

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。

0

我用這個,

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

的聲明證實,如果$ _REQUEST有不止一個參數(在$ _REQUEST的第一個參數是可以在需要時使用請求URI, 一些PHP包不會返回$ _GET,以檢查它是否超過1爲$ _GET,默認情況下爲$ _POST。

相關問題