[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: как работают куки?
Arcoslov
Здравствуйте.

Помогите, плз, разобраться, как работают куки.
вот тут http://php.net/manual/ru/function.setcookie.php написано, что:
Цитата
setcookie() задает cookie, которое будет передано клиенту вместе с другими HTTP заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться прежде остального вывода, включая вывод тэгов <html> и <head>, а также пустые строки и пробелы.


вот мой код:
<?php
setcookie('val',1);
$val= (isset($_COOKIE['val'])) ? $_COOKIE['val'] : 0;
echo $val;
?>


Почему при первом заходе на эту странице echo $val даёт ноль? куки же раньше всего уходят браузеру, значит, к моменту присвоения значения переменной val куки уже должны быть установлены в 1, и именно она должна записаться.

p.s. WebDeveloper показывает, что в куках val = 1
inpost
Arcoslov
Потому что $_COOKIE создаются до начала обработки PHP, то есть на первой строчке они уже сформированы.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Arcoslov
inpost, не понятно.

куки находятся в клиентской части.
Клиент(браузер) обращается к серверу, начинается выполнение скрипта.
На первой строчке у нас задаётся кука.
На второй строчке переменная её не получает.
inpost
Arcoslov
$_COOKIE создаётся на "нулевой" строчке. setcookie не расширяет массив, созданный ранее.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
Цитата (Arcoslov @ 14.12.2014 - 21:02)
На первой строчке у нас задаётся кука.
На второй строчке переменная её не получает.

В переменной $_COOKIE находится куки из заголовков запроса, при первом запросе никаких кук нет, они ещё не установлены.
Arcoslov
Товарищи,

я не понимаю последовательность происходящего.
В моём понимании (исходя из текста моего скрипта):

1) сервер устанавливает куку в браузер (это в веб-девелопере видно, что кука сетится нормально).
2) переменная запрашивает эту куку, но нихрена не получает.

и, как вы говорите, есть ещё пункт номер ноль, который до всего этого.. что делает? устанавливает пустые куки?.. ну, допустим. моего скрипта это же не отменяет.

я в упор понять не могу - почему, если я напишу
$a=2;
$b=$a, то echo $b однозначно даст "2", а та же самая вещь с куками не прокатывает.
Первая строчка же идёт ДО второй и она корректно сетит куку, это видно.

blink.gif
Arcoslov
вот тут - первый пример - абсолютно мой случай)
http://www.w3schools.com/php/func_http_setcookie.asp
сначала сетятся куки, но схватываются только после перезагрузки страницы.

я на пути к истине, просто видимо не могу понять последовательность действий клиент-серверного взаимодействия. кто куки делает, куда кладёт, и как они ходят.
killer8080
1 первый запрос к серверу
GET /index.php HTTP/1.1
Host: example.com
...

в $_COOKIE ничего нет, потому что в запросе их не было

2 ответ сервера
HTTP/1.1 200 Ok
Set-Cookie: val=1
...


3 второй запрос к серверу
GET /index.php HTTP/1.1
Host: example.com
Cookie: val=1
...

теперь в $_COOKIE то что было установлено сервером в прошлом запросе
Как то так.
inpost
Arcoslov
Сначала создаются $_POST, $_COOKIE, $_GET.
Потом начинает выполняться PHP код.
setcookie создаёт куки на стороне клиента, а не сервера, вот и всё.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
$_COOKIE это заголовки запроса, setcookie() устанавливает заголовки ответа сервера, это совершенно разные вещи.
Arcoslov
Спасибо, теперь всё понятно!
wink.gif
Alchemist
Также рекомендую приобрести хорошую привычку читать мануалы до конца, а не только первое предложение.

Там же на где ты читал про то как работает функция, строчкой(!) ниже написано:
Цитата
После передачи клиенту cookie станут доступны через массивы $_COOKIE и $HTTP_COOKIE_VARS при следующей загрузке страницы.
Arcoslov
Цитата (Alchemist @ 15.12.2014 - 23:52)
Также рекомендую приобрести хорошую привычку читать мануалы до конца, а не только первое предложение.

Там же на где ты читал про то как работает функция, строчкой(!) ниже написано:
Цитата
После передачи клиенту cookie станут доступны через массивы $_COOKIE и $HTTP_COOKIE_VARS при следующей загрузке страницы.

да читал, просто механизм не был понятен.
Valick
inpost, вот эту строчку:
"Обучаю веб-программированию качественно и не дорого."
сотри, потому как обучатель из тебя мягко говоря не очень...


_____________
Стимулятор ~yoomoney - 41001303250491
inpost
Valick
Красавчик! У тебя забыл спросить laugh.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.