Запись и чтение кук на одной странице в PHP

Давайте теперь рассмотрим, как технически работает получение и установка кук.

Пусть некто заходит на сайт, переходя по ссылке или просто вбивая адрес в адресную строку. В этом случае браузер отправляет на сервер все куки данного сайта. И в 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']; ?>

Практические задачи

Запишите в куку момент времени захода пользователя на страницу. При обновлении страницы выведите на экран, сколько времени прошло с момента первого захода на страницу.