Предупреждение ясно.
Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался с C: \ xampp \ htdocs \ test \ index.php: 9) в C: \ xampp \ htdocs \ test \ index.php в строке 12
Файлы cookie отправляются в заголовке ответа HTTP. Поскольку содержимое HTML уже запущено, вы не можете вернуться к заголовку и добавить файл cookie.
setcookie () определяет cookie, отправляемый вместе с остальными заголовками HTTP. Как и другие заголовки, файлы cookie должны быть отправлены до любого вывода из вашего скрипта (это ограничение протокола). Это требует, чтобы вы вызывали эту функцию до любого вывода, включая теги
и
, а также любые пробелы.
Переместите этот оператор setcookie
до появления любого HTML:
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
....
Вы отправляете 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>
Файлы cookie отправляются в заголовках передачи 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 .