ในบรรดา $ _REQUEST, $ _GET และ $ _POST อันไหนที่เร็วที่สุด?


177

รหัสใดจะเร็วขึ้น

$temp = $_REQUEST['s'];

หรือ

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

6
มีกรณีที่สามคือ y'know !isset($_REQUEST['s']).
ฟรานซ์

5
มันมีความสำคัญอย่างไรที่คนอื่นเข้าใจรหัสของคุณอย่างชัดเจน POST และ GET นั้นชัดเจนในขณะที่คำขออาจมาจากแหล่งต่าง ๆ ฉันคิดว่าประสิทธิภาพมีน้อยมากเนื่องจากการร้องขอ POST และ GET superglobals มักจะถูกโหลดสำหรับการร้องขอแต่ละครั้ง
เควิน

คำตอบ:


273

$_REQUESTโดยค่าเริ่มต้นที่มีเนื้อหาของ$_GET, และ$_POST$_COOKIE

แต่เป็นเพียงค่าเริ่มต้นเท่านั้นซึ่งขึ้นอยู่กับvariables_order; และไม่แน่ใจว่าคุณต้องการทำงานกับคุกกี้หรือไม่

ถ้าฉันต้องเลือกฉันอาจจะไม่ใช้$_REQUESTและฉันจะเลือก$_GETหรือ$_POST- ขึ้นอยู่กับสิ่งที่ใบสมัครของฉันควรจะทำ (เช่นอย่างใดอย่างหนึ่งหรืออื่น ๆ แต่ไม่ใช่ทั้งสองอย่าง) : โดยทั่วไปแล้วการพูด:

  • คุณควรใช้$_GETเมื่อมีคนร้องขอข้อมูลจากแอปพลิเคชันของคุณ
  • และคุณควรใช้$_POSTเมื่อมีคนผลักข้อมูล(แทรกหรืออัปเดตหรือลบ)ข้อมูลไปยังแอปพลิเคชันของคุณ

ไม่ว่าจะด้วยวิธีใดจะมีความแตกต่างไม่มากนักเกี่ยวกับการแสดง: ความแตกต่างจะเล็กน้อยเมื่อเทียบกับสคริปต์ที่เหลือของคุณ


1
เป็นการดีที่คุณควรใช้ $ _REQUEST เสมอ แต่แน่นอนว่าเป็นเพียงโลกที่สมบูรณ์แบบ
Tyler Carter

2
$ _REQUEST ถูกคาดคะเน (หรืออย่างน้อยก็เคย) ราคาแพงกว่าการใช้ $ _POST และ $ _GET โดยตรง
ดาร์เรล Brogdon

3
+1 สำหรับแนวคิดของความแตกต่างของประสิทธิภาพที่ไม่สำคัญและมุมมองการบำรุงรักษามีความสำคัญมากกว่า: $ _GET และ $ _POST ถ่ายทอดความหมายในแบบที่ $ _REQUEST ไม่สามารถทำได้
Jon Cram

9
การใช้ $ _REQUEST ไม่ทำให้ XSS / XSRF ไม่เข้าใจความแตกต่างของ XSS / XSRF ทำให้ XSS / XSRF ตราบใดที่คุณลดโทเค็นก็ไม่มีปัญหาและคุณจะได้รับประโยชน์จากการใช้ $ _REQUEST (ตัวแปรทั้งหมดของคุณอยู่ใน superglobal เดียว) ฉันสร้าง $ _REQUEST ขึ้นใหม่จริง ๆ ก่อนที่จะใช้มันโดยอิงจาก superglobals อื่น ๆ เนื่องจาก 'variables_order' ฉันประมวลผล $ _COOKIE จากนั้น $ _GET จากนั้น $ _POST ด้วยวิธีดังกล่าว POST vars จะมีลำดับความสำคัญสูงสุดและ vars ของคุกกี้มีค่าต่ำสุดซึ่งทำให้ฉันสามารถแก้ไขข้อบกพร่องจำนวนหนึ่ง (เช่น Adobe Flash และราคาอัญประกาศโดยปริยาย)
CubicleSoft

ในชื่อ Get = get from, Post = โพสต์ไปยัง
Grumpy

32

รับกับ POST

1) ทั้ง GET และ POST สร้างอาร์เรย์ (เช่นอาร์เรย์ (key => value, key2 => value2, key3 => value3, ... )) อาร์เรย์นี้มีคู่ของคีย์ / ค่าโดยที่คีย์คือชื่อของตัวควบคุมฟอร์มและค่าคือข้อมูลอินพุตจากผู้ใช้

