Давайте теперь рассмотрим, как технически работает получение и установка кук.
Пусть некто заходит на сайт, переходя по
ссылке или просто вбивая адрес в адресную
строку. В этом случае браузер отправляет
на сервер все куки данного сайта. И в PHP
скрипте эти куки становятся доступны в массиве
$_COOKIE
.
Затем на сайте выполняется PHP скрипт, который
может вызывать функции setcookie
,
устанавливая куки. При этом вновь установленные
куки появятся в $_COOKIE
только при
следующем заходе пользователя на сайт.
Посмотрим на примере. Давайте запишем через
setcookie
какую-то куку и сразу выведем
ее на экран. В этом случае при первом заходе
в $_COOKIE
для нашей куки будет null
,
а при уже обновлении страницы - значение куки:
<?php
setcookie('str', 'eee');
var_dump($_COOKIE['str']); // сначала null, а потом 'eee'
?>
Хитрый прием
Для того, чтобы установленная кука сразу
появилась в массиве $_COOKIE
можно
использовать хитрый прием.
Суть приема следующая: сначала установим
куку с помощью setcookie
, а потом
вручную запишем ее в массив $_COOKIE
:
<?php
setcookie('str', 'eee');
$_COOKIE['str'] = 'eee';
var_dump($_COOKIE['str']); // сразу выведет 'eee'
?>
Чтобы кука каждый раз не отправлялась в браузер, можно запись куки сделать внутри условия. Если такой куки нет, то запишем ее:
<?php
if (!isset($_COOKIE['str'])) { // если куки нет
setcookie('str', 'eee');
$_COOKIE['str'] = 'eee';
}
echo $_COOKIE['str']; // выведет 'eee'
?>
Давайте обсудим как это работает. При первом
заходе на страницу мы попадем в if
,
установим куку в браузер и сразу запишем
в $_COOKIE
. Далее через echo
выведется вручную записанное нами значение.
При следующих заходах на страницу мы не попадем
в if
, но в $_COOKIE
будет содержаться
наша кука, уже пришедшая из браузера.
Таким образом, и при первом заходе, и при
последующих в $_COOKIE
будет находится
наша кука.
Замечания
В коде хитрого приема обе строчки кода важны
- первая записывает куку в браузер, а вторая
- добавляет $_COOKIE
конкретно в данном
запуске PHP файла.
То есть, если просто записать что-то в массив
$_COOKIE
, это не запишет куку в браузер:
<?php
$_COOKIE['str'] = 'eee'; // в браузер не запишется
?>
Применение
Давайте сделаем счетчик обновления страницы:
<?php
if (!isset($_COOKIE['counter'])) { // первый заход на страницу
setcookie('counter', 1);
$_COOKIE['counter'] = 1;
} else {
setcookie('counter', $_COOKIE['counter'] + 1);
$_COOKIE['counter'] = $_COOKIE['counter'] + 1;
}
echo $_COOKIE['counter'];
?>
Можно упростить код с помощью оператора ++
:
<?php
if (!isset($_COOKIE['counter'])) { // первый заход на страницу
setcookie('counter', 1);
$_COOKIE['counter'] = 1;
} else {
setcookie('counter', ++$_COOKIE['counter']);
}
echo $_COOKIE['counter'];
?>
Практические задачи
Запишите в куку момент времени захода пользователя на страницу. При обновлении страницы выведите на экран, сколько времени прошло с момента первого захода на страницу.