2009-08-10 19 views
5

मैं हेडर आउटपुट त्रुटियों के बिना नीचे दिए गए इस सेटअप के साथ PHP में रीडायरेक्ट कैसे कर सकता हूं, मैं समझता हूं कि हेडर सेट होने से पहले ब्राउजर को कुछ भी मुद्रित नहीं किया जा सकता है, मैं एक समाधान की तलाश में हूं, न कि यह क्यों होता है इसका स्पष्टीकरण।मैं हेडर त्रुटियों के बिना PHP में कैसे रीडायरेक्ट कर सकता हूं?

<?PHP 
// include header 
include ('header.inc.php'); 



// In my body section file if this is a page that requires a user be logged in then 
// I run a function validlogin($url-of-page-we-are-on); inside of that file 
//the function is below, it outputs a redirect to login page if not logged in 

// include body of page we want 
include ('SOME-FILE-HERE.php'); 



// include footer 
include ('footer.inc.php'); 



// here is the function that is in the body pages, it is only called on a page that we require a logged in user so there are hundreds of pages that do have this and a bunch that don't, it's on a page to page basis 
function validlogin($url) { 
    if ($_SESSION['auto_id'] == '') { 
     $msg = 'Please login'; 
     $_SESSION['sess_login_msg'] = $msg; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     header("Location: /"); 
     exit(); 
    } 
} 
?> 

मैं उपयोगकर्ता php के हेडर समारोह चाहते हैं और नहीं एक मेटा या Javascript रीडायरेक्ट

इसके अलावा उन पृष्ठों को लॉग इन या नहीं की आवश्यकता होती है की एक सूची के लिए एक विकल्प यहाँ maintainning यदि संभव हो तो

उत्तर

2

तुम सिर्फ यह कर सकता नहीं :

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
?> 

<h1>Page heading</h1> 
...page content etc... 

<?php 
include ('footer.inc.php'); 
?> 
+0

जो मैंने किया है, मेरे प्रश्न – JasonDavis

+0

माफ करना II को एक ही मुद्दे के बारे में एक और सवाल था, मुझे नहीं पता था कि मैं इस पर था, वैसे भी जिस तरह से मैंने इसे जल्द से जल्द समाप्त कर दिया और यह बहुत अच्छी तरह से काम किया – JasonDavis

10

ob_start उपयोग नहीं कर रहा है() पहली पंक्ति में भी शामिल हैं। तो आप किसी भी समय हेडर सेट कर सकते हैं।

+0

ob_start() इस समस्या लेकिन मैं इसे का उपयोग कर नफरत का समाधान करता है, मुझे लगता है कि मैं समझता हूँ कि यह कैसे बेहतर काम करता है की जरूरत है, ऐसा करना आवश्यक हो पूरे पृष्ठ के बजाय स्मृति को बचाया जा सिर्फ प्रदर्शित आईटीसी orrect? – JasonDavis

+0

सीधे नहीं। php हर समय आउटपुटबफर का उपयोग करता है। लेकिन यह diffrent काम करता है। सामान्य बफर किसी भी समय ब्राउज़र पर फ्लश किया जा सकता है। आउटपुटबफरिंग का उपयोग केवल एक नकारात्मक है, आप फ्लश() का उपयोग नहीं कर सकते हैं। – Rufinus

0

जब तक आपके पास हेडर() फ़ंक्शन से पहले कोई स्क्रिप्ट आउटपुट नहीं है, तो आपको ठीक होना चाहिए। जांचें कि कोई गूंज या सफेद जगह नहीं है। शुरुआत में ob_start() डालने से भी मदद मिल सकती है। कभी-कभी अदृश्य व्हाइटस्पेस होता है - आपके दस्तावेज़ के प्रारूप को एएनएसआई या यूनिकोड में बदलने से मदद मिल सकती है!

एक नोट के रूप में (हालांकि मुझे लगता है कि आप पहले ही जानते हैं) हेडर स्क्रिप्ट को समाप्त नहीं करता है इसलिए बाहर निकलने() (जो आपके पास है) एक निश्चित आवश्यकता है।

+0

वहाँ आउटपुट है, मेरे उदाहरण में मेरी पूरी हेडर फ़ाइल आउटपुट है इससे पहले कि मुझे पता चले कि मैं उस पृष्ठ पर हूं जिसमें लॉग इन होना चाहिए या नहीं! – JasonDavis

+0

निश्चित रूप से हेडर शामिल होने से पहले वैधlogin() फ़ंक्शन को कॉल किया जाना चाहिए? – Meep3D

+0

जितना संभव हो उतना संभव नहीं है, सभी पृष्ठों को लॉगिन की आवश्यकता नहीं है और पृष्ठों को गतिशील रूप से – JasonDavis

0

क्या footer.inc.php और SOME-FILE-HERE.php तुरंत प्रतिक्रिया स्ट्रीम को लिखते हैं? क्योंकि यदि ऐसा है, तो यह काम नहीं करेगा क्योंकि आप हेडर भेजे जाने से पहले कुछ पहले ही लिख चुके होंगे।

+0

बनाया गया है, अब आप प्रश्न =) – JasonDavis

+0

आह, अच्छी तरह से समझते हैं, यह अधिक चुनौतीपूर्ण हो जाता है :) कोई फ़ंक्शन है, और मैं नहीं, मेरे जीवन के लिए यह याद है, जो प्रोसेसर को तब तक प्रतिक्रिया को कैश करने के लिए मजबूर करता है जब तक कि आप इसे सब कुछ भेजने के लिए आदेश नहीं देते हैं, मैं इसे आपके लिए देखने की कोशिश करूंगा क्योंकि इससे आपकी समस्या हल हो सकती है ... –

+0

जैकोवाविस, गम्बो का उत्तर सही है हालांकि सुनिश्चित करें कि आप buffered प्रतिक्रिया स्ट्रीम भेजने के लिए स्क्रिप्ट के अंत में ob_end_flush() को कॉल करें। असल में, ob_start(); // आपके सभी कोड सहित ob_end_fush(); –

0

आपको आउटपुट बफर करने की आवश्यकता है ताकि HTTP शीर्षलेख पहले आउटपुट पर नहीं भेजा जा सके। आप या तो ouput_buffering सक्षम करके या ob_start पर कॉल करके स्पष्ट रूप से किसी भी आउटपुट को बफर कर सकते हैं। लेकिन उत्तरार्द्ध को पहले आउटपुट से पहले बुलाया जाना चाहिए, इसलिए आदर्श रूप से स्क्रिप्ट की पहली पंक्ति में जिसे शुरुआत में बुलाया जाता है।

0

जैसा कि पहले से ही अन्य लोगों द्वारा उल्लेख किया गया है ob_start() या output_buffer आउटपुट बफर करने के लिए सेट करना। इसके अलावा यह मेरे दृष्टिकोण से है कि कार्यात्मक कोड के बीच में सामग्री आउटपुट करने के लिए एक अच्छा अभ्यास नहीं है लेकिन यह एक और विषय है।

आप Google पर या this Article about Output Buffering in PHP पर अधिक जानकारी प्राप्त कर सकते हैं। कि यदि संभव है तो आप के साथ अंत

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
include ('SOME-FILE-HERE.php'); 
include ('footer.inc.php'); 
?> 

या, "कुछ-फ़ाइल-यहाँ" प्रकार फ़ाइलों में से हर एक में शामिल फ़ाइलों डाल दिया,,:

2

उपयोग { echo '<META HTTP-EQUIV="Refresh" Content="0; URL=process.php">';}

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

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