PHP में "हेडर पहले ही भेजे गए" त्रुटि को कैसे ठीक करें




header (9)

मेरी स्क्रिप्ट चलाते समय, मुझे इस तरह की कई त्रुटियां मिल रही हैं:

चेतावनी: हेडर जानकारी संशोधित नहीं कर सकता है - लाइन 23 पर /some/file.php में पहले से भेजे गए हेडर ( /ome /file.php:12 पर आउटपुट )

त्रुटि संदेशों में उल्लिखित रेखाओं में header() और setcookie() कॉल शामिल हैं।

इसका क्या कारण रह सकता है? और इसे कैसे ठीक करें?


मुझे यह त्रुटि कई बार पहले मिली। और मुझे यकीन है कि सभी PHP प्रोग्रामर को कम से कम एक बार यह त्रुटि मिली है। इस त्रुटि को हल करने के लिए आप अपने समस्या स्तर के अनुसार उपयोग समाधान हल कर सकते हैं:

संभावित समाधान 1:

हो सकता है कि आपने पहले या बाद में (फ़ाइल के अंत में?>) यानी रिक्त स्थान छोड़े हों

THERE SHOULD BE NO BLANK SPACES HERE
<?php  

   echo "your code here";

?>
DO CHECK FOR BLANK SPACES HERE AS WELL; THIS LINE (blank line) SHOULD NOT EXIST.

अधिकांश समय यह आपकी समस्या का समाधान करना चाहिए। आपको require फाइल से जुड़े सभी फाइलों की जांच करें।

नोट: कभी-कभी संपादक (आईडीई) जैसे जीएडिट (एक डिफ़ॉल्ट लिनक्स संपादक) फ़ाइल को सहेजने पर एक खाली रेखा जोड़ता है। ऐसा नहीं होना चाहिए। यदि आप लिनक्स का उपयोग कर रहे हैं। पृष्ठ के अंत में आप अंतरिक्ष / रेखाओं को हटाने के बाद VI संपादक का उपयोग कर सकते हैं।

यदि यह आपका मामला नहीं है, तो आप नीचे दिए गए आउटपुट बफरिंग के लिए ob_start उपयोग कर सकते हैं:

संभावित समाधान 2:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

उपयोग

ob_start ();

आपकी लिपि के शीर्ष पर, और

ob_end_flush ();

आपकी लिपि के नीचे। इस पृष्ठ को बफर करने के बाद आउटपुट बफरिंग हो जाएगी और आपके हेडर बनाए जाएंगे।

सामान्य समस्यायें:

====================

( source से कॉपी किया गया: source )

1) header(.......); से पहले कोई आउटपुट (यानी echo.. या एचटीएमएल कोड) नहीं होना चाहिए header(.......); आदेश।

2) <?php और बाद में ?> टैग से पहले किसी भी सफेद-स्थान (या नई लाइन ) को हटा दें।

3) गोल्डन नियम! - जांचें कि क्या PHP फ़ाइल (और, यदि आप अन्य फाइलें भी include करते हैं) में बीओएम एन्कोडिंग के बिना यूटीएफ 8 है (और केवल यूटीएफ -8 नहीं)। यह कई मामलों में समस्या है (क्योंकि यूटीएफ 8 एन्कोडेड फ़ाइल में PHP फ़ाइल की शुरुआत में कुछ विशेष चरित्र है, जो आपका टेक्स्ट-संपादक नहीं दिखाता है) !!!!!!!!!!!

4) header(...); बाद header(...); आपको exit; उपयोग करना चाहिए exit;

5) हमेशा 301 या 302 संदर्भ का उपयोग करें:

header("location: http://example.com",  true,  301 );  exit;

6) त्रुटि रिपोर्टिंग चालू करें। और त्रुटि बताओ।

7) यदि उपरोक्त में से कोई भी मदद नहीं करता है, तो JAVSCRIPT पुनर्निर्देशन (हालांकि, दृढ़ता से अनुशंसित विधि) का उपयोग करें, कस्टम मामलों में अंतिम मौका हो सकता है ...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

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

हम इसे तुरंत ठीक करने के लिए आमतौर पर क्या करते हैं, फ़ाइल का नाम बदलते हैं और LINUX सिस्टम पर नामित एक के बजाय एक नई फ़ाइल बनाते हैं, और उसके बाद सामग्री को प्रतिलिपि बनाएँ। कई बार इस मुद्दे को हल करते हैं क्योंकि WIN में बनाए गए कुछ फ़ाइलों को एक बार होस्टिंग में स्थानांतरित करने के कारण इस समस्या का कारण बनता है।

यह फिक्स एफ़टीपी द्वारा प्रबंधित साइटों के लिए एक आसान फिक्स है और कभी-कभी हमारे नए टीम के सदस्यों को कुछ समय बचा सकता है।


तुम करो

printf ("Hi %s,</br />", $name);

कुकीज़ सेट करने से पहले, जिसकी अनुमति नहीं है। आप हेडर से पहले कोई आउटपुट नहीं भेज सकते हैं, यहां तक ​​कि रिक्त रेखा भी नहीं।


नीचे की रेखा के बजाय

//header("Location:".ADMIN_URL."/index.php");

लिखना

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

या

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

