$ _POST बनाम $ _SERVER ['REQUEST_METHOD'] == 'POST'


130

कुछ लोग मेरे स्निप्लार सबमिशन में से एक को "बकवास" कहते थे क्योंकि मैं if ($_SERVER['REQUEST_METHOD'] == 'POST')इसके बजाय इस्तेमाल करता थाif ($_POST)

अनुरोध विधि की जांच करना मेरे लिए अधिक सही लगता है क्योंकि यही मैं वास्तव में करना चाहता हूं। क्या दोनों के बीच कुछ परिचालन अंतर है या यह सिर्फ एक कोड स्पष्टता मुद्दा है?


214
उस आदमी को बताओ वह बेकार है।
विंकियो व्रसलोविक

12
आपको यहां के ===बजाय उपयोग करना चाहिए । ==0 == 'POST'
dave1010

5
$ _SERVER ["REQUEST_METHOD"] कुछ PHP + Apache2 स्थापनाओं पर HTTP GET अनुरोधों के लिए "POST" हो सकता है। मेरी तरह। और यह है कि मैं यहाँ कैसे आया।
टिबेरिउ-आयनो स्टैन

3
@ Tiberiu-IonuțStan यदि यह सच है (जो मुझे विश्वास नहीं है), यह एक गंभीर रूप से गंभीर बग है। क्या आप एक PHP या अपाचे बग रिपोर्ट के लिए एक लिंक प्रदान कर सकते हैं? प्रजनन करने कि प्रक्रिया? वैसे भी, मैं सिर्फ तुम पर विश्वास नहीं करता।
मार्क अमेरी

1
@ dave1010 $_SERVER['REQUEST_METHOD']कभी संख्या क्यों होगी 0? जहां तक ​​मुझे पता है, यह असंभव है।
मार्क अमेरी

जवाबों:


169

ठीक है, वे वास्तव में एक ही काम नहीं करते हैं।

$_SERVER['REQUEST_METHOD'] इसमें अनुरोध विधि (आश्चर्य) है।

$_POST किसी भी पोस्ट डेटा शामिल हैं।

POST के लिए संभव है कि कोई POST डेटा न हो।

मैं अनुरोध विधि की जांच करता हूं - मैंने वास्तव में $_POSTसरणी का परीक्षण करने के बारे में कभी नहीं सोचा था । मैं आवश्यक पोस्ट फ़ील्ड की जांच करता हूं, हालांकि। तो एक खाली पोस्ट अनुरोध उपयोगकर्ता को बहुत सारे त्रुटि संदेश देगा - जो मुझे समझ में आता है।


सैद्धांतिक रूप से, यह संभव हो सकता है, कि अनुरोध विधि 'पोस्ट' (निचला- या मिश्रित मामला) है। क्या GET और POST पर PHP स्वचालित रूप से इसे साफ करती है?
बोल्डव्यून

एक छोटे परीक्षण के बाद, WinXP पर मेरा PHP 5.2 स्पष्ट रूप से ऐसा नहीं करता है, इसलिए शायद request_method को केवल अपरकेस के लिए पवित्रा किया जाना चाहिए।
बोल्ड्यूविन

3
@Boldewyn नहीं, यह नहीं है, लेकिन अगर ग्राहक आपको 'पोस्ट' या 'पोस्ट' का अनुरोध विधि भेजते हैं, जब वे एक POST अनुरोध करने का इरादा रखते हैं, तो वे युक्ति का उल्लंघन करते हैं, क्योंकि HTTP तरीके केस-संवेदी होते हैं युक्ति और युक्ति के अनुसार केवल POST पद्धति को परिभाषित करता है, उदाहरण के लिए पोस्ट या पोस्ट या pOsT विधि नहीं। मैं यहाँ अपने उत्तर में इसके बारे में अधिक विस्तार से बताता हूं: stackoverflow.com/a/21511879/1709587 । चाहे या नहीं आप अटकलबाजी ग्राहक कोड को संभालने के लिए अपरकेस के लिए विधि का चयन करना चाहते हैं।
मार्क अमेरी

