Работа с куками в PHP

Работа с куками



Функция setcookie

Создание куки

Удаление куки

Счетчик посещения страницы



Куки (php.net) - суперглобальная переменная , которая тесно связана с сессиями. Она является механизмом для хранения данных браузером удаленной машины для отслеживания или идентификации возвращающихся посетителей.

В предыдущем уроке, при открытии сессии, с помощью функции session_start, на сервере создавался соответствующий файл сессии и его индификатор - это ни что иное, как тот самый id, который создавался в браузере под именем соответствующей куки (PHPSESSID), который включается в имя файла сессии.

Именно благодоря значению куки мы можем индифицировать клиента и связать его с соответствующим файлом сессии.


cookie1.png



То, что находится в поле "время действии куки" - "сессионная", обозначает, что данная кука будет связана с файлом сессии только на протяжении одного сеанса, то есть до тех пор, пока не будет закрыт браузер.

Чтобы запомнить некие данные, больше чем на один сеанс (например - авторизация на сайте), нужно записать их в файл куки браузера пользователя. Куки браузера - это что-то сродни файлу сессии на сервере. Файл кук и хранится на стороне клиента (где-то во временной папке браузера)

Мы, в этот файл куки, можем записать любую информацию, например, какую-то строку, благодоря которой, в дальнейшем сможем востановить сессию для клента.



Функция setcookie




Для работы с куками существует функция - setcookie (php.net). с помощью этой функции мы можем как установить куку , так ее и удалить .

Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта.

Данная функция имеет только один обязательный параметр - это имя куки. Все остальные параметры - опциональны.


setcookie ( $name, $value = "", $expire = 0, $path = "", $domain = "", $secure = FALSE, $httponly = FALSE )



name - имя cookie
value - значение cookie
expires - это время, когда истекает срок действия cookie
path - это путь к директории на сервере, для которой будут доступны cookie
Если задать '/', куки будут доступны во всем домене domain. Если задать '/test/', куки будут доступны только из директории /test/ и всех ее поддиректорий (например, /test/test_1/) домена domain.
По умолчанию значением является текущая директория , в которой кука устанавливается.
domain - домен, которому доступны cookie
secure - указывает на то, что значение cookie должно передаваться от клиента по защищенному соединению HTTPS. Если задано TRUE, cookie от клиента будет передано на сервер, только если установлено защищенное соединение.
httponly - если задано TRUE, cookie будут доступны только через HTTP-протокол . То есть cookie в этом случае не будут доступны скриптовым языкам , вроде JavaScript - это значит, что куку нельзя будет украсть через JavaScript



Создание куки




Пример:

- создадим в папке с уроком файл index.php и запишем в него:


-- файл index.php --

// здесь ничего не должно быть
<?php
setcookie ('test', 'My Value');
echo $_COOKIE ['test'];
?>



где:
- первый параметр test - имя куки
- второй параметр My Value - значение куки
- выводим куку, обратившись к соответствующему массиву куки и к его ключу - 'test'


Обновив нашу страницу (и нажав "исследовать элемент") мы увидим, что кука "test" создана, значение у нее -"My Value ", но на экран она не выводится. Для того, чтобы получить это значение куки, мы должны запросить ее обратно из браузера. То есть значение будет выведено при следующем обновлении страницы. Еще увидим, что наша кука установленна на момент сессии (на момент одного сеанса).


cookie2.png



Если мы хотим установить куку на большее количество времени, мы используем функцию time(), которая вернет текущее время и к нему мы прибавим нужное нам количество времени (time() + 3600 -- устанавливаем куку на один час).


Файл index.php


-- файл index.php --

// здесь ничего не должно быть
<?php
setcookie ('test', 'My Value', time() + 3600 );
echo $_COOKIE ['test' ];
?>



cookie3.png



К куки, как и к сессии, мы имеем доступ из различных файлов

Создадим в папке с уроком файл test.php и попробуем здесь вывести куку - http://phplessons/20/test.php (здесь куку не устанавливаем).


Файл test.php


-- файл test.php --

<?php
echo $_COOKIE ['test'];
?>



В данном случае кука прекрасно выводится.


cookie4.png



