$ _POST เทียบกับ $ _SERVER ['REQUEST_METHOD'] == 'POST'


130

ผู้ชายบางคนเรียกหนึ่งในการส่ง Snipplr ของฉันว่า "อึ" เพราะฉันใช้if ($_SERVER['REQUEST_METHOD'] == 'POST')แทนif ($_POST)

การตรวจสอบวิธีการร้องขอดูเหมือนจะถูกต้องสำหรับฉันมากกว่าเพราะนั่นคือสิ่งที่ฉันต้องการทำจริงๆ มีความแตกต่างในการดำเนินงานระหว่างทั้งสองอย่างหรือเป็นเพียงปัญหาความชัดเจนของรหัส


214
บอกผู้ชายคนนั้นว่าเขาห่วย
Vinko Vrsalovic

12
คุณควรใช้===แทนของที่นี่เป็น== 0 == 'POST'
dave1010

5
$ _SERVER ["REQUEST_METHOD"] อาจมี "POST" สำหรับคำขอ HTTP GET ในการติดตั้ง PHP + Apache2 บางรายการ เหมือนของฉัน และนี่คือวิธีที่ฉันมาที่นี่
Tiberiu-Ionuț Stan

3
@ Tiberiu-IonuțStan ถ้าเป็นจริง (ซึ่งฉันไม่เชื่อว่าเป็น) มันเป็นข้อผิดพลาดที่ร้ายแรงอย่างยิ่ง คุณสามารถให้ลิงค์ไปยังรายงานข้อบกพร่องของ PHP หรือ Apache ได้หรือไม่? ขั้นตอนในการทำซ้ำ? อย่างที่เป็นอยู่ฉันไม่เชื่อคุณ
Mark Amery

1
@ dave1010 ทำไม$_SERVER['REQUEST_METHOD']ต้องเป็นเบอร์0? เท่าที่ฉันรู้นั่นเป็นไปไม่ได้
Mark Amery

คำตอบ:


169

พวกเขาไม่ได้ทำสิ่งเดียวกันจริงๆ

$_SERVER['REQUEST_METHOD'] มีวิธีการร้องขอ (แปลกใจ)

$_POST มีข้อมูลโพสต์ใด ๆ

เป็นไปได้ที่คำขอ POST จะไม่มีข้อมูล POST

ฉันตรวจสอบวิธีการร้องขอ - ที่จริงฉันไม่เคยคิดเกี่ยวกับการทดสอบ$_POSTอาร์เรย์ ฉันตรวจสอบช่องโพสต์ที่จำเป็นแม้ว่า ดังนั้นคำขอโพสต์ที่ว่างเปล่าจะทำให้ผู้ใช้มีข้อความแสดงข้อผิดพลาดจำนวนมากซึ่งก็สมเหตุสมผลสำหรับฉัน


ในทางทฤษฎีอาจเป็นไปได้ว่าวิธีการร้องขอคือ 'โพสต์' (ตัวพิมพ์เล็กหรือแบบผสม) PHP ทำความสะอาดสิ่งนี้โดยอัตโนมัติใน GET และ POST หรือไม่
Boldewyn

หลังจากการทดสอบสั้น ๆ PHP 5.2 ของฉันบน WinXP ไม่ได้ทำอย่างเห็นได้ชัดดังนั้นจึงอาจทำให้ request_method ถูกฆ่าเชื้อเป็นตัวพิมพ์ใหญ่เท่านั้น
Boldewyn

3
@Boldewyn ไม่มันไม่ได้ แต่ถ้าลูกค้าส่งวิธีการขอ 'โพสต์' หรือ 'โพสต์' ถึงคุณเมื่อพวกเขาตั้งใจจะดำเนินการตามคำขอ POST แสดงว่าพวกเขาละเมิดข้อกำหนดเนื่องจากเมธอด HTTP เป็นกรณี ๆ ไป ตามข้อมูลจำเพาะและข้อมูลจำเพาะกำหนดเฉพาะวิธีการ POST เท่านั้นไม่ใช่เช่นโพสต์หรือวิธีการโพสต์หรือ pOsT ผมเข้าไปดูรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ในคำตอบของฉันที่นี่: stackoverflow.com/a/21511879/1709587 ไม่ว่าคุณต้องการบังคับให้วิธีการเป็นตัวพิมพ์ใหญ่เพื่อจัดการกับรหัสไคลเอ็นต์ที่ละเมิดข้อมูลจำเพาะเป็นทางเลือกของคุณหรือไม่
Mark Amery

และเนื่องจากไม่ใช่สิ่งเดียวกันจึงทำให้รู้สึกว่าเราอาจใช้สิ่งเหล่านี้สำหรับสิ่งที่แตกต่างกันเช่นพิมพ์และขอ payload ฉันสงสัยว่าสิ่งนี้ทำให้ใคร ๆ คิดไม่ออก: ฉันใช้ $ _SERVER ['REQUEST_METHOD'] เพื่อค้นหาว่าเรากำลังทำอะไรอยู่และฉันใช้ $ _REQUEST เพื่อเข้าถึง payload ซึ่งรักษาความเป็นอิสระเล็กน้อยระหว่างแนวคิด (หรืออีกนัยหนึ่งคือฉัน ไม่ค่อยใช้ $ _POST หรือ $ _GET โดยเฉพาะ)
Grantwparks

