Проблемы с PHP-файлами cookie - PullRequest
1 голос
/ 02 августа 2011

Привет :) Это очень странно - я звоню:

setcookie("ApplicationUserRank", "test", mktime (0, 0, 0, 1, 1, time()+60*60*24*30));

И затем, в другом файле, звоню:

echo $_COOKIE["ApplicationUserRank"];

Однако эхопустой!Я не совсем уверен, что я делаю здесь неправильно, кто-нибудь хочет объяснить?:)

РЕДАКТИРОВАТЬ: Следуя совету Ричарда, я запустил следующий код:

echo "COOKIE: " . $_COOKIE["ApplicationUserRank"];

Сразу после установки cookie.Все еще пусто!Происходит что-то серьезно странное.

РЕДАКТИРОВАТЬ в моем РЕДАКТИРОВАНИИ:

Оказывается, повторный запуск кода действительно отображает куки!Я думаю, что $ _COOKIE не загружается из команд setcookie.На самом деле, теперь, когда я думаю об этом, я где-то читал об этом ... В любом случае, казалось бы, ОДИН И ТО ЖЕ веб-файл способен читать эти куки ... Только не любые другие куки.(Это все, конечно, после применения множества исправлений, предложенных ниже)

Ответы [ 4 ]

2 голосов
/ 02 августа 2011

Доверяя ответу Тарека и принимая во внимание то, что говорит rlemon, может оказаться полезным попробовать функции ob_start() и ob_end_flush().Они являются функциями управления выходным буфером.

Например:

<?php
// php starts collecting the buffer rather than just sending it all out.
ob_start();

if(!isset($_COOKIE["ApplicationUserRank"])) {
    // This should throw an error about headers already being sent or the cookie wouldn't be set, yet under these circumstances, this will work perfectly.
    echo "Cookie has been set.";
    setcookie("ApplicationUserRank", "new test", mktime (0, 0, 0, 1, 1, 9001));
}
else {
    echo "Cookie is set.";
}

// now it sends the buffer all at once.
ob_end_flush();
?>

ob_start() и ob_end_flush() также необходимы для реализации современных мод (например, шифрования), если у вас нет серверныхбоковая поддержка для него.Нажмите здесь для дальнейшего чтения.

РЕДАКТИРОВАТЬ:

После прочтения комментария Gumbo и проверки Страница PHP mktime . Учитывая, что 9001 является недопустимым годом для UNIX , mktime() всегда будет возвращать -1, таким образом удаляя cookie .Решение будет следующим:

setcookie("ApplicationUserRank", "new test", time()+60*60*24*30); // This should set the expiration date within 30 days from current time.
2 голосов
/ 02 августа 2011

setcookie () определяет файл cookie, который будет отправлен вместе с остальными заголовками HTTP.Как и другие заголовки, куки должны быть отправлены до любого вывода из вашего скрипта (это ограничение протокола).Для этого необходимо, чтобы вы выполняли вызовы этой функции перед любым выводом, включая теги, а также любые пробелы.

После того, как файлы cookie установлены, к ним можно получить доступ на следующей странице загрузки с помощью $ _COOKIE илиМассивы $ HTTP_COOKIE_VARS.Обратите внимание, суперглобальные переменные, такие как $ _COOKIE, стали доступны в PHP 4.1.0.Значения cookie также существуют в $ _REQUEST.

, вероятно, у вас есть что-то, что выводится в браузер до того, как вы установите cookie.Это единственное, о чем я могу думать.

См. Примеры:

<?php
if(!isset($_COOKIE["ApplicationUserRank"]))
{
    setcookie("ApplicationUserRank", "new test", mktime (0, 0, 0, 1, 1, 9001));
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<?php
if(isset($_COOKIE["ApplicationUserRank"]))
{
echo    $_COOKIE["ApplicationUserRank"];
}
?>
</body>
</html>

пройдет, однако

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
if(!isset($_COOKIE["ApplicationUserRank"]))
{
    setcookie("ApplicationUserRank", "new test", mktime (0, 0, 0, 1, 1, 9001));
}

if(isset($_COOKIE["ApplicationUserRank"]))
{
echo    $_COOKIE["ApplicationUserRank"];
}
?>
</body>
</html>

не удастся

1 голос
/ 02 августа 2011

В Chrome или Safari в веб-инспекторе есть вкладка ресурсов, которая также позволит вам увидеть набор файлов cookie.Убедитесь, что файл cookie действительно существует.

0 голосов
/ 02 августа 2011

Ваш код работает нормально, я проверил его, и файл cookie устанавливается.

Проверьте, не измените ли вы значение этого файла cookie в другом файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...