2) ทั้ง GET และ POST ถือเป็น $ _GET และ $ _POST สิ่งเหล่านี้คือ superglobals ซึ่งหมายความว่าพวกมันสามารถเข้าถึงได้เสมอโดยไม่คำนึงถึงขอบเขตและคุณสามารถเข้าถึงได้จากฟังก์ชั่นคลาสหรือไฟล์ใด ๆ โดยไม่ต้องทำอะไรเป็นพิเศษ

3) $ _GET เป็นอาร์เรย์ของตัวแปรที่ส่งผ่านไปยังสคริปต์ปัจจุบันผ่านพารามิเตอร์ URL

4) $ _POST เป็นอาร์เรย์ของตัวแปรที่ส่งผ่านไปยังสคริปต์ปัจจุบันผ่านวิธี HTTP POST

จะใช้ GET เมื่อไหร่?

ข้อมูลที่ส่งจากแบบฟอร์มด้วยวิธีการ GET จะปรากฏแก่ทุกคน (ชื่อและค่าตัวแปรทั้งหมดจะแสดงใน URL) GET ยังมีข้อ จำกัด เกี่ยวกับปริมาณข้อมูลที่จะส่ง ข้อ จำกัด นี้มีประมาณ 2000 ตัวอักษร อย่างไรก็ตามเนื่องจากตัวแปรจะแสดงใน URL จึงเป็นไปได้ที่จะบุ๊กมาร์กหน้า สิ่งนี้มีประโยชน์ในบางกรณี

GET อาจใช้สำหรับการส่งข้อมูลที่ไม่สำคัญ

หมายเหตุ: GET ไม่ควรใช้สำหรับการส่งรหัสผ่านหรือข้อมูลที่ละเอียดอ่อนอื่น ๆ !

ควรใช้ POST เมื่อใด

ข้อมูลที่ส่งจากแบบฟอร์มด้วยวิธีการ POST จะไม่ปรากฏแก่ผู้อื่น (ชื่อ / ค่าทั้งหมดจะถูกฝังอยู่ภายในเนื้อความของคำขอ HTTP) และไม่มีข้อ จำกัด เกี่ยวกับปริมาณข้อมูลที่จะส่ง

นอกจากนี้ POST ยังรองรับฟังก์ชั่นขั้นสูงเช่นการสนับสนุนอินพุตไบนารี่แบบหลายส่วนในขณะอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์

อย่างไรก็ตามเนื่องจากตัวแปรจะไม่ปรากฏใน URL จึงไม่สามารถคั่นหน้าได้


6
โปรดเพิ่มบางอย่างเกี่ยวกับคำขอด้วย
Black Mamba

แล้ว $ _REQUEST ล่ะ
Aamir Kalimi

22

$ _GET ดึงข้อมูลตัวแปรจากการสืบค้นหรือ URL ของคุณ>

$ _POST ดึงข้อมูลตัวแปรจากเมธอด POST เช่น (โดยทั่วไป) แบบฟอร์ม

$ _REQUEST เป็นการรวม $ _GET และ $ _POST โดยที่ $ _POST แทนที่ $ _GET ดีที่จะใช้ $ _REQUEST ในแบบฟอร์มการอ้างอิงตนเองสำหรับการตรวจสอบ


3
+1 นี่คือสิ่งที่ฉันสอน ไม่ใช่คำตอบทางเทคนิคเหมือนกับคำตอบอื่น ๆ แต่จำได้ง่ายกว่า ( GETจากสตริงข้อความค้นหาPOSTจากการส่งแบบฟอร์ม)
jp2code

18

ฉันขอแนะนำให้ใช้$_POSTและ$_GETอย่างชัดเจน

การใช้ $ _REQUEST นั้นไม่จำเป็นสำหรับการออกแบบเว็บไซต์ที่เหมาะสมและมันมีข้อเสียบางประการเช่นทำให้คุณเปิดการCSRF/XSSโจมตีได้ง่ายขึ้นและความบ้าคลั่งอื่น ๆ ที่มาจากการจัดเก็บข้อมูลใน URL

ความแตกต่างความเร็วควรน้อยที่สุดทั้งสองวิธี


8

ใช้คำขอ ไม่มีใครสนใจความเร็วของการใช้งานที่ง่ายและมันเป็นโค้ดที่สะอาดกว่ามาก


7
คำตอบที่ดีด้วยข้อแม้ที่ในหลาย ๆ สถานการณ์ควรเลือก GET หรือ POST ตามสถานการณ์แทนที่จะใช้อย่างใดอย่างหนึ่ง
ceejayoz

3
คุณพูดถูกที่ไม่มีใครใส่ใจ แต่ในความคิดของฉันใช้$_REQUESTเป็นข้อสรุปที่ผิด ดูคำตอบของฉัน
ฟรานซ์

