2010-04-17 20 views
28

भेज चुके हैं, मैं PHP के लिए नया हूं, मैंने अभी PHP setcookie() का अभ्यास किया और असफल रहा।सेटकुकी, हेडर जानकारी संशोधित नहीं कर सकता है - हेडर पहले से ही

http://localhost/test/index.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 

    </head> 
    <body> 
    <?php 
    $value = 'something from somewhere'; 

    setcookie("TestCookie", $value); 
    ?> 
    </body> 
</html> 

http://localhost/test/view.php

<?php 
// I plan to view the cookie value via view.php 
echo $_COOKIE["TestCookie"]; 

?> 

लेकिन मैं index.php चलाने के लिए विफल रहा है, आईई इस तरह की चेतावनी।

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\test\index.php:9) in C:\xampp\htdocs\test\index.php on line 12 

मैंने अपनी आईई 6 कुकी को कोई संदेह नहीं बनाया।

क्या ऊपर मेरी प्रक्रिया पर गलत है? धन्यवाद।

विनएक्सपी ओएस और एक्सएएमपीपी 1.7.3 प्रयुक्त।

उत्तर

45

चेतावनी स्पष्ट है।

चेतावनी: हेडर सूचना को संशोधित नहीं कर सकते - हेडर पहले से ही द्वारा भेजे गए (उत्पादन सेल्सियस पर शुरू कर दिया: \ XAMPP \ htdocs \ परीक्षण \ index.php: 9) C: \ XAMPP \ htdocs \ पर परीक्षण \ index.php लाइन 12

कुकीज HTTP प्रतिक्रिया शीर्षलेख में भेजी जाती है। HTML सामग्री पहले से ही शुरू के बाद से, तुम वापस हेडर के पास जाकर कुकी नहीं जोड़ सकते।

http://php.net/setcookie से:

setcookie() एक कुकी को परिभाषित करता है HTTP हेडर के बाकी के साथ भेजे जाने के लिए। अन्य शीर्षकों की तरह, कुकीज़ आपकी स्क्रिप्ट से कोई आउटपुट भेजा जाना चाहिए (यह एक प्रोटोकॉल प्रतिबंध है)। यह जरूरी है कि आप <html> और <head> टैग के साथ-साथ किसी भी खाली स्थान के सहित किसी भी उत्पादन, करने से पहले इस समारोह पर कॉल कर।

ले जाएँ कि किसी भी HTML से पहले setcookie बयान प्रकट होता है:

<?php 
$value = 'something from somewhere'; 

setcookie("TestCookie", $value); 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
.... 
+0

@ केनीटीएम, एक और सवाल। मैंने कोड का परीक्षण किया, यह अच्छी तरह से काम करता है। लेकिन जब मैंने एक और ** viewMore.php ** बनाया जो ** view.php ** के समान कोड का उपयोग कर रहा है। लेकिन ** http: //localhost/testMore/viewMore.php** में स्थित viewTwo.php। (अलग निर्देशिका) मैं viewMore.php के साथ कुकी मान को 'echo' करने में विफल रहा, अन्यथा view.php अभी भी अच्छी तरह से काम करता है। क्या आप कृपया मुझे बता सकते हैं क्यों? –

+0

@ नैनो: '$ पथ' पैरामीटर को'/'पर सेट करें। डॉक्टर देखें। – kennytm

7

आप कुकी सेट करने से पहले कुछ HTML भेज रहे हैं। के रूप में यह प्रतिक्रिया हेडर के साथ भेजा जाता है कुकी, किसी भी उत्पादन भेजने से पहले स्थापित होना चाहिये। ऐसा करें:

<?php 
$value = 'something from somewhere'; 
setcookie("TestCookie", $value); 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 

    </head> 
    <body> 

    </body> 
</html> 
19

कुकीज़ HTTP पेज के संचरण के हेडर में भेजा जाता है। एक बार जब आप कुछ उत्पादन दे, तो आप इन अब और नहीं बदल सकते।

कुकी सेट करने की कोशिश करने से पहले आपके मामले में समस्या HTML दस्तावेज़ में से कुछ को आउटपुट करने में निहित है।

इसे हल करने के कुछ तरीके हैं; जिनमें से एक वैकल्पिक रूप से इतना

<?php 
    $value = 'something from somewhere'; 
    setcookie("TestCookie", $value); 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 

    </head> 
    <body> 

    </body> 
</html> 

की तरह पृष्ठ पर कुछ outputting से पहले कुकी स्थापित कर रही है, ताकि कुछ भी नहीं लिखा जाता है जब तक आप स्पष्ट रूप से अधिक जानकारी के लिए

<?php 
    ob_start(); // Initiate the output buffer 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 

    </head> 
    <body> 
    <?php 
     $value = 'something from somewhere'; 
     setcookie("TestCookie", $value); 
    ?> 
    </body> 
</html> 
<?php 
    ob_end_flush(); // Flush the output from the buffer 
?> 

करने के लिए कह आप अपने उत्पादन बफ़र सकता है इस अंतिम दृष्टिकोण पर जानकारी, ob_start और ob_end_flush फ़ंक्शंस पर एक नज़र डालें।

यह भी setcookie पढ़ने के लिए उपयोगी हो सकता है।

+0

आपने मेरा दिन बचाया :-) आपको धन्यवाद – Thamaraiselvam

8

या बस

output_buffering = On 

अपने php.ini

में एक पूर्ण समाधान

+0

यह एकमात्र कारण और समाधान है! धन्यवाद! उपरोक्त में से कोई भी मेरे लिए काम नहीं किया! कभी-कभी कहीं उपयोगी हो सकता है! लेकिन आपने क्या कहा! बस महान है! ~ – Hossein

+0

कभी-कभी मुझे शरीर के अंदर लूप के दौरान सेट कुकी की आवश्यकता होती है .. इसलिए यह मेरी समस्या भी हल करता है .. – rusly

1

यहाँ के लिए संदर्भ लें http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent बारी मैं एक ही समस्या थी के लिए ...

बाहर देख लायक कुछ और एक फ़ाइल के अंत में बंद होने पर ?> बंद होने के बाद एक स्पेस था, मैं किसी भी बाहर से पहले सही जगह पर शामिल था रखा जा रहा था। यह मुझे पागल गाड़ी चला रहा था!

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