@terafemto

Функция php setcookie то работает, что нет?

Совершеннейшая магия творится с функцией php setcookie.

Сразу ДИСКЛЕЙМЕР: я прекрасно знаю два главных подвоха этой функции: задания области видимости куки и установка куки до отправки данных клиенту. Это я все учитываю и много лет проблем с setcookie у меня не возникало.

Но функция вдруг не просто перестала работать. Она стала работать ПО НАСТРОЕНИЮ.

Что я имею в виду? Сначала проблему можно было решить, если задать куку ДО включения стороннего файла php.
То есть если в коде:

include_once('klass/initial.php');
setcookie('test',$num,strtotime("+1 days"),'/');

Вот эти две строки поменять местами, то кука начнет работать.
Казалось бы, значит в файле initial.php содержится какая-то проблема.
Чтобы ее выявить, я начал расставлять строку
setcookie('test',$num,strtotime("+1 days"),'/');
в разных местах внутри этого файла.
И действительно, если поставить команду setcookie в начало файла initial.php, то кука исправно запишется.
Если поставить команду в середину файла - опять все хорошо!
Но даже если поставить команду setcookie в самый конец файла:
setcookie('test',$num,strtotime("+1 days"),'/');
?>
Она все равно сработает! Но стоит ее вытащить из файла и разместить в исходном файле после команды include_once('klass/initial.php'); - то все! Паночка померла! То есть проблема возникает ровно на выходе из включенного файла!
Причем если вместо файла initial.php включить пустой файл initial2.php:

include_once('klass/initial2.php');
setcookie('test',$num,strtotime("+1 days"),'/');
То функция сработает! То есть она не работает именно после чего-то, что находится в файле initial.php.

НО ЭТО НЕ САМОЕ ПОТРЯСАЮЩЕЕ!!!!!

После того, как я выдрал половину волос, я решил проверить: вдруг в файле initial.php содержится какая-то такая штука, которая блокирует функцию setcookie на выходе из файла?

Для этого я включил оба файла. Один спереди сеткуки, другой сзади сеткуки:

include_once('klass/initial2.php');
setcookie('test',$num,strtotime("+1 days"),'/');
include_once('klass/initial.php');

И начал постепенно перетаскивать куски когда из initial.php в initial2.php. Мой расчет заключался в том, что когда я перетащу проблемный кусок кода в initial2.php, который находится перед сеткукой, то сеткука перестанет работать.
И вот, значит, перетаскиваю я, перетаскиваю. А сеткука продолжает работать. Ииии... я перетащил все!!!! Все!!!
То есть я перетащил полностью все содержимое initial.php в initial2.php, а кука продолжала работать! Схрена ли?

Но и это не самое потрясающее.
Потом я вернул все как было. То есть я вернул исходный код:
include_once('klass/initial.php');
setcookie('test',$num,strtotime("+1 days"),'/');
А в файл initial.php вернул все, что было до экспериментов.
Иии... кука работает! То я вернул все как было вплоть до последнего символа. И оно работает.

Как? Как это возможно? Я уже начинаю сходить с ума....
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 4
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Варианта 2: Пробел/перенос строки после ?>, или файл записанный с BOM. Первое лечится удалением лишних символов, второе через редактор кода - файл-кодировка-утф без бом.
Ответ написан
Комментировать
Что выдаст этот код?
<?php
ob_start();
include_once('klass/initial.php');
$out = ob_get_contents();
ob_end_clean();

var_dump($out);
Ответ написан
Комментировать
@terafemto Автор вопроса
Всем большое спасибо за подсказки.

Через несколько часов после этого поста куки заработали во всех файлах сайта.
Даже в тех файлах, в которых я не редактировал ни одного бита! (и вложенных в них)
Ненавижу магию, но пока проблема неактуальна.
Ответ написан
@galliard
Просто перестань писать закрывающие теги ?> и будет тебе счастье.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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