PHP - забавное поведение переменных cookie и переменных сеанса - PullRequest
0 голосов
/ 14 ноября 2010

Я написал небольшой скрипт PHP ниже, чтобы продемонстрировать свой вопрос.Запустите приведенный ниже код следующим образом: http://localhost/test.php?test=10,, затем выполните http://localhost/test.php?test=11,, затем http://localhost/test.php?test=12, и т. Д. Вы увидите, что число, отображаемое на экране, всегда на 1 цифру позади номера URL?!Может быть, потому что я не могу cookie и сразу же читаю тот же cookie?


//If query string has $test, store in session, and cookie for later. 
if($_GET[test]){
  $_SESSION['test'] = $_GET[test];
  setcookie("test", $_GET[test], time()+60*60*24*30*12*10); //10 years
}

//If user comes back later, then get $test from cookie
if (isset($_COOKIE["test"])){
  $_SESSION['test'] = $_COOKIE["test"];
}

echo "session test: " . $_SESSION['test'];

Позже я решил проблему с помощью следующего кода, но решить его недостаточно, я хочу знать, ПОЧЕМУ это произошло!

Это решило это:


if($_GET[cid]){
  setcookie("campaignid", $_GET[cid], time()+60*60*24*30*12*10); //10 years
  $_SESSION['campaignid'] = $_GET[cid];
}elseif (isset($_COOKIE["campaignid"])){
  $_SESSION['campaignid'] = $_COOKIE["campaignid"];
}

Ответы [ 3 ]

4 голосов
/ 14 ноября 2010

Может быть, потому что я не могу куки и сразу же прочитал тот же куки?

Точно. Отправленный вами файл cookie доступен в массиве $ _COOKIE только в следующем запросе, поскольку суперглобальный массив $ _COOKIE заполнен данными, которые поступают в запросе клиента. И по первому запросу ничего.

0 голосов
/ 14 ноября 2010

В своем первом фрагменте вы звоните setcookie().Это отправляет заголовок HTTP в браузер.PHP не обновляет переменную $_COOKIES, когда вы вызываете setcookie ().Переменная $ _COOKIES обновляется при следующем вызове сценария, когда cookie возвращает браузер.

0 голосов
/ 14 ноября 2010
  1. Технически вы не начали сеанс (session_start()) и используете неопределенную константу test, однако PHP достаточно «интеллектуален», чтобы понять, что вы подразумеваете строку "test".
  2. Что именно за вопрос?

    Может быть, потому что я не могу куки и сразу же прочитал тот же куки?

    Да, это правда. Вы только что доказали это.

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