PHP не может установить setcookie - PullRequest
1 голос
/ 12 июня 2009

Я - девственница PHP (первый день), поэтому, пожалуйста, печатайте медленно.

У меня есть несколько изображений, bg_001.jpg, bg_002.jpg и т. Д., Которые я хочу поворачивать при каждом обновлении страницы. Я попробовал это:

if (isset($_COOKIE["bg1"])) {
  $img_no = $_COOKIE["bg1"] + 1;
} else {
  $img_no = 1;
}
$filename = 'bg_' . sprintf("%03d", $img_no) . '.jpg';
if (!file_exists("/img/" . $filename)) {
  $img_no = 1;
  $filename = 'bg_' . sprintf("%03d", $img_no) . '.jpg';
}
setcookie("bg1", $img_no, time() + 86400);
print '<img src="img/' . $filename . '" alt="" height="175" width="800"> '; 

Вместо печенья я получаю

Warning: Cannot modify header information - headers already sent by (output 
started at /home2/.../about.php:7) in /home2/.../about.php on line 31

Строка 31 - строка с setcookie . Я уже нашел указатели на то, что у PHP возникли проблемы с спецификацией Unicode, но я понятия не имею, как ее исправить (если это проблема здесь, в первую очередь). Итак, чтобы сделать его официальным (и избежать ярлыка «не реальный вопрос»), как мне это исправить? : -)

Конструктивная критика моего кода тоже приветствуется.

Эпилог:
Похоже на обычную ошибку новичка: несколько ответов на одно и то же решение в течение пятнадцати минут. Спасибо, парень / Galz.

Итак, я переместил все, кроме print в начало файла, и действительно: исправлено.

Ответы [ 5 ]

8 голосов
/ 12 июня 2009

куки могут быть отправлены, только если информация не была отправлена ​​ранее. Это означает, что первое, что должно быть в вашем PHP-файле, должно быть <?php, и ничто не может получить до этой части (даже страшная спецификация UTF-8), потому что если что-то находится до первого <?php (как <html> ), затем php отправит эти данные в браузер, и после отправки данных вы не сможете использовать setcookie. Сделайте так, чтобы ваш код выглядел примерно так:

<?php
 (...)
 setcookie(...)
 (...)
?>
<HTML>
(...)
</HTML>

И еще раз проверьте, чтобы редакторы, такие как блокнот, не помещали сигнатуры спецификации UTF-8 перед первым <?php в файле.

3 голосов
/ 12 июня 2009

С HTTP ваш заголовок (информация о запросе / ответе) и Контент (фактический двоичный контент textor) задаются отдельно, а Заголовок должен предшествовать Контенту.

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

Переместите весь свой код, который ссылается на ваш cookie, перед открытием HTML-элемента на вашей странице, и все будет в порядке.

1 голос
/ 12 июня 2009

Возможно, вам будет проще использовать сеансы, а не манипулировать самими файлами cookie. session_start() по-прежнему должен предшествовать любому другому контенту, но это облегчает хранение структур данных и т. д.

взгляните на http://php.net/session_start

0 голосов
/ 12 июня 2009

Полученное сообщение об ошибке / предупреждении говорит само за себя: заголовки уже отправлены

Это означает, что вывод уже был отправлен в браузер до вызова метода setcookie ().

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

Итак, проверьте строку 7 на about.php. У вас должен быть html-код, или у вас может быть вызов на печать или эхо.

0 голосов
/ 12 июня 2009

Чтобы обойти это без существенных изменений кода, используйте Выходная буферизация , например, -

<?php
  ob_start();
  // ... my code here
?>
<html></html>
<?php
  // ... end of the file
  ob_end_flush();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...