यह निश्चित रूप से आपकी समस्या का समाधान करेगा। मुझे एक ही समस्या का सामना करना पड़ा लेकिन मैंने उपरोक्त तरीके से शीर्षलेख लेखन के माध्यम से हल किया।


HTTP हेडर ( setcookie() या header() ) भेजने से पहले कुछ भी भेजा जाने पर यह त्रुटि संदेश ट्रिगर हो जाता है। HTTP हेडर से पहले कुछ आउटपुट करने के सामान्य कारण हैं:

  • दुर्घटनाग्रस्त सफेद जगह, अक्सर फाइलों की शुरुआत या अंत में, इस तरह:

     <?php
    // Note the space before "<?php"
    ?>
    

इससे बचने के लिए, बस बंद करना छोड़ दें ?> - वैसे भी इसकी आवश्यकता नहीं है।

  • एक PHP फ़ाइल की शुरुआत में बाइट ऑर्डर अंक । यह पता लगाने के लिए कि क्या यह मामला है, एक हेक्स संपादक के साथ अपनी PHP फाइलों की जांच करें। उन्हें बाइट्स 3F 3C शुरू करना चाहिए। आप फाइलों की शुरुआत से बीओएम EF BB BF को सुरक्षित रूप से हटा सकते हैं।
  • स्पष्ट आउटपुट, जैसे echo , printf , readfile , passthru , कोड से पहले कॉल करने के लिए कॉल <? आदि।
  • Php द्वारा outputted एक चेतावनी, अगर display_errors php.ini प्रॉपर्टी सेट है। प्रोग्रामर गलती पर दुर्घटनाग्रस्त होने के बजाय, php चुपचाप त्रुटि को ठीक करता है और चेतावनी देता है। जबकि आप display_errors या error_reporting कॉन्फ़िगरेशन को संशोधित कर सकते हैं, आपको समस्या को ठीक करना चाहिए।
    सामान्य कारण किसी सरणी के अनिर्धारित तत्वों (जैसे $_POST['input'] isset() लिए empty या जारी करने के बिना इनपुट का सेट किए गए हैं, या स्ट्रिंग अक्षर के बजाय एक अपरिभाषित स्थिरांक का उपयोग कर रहे हैं (जैसे $_POST[input] , गायब उद्धरण नोट करें)।

आउटपुट बफरिंग को चालू करने से समस्या दूर होनी चाहिए; ob_start(); कॉल के बाद सभी आउटपुट स्मृति में buffered है जब तक आप बफर जारी नहीं करते हैं, उदाहरण के लिए ob_end_flush

हालांकि, आउटपुट बफरिंग मुद्दों से बचाता है, आपको वास्तव में यह निर्धारित करना चाहिए कि आपका हेडर HTTP हेडर से पहले HTTP निकाय क्यों आउटपुट करता है। यह एक फोन कॉल लेने और कॉलर को बताने से पहले अपने दिन और मौसम पर चर्चा करने जैसा होगा कि उसे गलत नंबर मिला है।


आम तौर पर यह त्रुटि तब उत्पन्न होती है जब हम गूंजने या प्रिंट करने के बाद शीर्षलेख भेजते हैं। यदि यह त्रुटि किसी विशिष्ट पृष्ठ पर उत्पन्न होती है तो सुनिश्चित करें कि पृष्ठ start_session() कॉल करने से पहले कुछ भी गूंज नहीं रहा है।

अप्रत्याशित त्रुटि का उदाहरण:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

एक और उदाहरण:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

निष्कर्ष: session_start() या header() फ़ंक्शन को कॉल करने से पहले किसी भी वर्ण को आउटपुट न करें, यहां तक ​​कि एक सफेद-स्थान या नई-रेखा भी नहीं


एक साधारण युक्ति: आपकी स्क्रिप्ट में एक साधारण स्थान (या अदृश्य विशेष चार), पहले <?php टैग से ठीक पहले, इसका कारण बन सकता है! विशेष रूप से जब आप किसी टीम में काम कर रहे होते हैं और कोई "कमजोर" आईडीई का उपयोग कर रहा है या अजीब पाठ संपादकों के साथ फाइलों में घिरा हुआ है।

मैंने इन चीजों को देखा है;)


एक और बुरी आदत इस समस्या का आह्वान कर सकती है जिसे अभी तक नहीं बताया गया है।

यह कोड स्निपेट देखें:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

चीजें ठीक हैं, है ना?

क्या होगा यदि "a_important_file.php" यह है:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

यह काम नहीं करेगा? क्यों? क्योंकि पहले से ही एक नई लाइन उत्पन्न हुई है।

अब, हालांकि यह एक सामान्य परिदृश्य नहीं है, यदि आप एक एमवीसी फ्रेमवर्क का उपयोग कर रहे हैं जो आपके नियंत्रक को चीजों को सौंपने से पहले बहुत सारी फाइल लोड करता है? यह एक असामान्य परिदृश्य नहीं है। इसके लिए तैयार रहें।

पीएसआर -2 2.2 से:

  • सभी PHP फ़ाइलों को Unix LF (linefeed) line ending उपयोग करना होगा।
  • सभी PHP फ़ाइलों को single blank line साथ समाप्त होना चाहिए।
  • समापन?> टैग only php फाइलों वाली फाइलों से omitted जाना चाहिए

मेरा विश्वास करो, इन मानकों के बाद आपको अपने जीवन से बहुत सारे घंटे बचा सकते हैं :)





header