namikiri
@namikiri

Cookies в PHP, как?

Возникла проблема, избитая до дыр: не сохраняются cookies. Но она очень странно себя ведёт.


В общем, первый вариант движка сохранял некие данные в файл на сервере, а юзеру отдавал куки. При этом HTML код был до кода на PHP, и задание кукисов удавалось:
<!DOCTYPE html>
<html>
...
<?php


...

// тут какой-то код

setcookie ("authentic", $authentic);



НО: когда я начал переводить свой «движок» на базы данных MySQL, кукисы перестали задаваться, а вместо них появляется вот это вот предупреждение:
PHP Warning: Cannot modify header information - headers already sent by (output started at /путь к файлу:12) in /путь к тому же файлу on line 275



В строке 12 — начало кода (после HTML, там <?php), а в строке 275 — функция setcookie().


Сам код немного изменился, туда добавилась строчка:
<!DOCTYPE html>
<html>
...

<?php
include("./database.php"); // файл ЧИСТ, там НЕТ вывода вообще, только функции для базы данных, в начале BOM тоже НЕТ


...

setcookie ("authentic");

?>



В чём может быть проблема? Уже всю голову себе разбил о стол и ноут, но никак не могу понять, почему при сохранении в файлах всё прокатывало, а с БД такое не идёт.

Гуглил, проследовал всем советам (BOM нет, файл database.php вообще вывода не содержит).

Прошу, хабровчане, помогите!
  • Вопрос задан
  • 6113 просмотров
Решения вопроса 1
@Hint
Из-за буферизации данные не отправлялись до установки cookie. А теперь данных больше, PHP отправляет их до момента выполнения setcookie.

Кто не верит, что такое возможно, выполните скрипт:
Hello world!

<?php setcookie('test', 'test') ?>

У меня этот код работает, cookie устанавливаются (никаких notice).

Теперь такой вариант:
<?php for ($i = 1; $i < 500; ++$i) echo 'Hello world!
'; ?>

<?php setcookie('test', 'test') ?>


Получаю:
Warning: Cannot modify header information - headers already sent


В любом случае, все заголовки должны быть отправлены до данных, и надеяться на стандартный буфер нельзя. Используйте ob_start.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@egorinsk
1) Изучите основы протокола HTTP, в частности что такое response headers
2) Почитайте про output buffering

По идее, вообще ни первая, ни вторая схемы не должны работать. Куки должны ставиться до начала любого вывода. MySQL тут не причем.
Ответ написан
@krasulya
Так вы подключаете database.php уже после того, как начинается разметка. Она и выводится перед установкой кукиc.
Ответ написан
Aco
@Aco
Заклинатель кода
Куки передаются в заголовках, это стандарт HTTP. Если вы начали вывод, то заголовки уже ушли, а повторно их(заголовки) не послать. Вот ваша проблема. Начните вывод данных после работы PHP.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы