2009-01-03 15 views
107

कुछ पुरुष मेरे Snipplr प्रस्तुतियाँ "बकवास" में से एक कहा जाता है क्योंकि मैं if ($_SERVER['REQUEST_METHOD'] == 'POST') बजाय if ($_POST)

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

+174

उस लड़के को बताओ कि वह बेकार है। –

+0

@ vinkoVrsalovic विशेष रूप से उनके उत्तर में उल्लेख करते हैं कि वे समान नहीं हैं और ($ POST) एक प्रकार का "हैक" है, जिसमें आपकी जांच अगर कोई सरणी है, जो केवल POST अनुरोध के दौरान मौजूद है, मौजूद है। जीईटी जैसे अन्य मामलों में भी अनुरोध विधि का उपयोग किया जा सकता है। – Hawken

+9

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

उत्तर

140

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

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

$_POST कोई पोस्ट डेटा है।

POST अनुरोध के लिए कोई पोस्ट डेटा संभव नहीं है।

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

+0

सैद्धांतिक रूप से, यह संभव हो सकता है कि अनुरोध विधि 'पोस्ट' (निचला- या यहां तक ​​कि मिश्रित मामला) है। क्या पीएचपी स्वचालित रूप से इसे जीईटी और पोस्ट पर स्वच्छ करता है? – Boldewyn

+0

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

+3

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

-15

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

+3

'$ _POST' हमेशा मौजूद रहेगा, हालांकि यह खाली हो सकता है (जिसे बूलियन 'झूठा' कहा जाता है)। और "क्लीनर" से आपका क्या मतलब है? – TRiG

+1

शायद उसका मतलब है कि क्लीनर की परिभाषा में कुंजीपटल = पी – Julian

+0

लॉल टाइप करने के लिए कम वर्णों की आवश्यकता है। –

1

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

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

31

if ($_SERVER['REQUEST_METHOD'] == 'POST') सही तरीका है, आप बिना किसी पोस्ट डेटा के पोस्ट पोस्ट भेज सकते हैं।

-3

यह वास्तव में एक की स्थिति में से एक दर्जन दर्जन है।

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

13

मैं $_POST जाँच करने के लिए जब तक मैं बड़ा पोस्ट डेटा के साथ एक मुसीबत में मिला है और फ़ाइलों को अपलोड इस्तेमाल किया विन्यास निर्देशों रहे हैं post_max_size और upload_max_filesize -। उनमें से किसी को अगर पार हो गया है, $_POST सरणी आबादी नहीं है।

तो $_SERVER['REQUEST_METHOD'] को जांचने के लिए "सुरक्षित तरीका" है। आपको अभी भीका उपयोग करना हैप्रत्येक $_POST पर परिवर्तनीय हालांकि, और इससे कोई फर्क नहीं पड़ता, चाहे आप चेक करें या $_SERVER['REQUEST_METHOD'] जांचें या नहीं।

3

आप अधिकांश ब्राउज़रों में एंटर कुंजी (यानी सबमिट बटन पर क्लिक किए बिना) मारकर एक फॉर्म सबमिट कर सकते हैं लेकिन यह आवश्यक रूप से एक चर के रूप में सबमिट नहीं भेजता है - इसलिए एक खाली फॉर्म सबमिट करना संभव है यानी $_POST खाली होगा लेकिन फॉर्म अभी भी PHP पृष्ठ पर एक http पोस्ट अनुरोध उत्पन्न करेगा। इस मामले में if ($_SERVER['REQUEST_METHOD'] == 'POST') बेहतर है।

+1

उस स्थिति में, '$ _POST' खाली नहीं होगा: यह खाली मानों वाला एक सरणी होगा। – TRiG

4

आपके आवेदन प्रकार पोस्ट के अनुरोध पर प्रतिक्रिया करने के लिए की जरूरत है, इस का उपयोग करें:

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 दोनों का उपयोग करने जा रहे हैं।

-1

यह जांचता है कि पृष्ठ POST के माध्यम से कहा गया है (जीईटी, हेड इत्यादि के विपरीत)। जब आप मेनू बार में कोई URL टाइप करते हैं, तो पृष्ठ को GET के माध्यम से कॉल किया जाता है। हालांकि, जब आप विधि = "पोस्ट" के साथ एक फॉर्म जमा करते हैं तो कार्रवाई पृष्ठ को POST के साथ बुलाया जाता है।

1
$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"); 
    } 
} 
+2

हालांकि आपका उत्तर सही हो सकता है, यह स्पष्टीकरण के बिना सहायक नहीं है! कृपया [उत्तर] पर एक नज़र डालें! धन्यवाद! – jkalden

संबंधित मुद्दे