4
ทำไมการใช้ $ _REQUEST จึงสะอาดกว่าเมื่อเทียบกับ $ _GET หรือ $ _POST $ _REQUEST ดำเนินการตรรกะเดียวกันเบื้องหลังและการเลือก GET หรือ POST จะช่วยให้คุณควบคุมได้มากขึ้น
Jay Zeng

6
การอ้างสิทธิ์ _REQUEST นั้นเป็นเรื่องที่ถูกสุขอนามัยมากกว่านี้

2
ฉันขอแนะนำให้ใช้ GET หากคุณต้องการให้ผู้ใช้สามารถคัดลอก URL และดำเนินการก่อนการดำเนินการเช่นเดียวกัน (URL นั้นจะปรากฏเช่น 'google.com/q=searchWord' ในขณะที่ POST ควรใช้โพสต์ข้อมูลไปยังเว็บไซต์ ที่ควรจะแทรกเพียงครั้งเดียวหรือข้อมูลจำนวนมากมีการใช้งานและผู้ใช้ไม่ควรที่จะเก็บ URL เช่นการแทรกข้อมูลในฐานข้อมูลการเข้าสู่ระบบ ฯลฯ
Dean Meehan

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 หากคุณจัดการกับข้อมูลที่ละเอียดอ่อนฉันจะไม่แนะนำให้ใช้ $ _REQUEST - Xandor

คุณไม่สามารถใช้$_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


1
คำแนะนำที่ดีเกี่ยวกับการใช้$_SERVER['REQUEST_METHOD']เพื่อตรวจสอบว่าสคริปต์จะถูกเรียกด้วยอย่างใดอย่างหนึ่ง แต่จะบอกว่าไม่มีอะไรผิดปกติกับ$_REQUESTไม่จริง 100% มีข้อกังวลด้านความปลอดภัยบางอย่างที่เกี่ยวข้องในฐานะที่แฮ็กเกอร์สามารถตั้งค่าคุกกี้ที่จะแทนที่ค่า $ _POST หรือ $ _GET $_REQUESTหากคุณจัดการกับข้อมูลที่สำคัญผมจะไม่แนะนำให้ใช้
Xandor

ฉันได้เพิ่มความคิดเห็นของคุณในคำตอบของฉันมันช่วยขอบคุณ
Parth Chavda

3

$ _GET ดึงข้อมูลตัวแปรจากการสืบค้นหรือ URL ของคุณ>

$ _POST ดึงข้อมูลตัวแปรจากเมธอด POST เช่น (โดยทั่วไป) แบบฟอร์ม

$ _REQUEST เป็นการรวม $ _GET และ $ _POST โดยที่ $ _POST แทนที่ $ _GET ดีที่จะใช้ $ _REQUEST ในแบบฟอร์มการอ้างอิงตนเองสำหรับการตรวจสอบ


2
การเอาชนะนั้นขึ้นอยู่กับrequest_orderและอาจมีค่าคุกกี้ด้วยซึ่งเป็นเหตุผลว่าทำไมคุณสมบัตินี้จึงไม่น่าเชื่อถือหรือมีประโยชน์
Ja͢ck

1

ฉันจะใช้วิธีที่สองเนื่องจากชัดเจนกว่า ไม่เช่นนั้นคุณไม่รู้ว่าตัวแปรมาจากไหน

ทำไมคุณต้องตรวจสอบทั้ง GET และ POST แน่นอนการใช้อย่างใดอย่างหนึ่งเท่านั้นทำให้รู้สึกมากขึ้น


1
ฉันเคยเห็นสิ่งนี้มาก่อนโดยมีGETการใช้เพียงรายการเดียว (เช่นย้าย) และPOSTหลายรายการ (แบบฟอร์มที่มีช่องทำเครื่องหมาย ... )
ฟรานซ์

1

ฉันใช้ _GET หรือ _POST เท่านั้น ฉันชอบที่จะมีการควบคุม

สิ่งที่ฉันไม่ชอบเกี่ยวกับส่วนของรหัสใน OP คือพวกเขาละทิ้งข้อมูลที่ใช้วิธีการ HTTP และข้อมูลนั้นเป็นสิ่งสำคัญสำหรับการฆ่าเชื้ออินพุต

ตัวอย่างเช่นหากสคริปต์ยอมรับข้อมูลจากแบบฟอร์มที่จะถูกป้อนลงในฐานข้อมูลแล้วแบบฟอร์มนั้นควรใช้ POST ( ใช้ GET เฉพาะสำหรับการกระทำ idempotent เท่านั้น ) แต่ถ้าสคริปต์ได้รับข้อมูลอินพุตผ่านวิธีการ GET ก็ควรจะปฏิเสธ (ปกติ) สำหรับฉันสถานการณ์ดังกล่าวอาจรับประกันว่าการละเมิดความปลอดภัยลงในบันทึกข้อผิดพลาดเนื่องจากเป็นสัญญาณว่ามีคนพยายามทำบางสิ่งบางอย่าง

ด้วยการแยกส่วนของรหัสใน OP ทำให้ไม่สามารถฆ่าเชื้อโรคนี้ได้


ที่จริงแล้วมันง่ายมากที่จะเขียนหน้าเล็ก ๆ ที่โพสต์สิ่งที่คุณต้องการลงในหน้า ดังนั้นถ้าคุณไม่ต้องพึ่งพาส่วนหัวของผู้อ้างอิงที่ถูกส่งไปโพสต์ vars จะไม่ปลอดภัยกว่าการรับ vars ฉันคิดว่าประโยชน์ที่ใหญ่ที่สุดของอย่างชัดเจน$_POSTเพื่อป้องกันไม่ให้โปรแกรมรวบรวมข้อมูลเครื่องมือค้นหาจากการทำบางสิ่งบางอย่างเช่นนี้thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth

ฉันไม่ได้พูดอะไรเลย สิ่งที่ฉันพูดคือถ้ารูปแบบ HTML ใช้ POST และการจัดการสคริปต์จะได้รับข้อมูลของแบบฟอร์มผ่าน GET ดังนั้นสคริปต์จะต้องการทราบเกี่ยวกับมันและไม่โยนความเป็นจริงออกไปดังตัวอย่างของ kobra (Btw: ผู้อ้างอิงไม่ปลอดภัยเช่นกัน)

1

ผมจะใช้$_POSTและ$_GETเพราะแตกต่างจากเนื้อหาของพวกเขาจะไม่ได้รับอิทธิพลจาก$_REQUEST ควรใช้เมื่อใดและขึ้นอยู่กับประเภทของการดำเนินการ การดำเนินการที่เปลี่ยนแปลงข้อมูลที่จัดการจากเซิร์ฟเวอร์ควรทำผ่านการร้องขอ POST ในขณะที่การดำเนินการอื่น ๆ ควรทำผ่านคำขอ GET เพื่อให้เป็นตัวอย่างการดำเนินการที่ลบบัญชีผู้ใช้ไม่ควรดำเนินการโดยตรงหลังจากที่ผู้ใช้คลิกที่ลิงค์ในขณะที่ดูภาพสามารถทำได้ผ่านลิงค์variables_order
$_POST$_GET


1

ฉันใช้สิ่งนี้

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

คำสั่งตรวจสอบถ้า $ _REQUEST มีมากกว่าหนึ่งพารามิเตอร์ (พารามิเตอร์แรกใน $ _REQUEST จะเป็นคำขอ uri ซึ่งสามารถใช้เมื่อจำเป็นแพ็คเกจ PHP บางตัวจะไม่ส่งคืน $ _GET ดังนั้นให้ตรวจสอบว่ามีมากกว่า 1 $ สำหรับ $ _GET หรือไม่ เริ่มต้นมันจะเป็น $ _POST


0

คุณกำลังเพิ่มประสิทธิภาพก่อนกำหนด นอกจากนี้คุณควรคำนึงถึงความจริงว่า GET ควรใช้กับสิ่งที่คุณโพสต์หรือไม่ด้วยเหตุผลด้านความปลอดภัย


3
โปรดอย่าพยายามบอกชาวบ้านว่ามีความปลอดภัยอะไรเกี่ยวกับ POST มากกว่าเกี่ยวกับ GET

ฉันไม่ได้. ประเด็นก็คือการใช้งานของพวกเขาควรได้รับความคิดบางอย่างและไม่ได้ใช้อย่างโจ๋งครึ่มเพราะ "เพียงแค่พิมพ์การร้องขอนั้นง่ายกว่ามาก"
Alex Brasetvik

หากสิ่งที่คุณหมายถึงคือ kobra ควรตรวจสอบว่าข้อมูลถูกส่งโดยใช้วิธีที่คาดหวังไว้แล้วฉันเห็นด้วย ตัวอย่างรหัสใดอันหนึ่งของเขาทำให้การทดสอบนั้นเป็นไปไม่ได้

0

มันน่าเกลียดและฉันจะไม่แนะนำให้ใช้เป็นทางออกสุดท้ายเมื่อกดรหัสสด แต่ในขณะที่สร้างฟังก์ชั่นการพักผ่อนบางครั้งมันก็มีประโยชน์ที่จะมี Grabber พารามิเตอร์ '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'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.