@grantwparks นั่นฟังดูเหมือนข้อตกลงที่ไม่ดี $ _GET และ $ _POST มีส่วนเกี่ยวข้องกับสถานที่ขนส่งข้อมูล พิจารณา: "curl -k -L -X POST -H 'Content-Type: text / csv' --data-binary \ @ sample.csv 'test-script.php? test = 12345'" ค่า "test" จะเติม $ _GET แม้ว่าวิธีนี้จะเป็น POST ก็ตาม
txyoji

37

if ($_SERVER['REQUEST_METHOD'] == 'POST') เป็นวิธีที่ถูกต้องคุณสามารถส่งคำขอโพสต์โดยไม่ต้องโพสต์ข้อมูลใด ๆ


17

ฉันเคยตรวจสอบ$_POSTจนกระทั่งพบปัญหาเกี่ยวกับข้อมูล POST ที่ใหญ่ขึ้นและไฟล์ที่อัปโหลด มีคำสั่งการกำหนดค่าpost_max_sizeและupload_max_filesize- หากเกินจำนวนนั้น$_POSTอาร์เรย์จะไม่ถูกเติม

ดังนั้น "วิธีที่ปลอดภัย" $_SERVER['REQUEST_METHOD']คือการตรวจสอบ คุณยังมีการใช้งานisset()ในทุกตัวแปรแม้ว่าและมันไม่สำคัญว่าคุณตรวจสอบหรือไม่ได้ตรวจสอบ$_POST$_SERVER['REQUEST_METHOD']


9

หากแอปพลิเคชันของคุณต้องการตอบสนองตามคำขอประเภทโพสต์ให้ใช้สิ่งนี้:

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


3

ถูกต้องทั้งคู่ โดยส่วนตัวแล้วฉันชอบแนวทางของคุณมากกว่าสำหรับความฟุ่มเฟือย แต่มันขึ้นอยู่กับความชอบส่วนตัว

ถ้าหาก ($ _ POST) ไม่แสดงข้อผิดพลาด - มีอาร์เรย์ $ _POST อยู่ไม่ว่าคำขอจะถูกส่งพร้อมกับส่วนหัว POST หรือไม่ อาร์เรย์ว่างถูกส่งเป็นเท็จในการตรวจสอบบูลีน


อาจจะในปี 2009 แต่อาร์เรย์ว่างเปล่า! = false
clockw0rk

1
คุณอาจพลาดคำว่า "แคสต์" คำสั่งภายในโครงสร้าง "if" ถูกส่งไปยังบูลีนและอาร์เรย์ว่างจะถูกส่งไปยังบูลีนเท็จ แม้ในปี 2020
Eran Galperin

ฮ่า ๆ ใช่แล้ว +1
clockw0rk

3

คุณสามารถส่งแบบฟอร์มได้โดยกดปุ่ม Enter (เช่นโดยไม่ต้องคลิกปุ่มส่ง) ในเบราว์เซอร์ส่วนใหญ่ แต่ไม่จำเป็นต้องส่ง submit เป็นตัวแปรดังนั้นจึงเป็นไปได้ที่จะส่งแบบฟอร์มเปล่าเช่น$_POSTจะว่างเปล่า แต่ฟอร์มจะยังคงอยู่ ได้สร้างคำขอโพสต์ http ไปยังหน้า php ในกรณีนี้if ($_SERVER['REQUEST_METHOD'] == 'POST')จะดีกว่า


1
ในกรณีนั้น$_POSTจะไม่ว่างเปล่า: จะเป็นอาร์เรย์ที่มีค่าว่าง
TRiG

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

4
แม้ว่าคำตอบของคุณอาจจะถูกต้อง แต่ก็ไม่มีประโยชน์หากไม่มีคำอธิบาย! โปรดดูวิธีการตอบ ! ขอบคุณ!
jkalden

0

ตราบเท่าที่ฉันอาจต้องเข้าถึงสคริปต์ PHP ของฉันด้วยวิธีการมากกว่าหนึ่งวิธีสิ่งที่ฉันทำคือ:

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

-1

ตรวจสอบว่าเพจถูกเรียกผ่าน POST หรือไม่ (ตรงข้ามกับ GET, HEAD ฯลฯ ) เมื่อคุณพิมพ์ URL ในแถบเมนูเพจจะถูกเรียกผ่าน GET อย่างไรก็ตามเมื่อคุณส่งแบบฟอร์มด้วย method = "post" หน้าการดำเนินการจะถูกเรียกด้วย POST


-3

มันเป็น 6 ในหนึ่งครึ่งโหลของสถานการณ์อื่น ๆ

อาร์กิวเมนต์เดียวที่เป็นไปได้สำหรับแนวทางของคุณคือ $ _SERVER ['REQUEST_METHOD'] == 'POST' อาจไม่ถูกเติมในเว็บเซิร์ฟเวอร์ / การกำหนดค่าบางอย่างในขณะที่อาร์เรย์ $ _POST จะมีอยู่ใน PHP4 / PHP5 เสมอ (และหากไม่มี ' ไม่มีอยู่คุณมีปัญหาที่ใหญ่กว่า (- :)


-17

ทั้งสองอย่างทำงานเหมือนกัน แต่$_POSTควรใช้เพราะสะอาดกว่า คุณสามารถเพิ่มisset()เพื่อตรวจสอบว่ามีอยู่


6
$_POSTจะมีอยู่เสมอแม้ว่าอาจจะว่างเปล่า (ซึ่งถูกส่งไปยังบูลีนfalse) แล้วคำว่า "สะอาดกว่า" หมายถึงอะไร?
TRiG

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