2010-04-17 3 views
28

Я новичок в PHP, я практиковал PHP setcookie() только сейчас и не смог.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, IE предупреждения, как это.

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 

Я включил свой IE 6 cookie без сомнения.

Есть ли что-то не так на моей процедуре выше? Спасибо.

WinXP OS и XAMPP 1.7.3 б/у.

ответ

45

Предупреждение ясно.

Предупреждение: Не удается изменить информацию в заголовке - заголовки уже прислал (выход начался в C: \ XAMPP \ HTDOCS \ Test \ index.php: 9) в C: \ XAMPP \ HTDOCS \ тест \ index.php на строка 12

Куки-файлы отправляются в заголовке ответа HTTP. Поскольку содержимое HTML уже запущено, вы не можете вернуться в заголовок и добавить файл cookie.

От http://php.net/setcookie:

SetCookie() определяет куки для отправки вместе с остальной частью заголовков HTTP. Как и другие заголовки, файлы cookie должны быть отправлены до любой вывод из вашего скрипта (это ограничение протокола). Это требует, чтобы вы делали вызовы этой функции перед любым выходом, включая теги <html> и <head>, а также любые пробелы.

Move, который появляется setcookie заявления перед любой HTML:

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

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

@KennyTM, еще один вопрос. Я тестировал код, он работает хорошо. Но когда я создал еще один ** viewMore.php **, который использует тот же код, что и ** view.php **. Но viewTwo.php находится в ** http: //localhost/testMore/viewMore.php**. (В другом каталоге) Я не смог «эхо» сохранить значение cookie с viewMore.php, в противном случае view.php все еще работает хорошо. Не могли бы вы рассказать мне, почему? –

+0

@Nano: установите параметр '$ path' в'/'. См. Документ. – kennytm

7

Вы отправляете HTML-код перед установкой файла cookie. Файл cookie должен быть установлен перед отправкой любого вывода, поскольку он отправляется с заголовками ответов. Сделайте это:

<?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

Cookies посылается в заголовках передачи страницы HTTP. Как только вы дадите некоторый результат, вы больше не сможете их модифицировать.

Проблема в вашем случае заключается в том, что вы выгружаете некоторый HTML-документ, прежде чем пытаться установить cookie.

Существует несколько способов его решения; один из которых устанавливает куки до вывода чего-либо на странице, как так

<?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> 

В качестве альтернативы, вы можете буферные ваш вывод так, что ничего не будет записано, пока вы явно не скажете ей

<?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

См http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent для полного решения

+0

Это единственная причина и решение! Спасибо! ни одно из вышеперечисленных не работало для меня! иногда где-то может быть полезно! но что ты сказал! это просто здорово! ~ – Hossein

+0

иногда мне нужно установить cookie во время цикла внутри тела .. так что это решит мою проблему тоже .. – rusly

1

Вот что-то стоит высматривать ...

У меня была та же проблема, и обнаружил, что после закрытия ?> появился пробел в конце файла, который я включил в правильное место перед любым из был создан. Это сводило меня с ума!

Смежные вопросы