php set cookie проблема - PullRequest
       1

php set cookie проблема

4 голосов
/ 09 мая 2011

Я устанавливаю куки на localhost со следующим синтаксисом

setcookie("testCookie ", "hello cookie", false, "/", false);

Проблема в том, что я впервые захожу на страницу, где создается cookie, и firebug показывает

Cookie testCookie added.  hello cookie

Но это не читает значение. Если я обновляю страницу, значение читается, и ошибка показывает

Cookie testCookie changed.  hello cookie

Как я могу получить значение cookie, которое будет прочитано при первой загрузке страницы?

Ответы [ 2 ]

10 голосов
/ 09 мая 2011

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

Как работает файл cookie:

  1. Вы делаете запрос
  2. Сервер отправляет заголовок файла cookie обратно клиенту
  3. Страница загружается - Cookie НЕ виден PHP на этой странице load
  4. Обновить
  5. Клиент отправляет заголовок cookie на сервер
  6. Сервер получает заголовок cookie, поэтому PHP может его прочитать
  7. Загрузка страниц - Cookie IS , видимый здесь.

Если вы еще не пробовали, обновите снова!

Поскольку вы хотите прочитать его одновременно с настройкой, просто сохраните значение, которое вы устанавливаете, и используйте его. В качестве альтернативы (хотя это не проверено), вы можете вручную установить его в массиве $_COOKIE.

Так что-то вроде этого:

setcookie("helloworld", .. );
$_COOKIE['helloworld'] = $value;

Тогда вы можете прочитать это нормально. Обратите внимание, что я бы не советовал переопределять значение автоматического суперглобального (то же самое относится к $_REQUEST, $_POST, $_GET и т. Д.), А вместо этого предложил бы просто сохранить значение, которое вы устанавливаете, и используйте это.


Другим подходом было бы использование формы «шлюза», то есть вы установили бы cookie на странице шлюза, которая затем продолжит перенаправлять вас на следующую страницу.

Например, скажем, ваш поток был следующим: login.php -> account.php. Вместо того, чтобы POST'ing вашу форму входа прямо на account.php у вас есть 2 варианта.

Опция 1: верните POST в login.php, установите cookie, а затем перенаправьте на account.php. Вариант 2: имейте шлюз, такой как logincheck.php, POST через него, установите cookie, а затем перенаправьте на account.php.

Таким образом, account.php всегда сможет увидеть ваше печенье.

3 голосов
/ 09 мая 2011

Может быть связано или нет, но вы присваиваете логические значения параметрам, которые ожидают целые числа или строки. Если вы новичок в PHP, очень важно внимательно прочитать руководство и понять сигнатуры функций. В этом случае вы должны проверить http://php.net/setcookie, где вы можете прочитать это:

bool setcookie (строка $ name [, строка $ value [, int $ expire = 0 [, строка $ path [, строка $ domain [, bool $ secure = false [, bool $ httponly = ложь]]]]]])

Кроме того, я получаю предупреждение при запуске вашего кода:

Warning: Cookie names cannot contain any of the following '=,; \t\r\n\013\014'
...