2011-04-03 12 views
15

मैं एक फॉर्म को प्रमाणित करने के लिए एक स्क्रिप्ट बना रहा हूं और मैं खुद से एक प्रश्न पूछ रहा था। जब मैं एक हेडर का उपयोग करता हूं (नीचे उदाहरण देखें), क्या मुझे इसके बाद बाहर निकलने का उपयोग करना होगा? मेरा मतलब है, हेडर का उपयोग करने का मतलब यह भी है कि यह डिफ़ॉल्ट रूप से बाहर निकल रहा है इसलिए मुझे आदेश से बाहर निकलने की आवश्यकता नहीं है?क्या मुझे हेडर के बाद बाहर निकलने की आवश्यकता है ("स्थान: http: // localhost/...") ;?

// cancel button clicked 
if (isset($_POST['cancel'])) { 
    header("Location: http://localhost/admin/tracks.php"); 
    exit; 
} 

echo '<p>$name</p>' 
+0

मुझे लगता है कि आपको इसकी आवश्यकता नहीं है। जब हेडर भेजा जाता है, तो आपको रीडायरेक्ट किया जाएगा और स्क्रिप्ट निष्पादन को रोक देगा। – EmCo

+3

@EmCo बिल्कुल सही नहीं है। मेरे उत्तर में उदाहरण देखें। – AgentConundrum

+0

संभव डुप्लिकेट [PHP में हेडर ('स्थान ..') के माध्यम से पुनर्निर्देशन के बाद मुझे 'निकास' क्यों कॉल करना है?] (http://stackoverflow.com/questions/2747791/why-i-have-to-call-exit-after-redirection-through-headerlocation-in-php) – kapa

उत्तर

7

मैं header-> स्थान कॉल के बाद exit उपयोग करें, क्योंकि मैं इस तथ्य है कि स्क्रिप्ट पिछले header-> स्थान कॉल नहीं मिलेगा पर बिल्कुल भरोसा करने के लिए सक्षम होना चाहते हैं।

अगर वहाँ एक बग कहीं है और अपनी स्क्रिप्ट header-> स्थान कॉल करने से पहले पैदा उत्पादन शुरू होता है, कॉल विफल हो जाएगा, और स्क्रिप्ट निष्पादन सामान्य रूप से जारी रहेगा (जब तक आप बाहर निकलें कहते हैं)

+0

कोई बुरा विचार नहीं है, यह निश्चित रूप से नहीं जा रहा है कुछ भी चोट पहुंचाने के लिए ... –

+1

असफल कॉल के बारे में अच्छा बिंदु। मैंने उस संभावना को भी नहीं माना था। – AgentConundrum

+0

आपका बग उदाहरण अप्रासंगिक है। स्क्रिप्ट के लिए –

22

आप exit() एक क्योंकि बुलाना चाहिए header() स्वचालित रूप से स्क्रिप्ट को निष्पादित करने से रोक नहीं पाएगा - या यदि ऐसा होता है (मैं ईमानदारी से उस पर 100% नहीं हूं), तो यह निश्चित रूप से स्क्रिप्ट को तुरंत रोक नहीं देता है।

उदाहरण के लिए, इस कोड का प्रयास करें:

<?php 

    header("Location: http://www.google.com"); 
    unlink(__FILE__); 

?> 

इस छोटे स्क्रिप्ट header() का उपयोग करता है गूगल पर रीडायरेक्ट करने, और उसके बाद ही हटा देता है। यदि आप इसे चलाते हैं, तो आप देखेंगे कि आपके द्वारा रीडायरेक्ट किए जाने के बाद, फ़ाइल अभी भी हटा दी गई थी। इसका मतलब यह है कि unlink() कॉल अभी भी निष्पादित किया गया था, भले ही header() कॉल आपको पुनर्निर्देशित करता है।

+0

मुझे एक ही चिंता है और यह निष्पादन जारी रखता है! बाहर निकलने के लिए सर्वश्रेष्ठ; – TimNguyenBSM

0

आउटपुट आमतौर पर नहीं भेजा जाता है (आउटपुट बफरिंग और इसी तरह के आधार पर) यदि आप इसे रीडायरेक्ट करते हैं, लेकिन जैसा कि अनलिंक() उदाहरण द्वारा दिखाया गया है, तो स्क्रिप्ट हेडर() के साथ मर नहीं जाती है।

तो यदि आप रीडायरेक्ट के बाद स्क्रिप्ट को जारी रखने से रोकना चाहते हैं तो बाहर निकलें() या मर() कॉल आवश्यक हैं।

1

हालांकि ध्वनि के ऊपर दिए गए उत्तर, यदि आप अपने कोड पथ से अनिश्चित हैं, तो इससे अप्रत्याशित परिणाम हो सकते हैं। उदाहरण के लिए, यदि आप एक ढांचे का उपयोग कर रहे हैं जो इस तथ्य पर निर्भर करता है कि कोड निष्पादन शुरुआत से अंत तक चलता है, तो आप अनजाने में इसे बाधित कर सकते हैं।

यह एक उपयोगकर्ता के दृष्टिकोण से ठीक हो सकता है के रूप में वे अभी भी पुनः निर्देशित किया जाएगा और कोई भी समझदार होगा, लेकिन निम्नलिखित पर विचार:

आप एक रूपरेखा (ओएस या कस्टम) का उपयोग कर रहे है कि लॉग इन करने की उम्मीद कर रही है रीडायरेक्ट करता है, या अतिरिक्त हेडर सेट करता है (या अन्य वस्तुओं की संख्या)। exit पर कॉल करके, आप उस तर्क को बाधित कर रहे हैं और इसलिए अप्रत्याशित परिणाम मिल सकते हैं।

तो संक्षेप में, हाँ उपर्युक्त विधियां काम करेंगे, केवल यह जानकर सावधानी बरतें कि आप इसे कम सर्किट करने से पहले क्या होने की उम्मीद कर रहे हैं।

-1

हेडर का उपयोग करके करता भी मतलब है कि यह डिफ़ॉल्ट

ऐसा कैसे द्वारा बाहर निकलने की जाती है? यदि आपका हेडर Location: एक नहीं है लेकिन Content-type: या Cache-control या अन्यथा क्या है?

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