Setcookie, Невозможно изменить информацию заголовка - уже отправленные заголовки
Я новичок в 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, 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
Я включил свой cookie IE 6 без сомнения.
Что-то не так в моей процедуре выше? Спасибо.
Используются WinXP OS и XAMPP 1.7.3.
Ответы
Ответ 1
Предупреждение ясно.
Предупреждение: не удается изменить информацию заголовка - уже отправленные заголовки (вывод запущен в C:\xampp\htdocs\test\index.php: 9) в C:\xampp\htdocs\test\index.php в строке 12
Cookies отправляются в заголовке ответа HTTP. Поскольку содержимое HTML уже запущено, вы не можете вернуться в заголовок и добавить файл cookie.
Из http://php.net/setcookie:
setcookie() определяет cookie для отправки вместе с остальными HTTP-заголовками. Как и другие заголовки, файлы cookie должны быть отправлены до на любой вывод вашего script (это ограничение протокола). Это требует, чтобы вы отправляли вызовы этой функции до любого вывода, включая теги <html>
и <head>
, а также любые пробелы.
Переместите этот оператор setcookie
до появления любого HTML:
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
....
Ответ 2
Cookies отправляются в заголовках передачи HTTP-страницы. Как только вы дадите некоторый результат, вы больше не сможете их модифицировать.
Проблема в вашем случае заключается в том, что вы выгружаете некоторый 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>
Кроме того, вы можете буферизовать свой вывод, чтобы ничего не записывалось до тех пор, пока вы явно не сообщите ему
<?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.
Ответ 3
Или просто поверните
output_buffering = On
в php.ini
Обратитесь http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent для полного решения
Ответ 4
Вы отправляете 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>
Ответ 5
Здесь что-то стоит посмотреть...
У меня была та же проблема, и я обнаружил, что после закрытия ?>
в конце файла, который я включал в правильное место, перед созданием какого-либо результата был пробел. Это сводило меня с ума!