Создадим этот же файл test.php, но в другой директории - директория "test" в папке с уроком. Попробуем вывести куку там. Здесь тоже у нас все работает.


cookie5



Создадим новую куку в файле test.php директории "test":
setcookie('test2', 'My Value2');
И выведем для наглядности весь массив куки в файле index.php: var_dump ($_COOKIE);


Файл test.php в директории test.


-- файл test.php в директории test --

<?php
setcookie ('test2', 'My Value2');
echo $_COOKIE ['test'];
echo '<br>';
echo $_COOKIE ['test2'];
echo '<br>';
echo 'файл test из директории test';
?>



Файл index.php


-- файл index.php --

<?php
setcookie ('test', 'My Value', time() + 3600);
echo $_COOKIE ['test'];
echo '<br>';
var_dump ( $_COOKIE );
echo '<br>';
echo 'файл index.php';
?>



На странице директории /test/test.php - новая кука test2 - создалась и при обновлении страницы выводится ее значение - My Value2:


cookie6.png



А на странице /index.php новая кука не появилась и значение ее не вывелось.


cookie7



Это происходит потому, что кука по умолчанию создается для текущей директории и для всех вложенных в нее директорий. Для всех папок, которые находятся уровнем выше, эта кука будет уже не доступна.

Если мы хотим сделать куку доступной для всего сайта, тогда мы должны использовать еще один параметр: это параметр - path.
Если задать '/', куки будут доступны во всем домене phplessons .


Файл test.php в директории test.


-- файл test.php в директории test --

<?php
// эта кука будет доступна для всего домена phplessons.
setcookie ('test2', 'My Value2', time()+ 3600, '/')

echo $_COOKIE ['test'];
echo '<br>';
echo $_COOKIE ['test2'];
echo '<br>';
echo 'файл test из директории test';
?>



Страница /test/test.php:


cookie8.png



Страница /index.php:


cookie9.png




Удаление куки




Чтобы удалить куку надо использовать ту же самую функцию setcookie и в ней в качестве срока действия указать какое-либо время в прошлом .

Удалим куки test и test2 из файла index.php, предварительно закоментировав создания кук (в файлах index.php и /test/test.php):


Файл index.php


-- файл index.php --

<?php
// setcookie('test', 'My Value', time() + 3600);

// удаляем куку test
setcookie ('test', '', time() - 3600);

// удаляем куку test2, здесь надо указать путь '/'
setcookie ('test2', '', time() - 3600, '/');

echo $_COOKIE ['test'];
echo '<br>';
var_dump ($_COOKIE );
echo '<br>';
echo 'файл index.php';
?>
- куки test и test2 (для всего домена) будут удалены



Страница /index.php:


cookie10




Счетчик посещения страницы




Напишем счетчик , который будет фиксировать сколько раз мы посетили страницу и выводить данное количество (файл index.php)

Используем тернарный оператор .
- проверяем: если у нас существует (isset) кука ($_COOKIE['counter']) тогда мы (?) используем функцию (setcookie('counter')), устанавливаем ее значение ($_COOKIE['counter']) и увеличиваем ее значение на единицу с помощью оператора префиксного инкремента , далее устанавливаем время , например, на один час, и устанавливаем путь для всего домена - ('/').
В противном случае (:), если у нас такой куки нет , тогда мы запишем в нее единицу


Файл index.php


-- файл index.php --

<?php
isset ($_COOKIE ['counter']) ? setcookie('counter', ++ $_COOKIE ['counter'], time() + 3600, '/'): setcookie ('counter', 1, time() +3600, '/');
................................
?>



Таким образом, при первом обращении, проверка у нас не выполнится, поскольку куки такой нет, и соответственно выполнится вторая строка кода, то есть мы создадим куку 'counter' со значением один (1) и на один час для всего домена .

При повторном обращении к странице, увеличим ее значение на единицу.

Выводим куку.
- если у нас существует кука, тогда мы ее выведим $_COOKIE['counter'], в противном случае мы выведем единицу.


Файл index.php


-- файл index.php --

<?php
................................
echo isset ( $_COOKIE ['counter']) ? $_COOKIE ['counter'] : 1;
?>



Страница /index.php:


cookie11.png



Структура файлов урока


php20.png






Наверх Наверх