और चूंकि वे एक ही चीज नहीं हैं, इसलिए यह समझ में आता है कि हम उन्हें विभिन्न चीजों के लिए उपयोग कर सकते हैं - टाइप करें और पेलोड का अनुरोध करें। मुझे आश्चर्य है कि यह किसी को भी बर्फ़ बनाता है: मैं $ _SERVER ['REQUEST_METHOD'] का उपयोग यह पता लगाने के लिए करता हूं कि हम क्या कर रहे हैं, और मैं $ $ का उपयोग करता हूं पेलोड तक पहुंचने के लिए, जो अवधारणाओं के बीच थोड़ी स्वतंत्रता रखता है (दूसरे शब्दों में, मैं शायद ही कभी $ _POST या $ _GET का उपयोग करें)।
अनुदान

@grantwparks जो बुरा सौदा लगता है। $ _GET और $ _POST का डेटा कहां ले जाया गया था, इसके बारे में अधिक है। विचार करें: "कर्ल -k -L -X POST -H 'सामग्री-प्रकार: पाठ / सीएसवी' --डेटा-बाइनरी \ @ नमूना.एससीवी 'परीक्षण-स्क्रिप्ट.php? परीक्षण = 12345'" मूल्य "परीक्षण" पॉप्युलेट करता है $ _GET भले ही विधि POST हो।
20 अगस्त को 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 सुपरग्लोबल।


3

वे दोनों सही हैं। व्यक्तिगत रूप से मैं आपकी दृष्टिकोण को इसकी वाचालता के लिए बेहतर मानता हूं लेकिन यह वास्तव में व्यक्तिगत पसंद के लिए नीचे है।

ऑफ हैंड, ($ _ POST) चलने पर कोई त्रुटि नहीं होगी - यदि POST हेडर के साथ अनुरोध भेजा गया था, तो $ _POST सरणी मौजूद नहीं है। एक खाली सरणी को बूलियन जांच में गलत माना जाता है।


शायद 2009 में, लेकिन एक खाली सरणी! = झूठी
clockw0rk

1
आपको "कास्ट" शब्द याद आ गया होगा। "अगर" संरचना के अंदर का विवरण एक बूलियन पर डाला जाता है, और एक खाली सरणी इस प्रकार बूलियन झूठी के लिए डाली जाती है। यहां तक ​​कि 2020 में
एरान गैल्परिन

योग्य, उर सही। +1
दक्षिणावर्त

3

आप अधिकांश ब्राउज़रों में एंटर की (यानी बिना सबमिट बटन पर क्लिक किए) फॉर्म जमा कर सकते हैं, लेकिन यह जरूरी नहीं है कि वेरिएबल के रूप में सबमिट करें - इसलिए एक खाली फॉर्म जमा करना संभव है, अर्थात $_POSTखाली होगा लेकिन फॉर्म अभी भी जारी रहेगा ने php पेज पर http पोस्ट रिक्वेस्ट जेनरेट की है। इस मामले 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 के माध्यम से बुलाया जाता है। हालाँकि, जब आप विधि = "पोस्ट" के साथ एक फॉर्म सबमिट करते हैं तो एक्शन पेज को POST के साथ बुलाया जाता है।


-3

यह वास्तव में एक का 6 है, अन्य स्थिति का आधा दर्जन।

आपके दृष्टिकोण के खिलाफ एकमात्र संभव तर्क $ _SERVER ['REQUEST_METHOD'] == 'POST' कुछ वेब-सर्वरों / कॉन्फ़िगरेशन पर आबाद नहीं हो सकता है, जबकि PHP_4 में PHP_STST सरणी हमेशा मौजूद रहेगी (और अगर यह नहीं है) टी मौजूद है, आपको बड़ी समस्याएं हैं - (:)


-17

वे दोनों एक ही तरह से काम करते हैं, लेकिन $_POSTइसका उपयोग क्लीनर के रूप में किया जाना चाहिए। आप इसे जोड़कर isset()देख सकते हैं कि यह मौजूद है।


6
$_POSTहमेशा मौजूद रहेगा, हालांकि यह खाली हो सकता है (जो बूलियन के लिए डाला जाता है false)। और "क्लीनर" से आपका क्या मतलब है?
TRIG

2
शायद उनका मतलब था कि कीबोर्ड पर टाइप करने के लिए कम पात्रों की आवश्यकता होती है = P
जूलियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.