PHP занятие 9. Cookie (Куки)
Существуют переменные сессионные (временные) и постоянные. Временные существуют пока открыт браузер, постоянные — пока не истечет срок годности cookie.
Работу сервера и браузера с cookie файлами демонстрирует следующая иллюстрация:
Браузер, посылая запрос на конкретный домен, смотрит, есть ли у него куки для этого домена
- Имя куки: только латинские буквы, цифры, символ подчеркивания и дефис
- Значение параметра
- Дата истечения срока годности
- Путь, который определяет, в каком месте домена может использоваться файл куки
- Домен
- Указание, что данные куки должны передаваться посредством безопасного соединения HTTPS
Рис. 9.2. Пример установки cookie
Рис. 9.3. Проверка передачи cookie
Задание 9_1: Создать cookie, установить значение – ваше имя. Написать код с проверкой передачи и выводом данного cookie на экран. Добавить текстовое поле для вывода значения cookie в нем.
Задание 9_2:
Выводите на экран количество посещений страницы, используя cookie.
Предлагаемый алгоритм (возможен другой вариант выполнения):
- Установите переменную для счетчика ($counter), обнулив ее.
- Проверьте, установлен ли уже cookie, если да — то присвойте переменной $counter значение cookie (см. пункт 3).
- Добавьте cookie для хранения количества посещений.
- Приращивайте счетчик.
- Проверьте, установлен ли уже cookie, если да — то выводите значение cookie.
Помимо стандартного создания cookie
setcookie("TestCookie", "Ivan", time()+300);
setcookie(«TestCookie», «Ivan», time()+300);
существует возможность создания массива из разных cookie:
Рис. 9.3. Создание массива из разных cookie
Пример: Создать два cookie для хранения имени и возраста. Представить cookie, как массив из двух элементов
while(list($name,$value)=each($_COOKIE)){ $array[0]="Иван"; $array[1]="23"; } foreach($array as $val){ echo "значение=".$val."
"; }
Данное задание также можно выполнить при помощи ассоциативного массива:
Выполнение:
while(list($name,$value)=each($_COOKIE)){ $array["Иван"]=23; } foreach($array as $k=>$val){ echo "индекс= ".$k." значение=".$val."
"; }
Задание:
Создать массив данных для хранения паролей. Значения паролей сохранить в cookie. В html-код добавить текстовые поля, выводить в них значения паролей.
Cookie: удаление
Алгоритм выполнения:
- Инициализируйте переменную для подсчета количества посещений
- Если соответствующие данные передавались через куки, сохраняйте их в эту
переменную - Нарастите счетчик посещений
- Инициализируйте переменную для хранения значения последнего посещения
страницы - Если соответствующие данные передавались из куки, отфильтруйте их и сохраните в эту переменную
- Установите соответствующие куки (для счетчика и для даты)
- Выводите информацию о количестве посещений и дате последнего посещения
Заголовки. Функция header: переадресация, установка кодировки и др
- Создать файл header.php с заголовком второго уровня «Здравствуйте!». При помощи директивы header отображать данную страницу в текстовом формате.
- Использовать на этой же странице директиву для перехода через 5 секунд на какую-либо другую страницу.
Хэш-функция (шифрование)
md5(string) — функция шифрования для хранения зашифрованных (хэшированных) данных в базе данных
Работа с куками
Куки (php.net) — суперглобальная переменная , которая тесно связана с сессиями. Она является механизмом для хранения данных браузером удаленной машины для отслеживания или идентификации возвращающихся посетителей.
В предыдущем уроке, при открытии сессии, с помощью функции session_start , на сервере создавался соответствующий файл сессии и его индификатор — это ни что иное, как тот самый id , который создавался в браузере под именем соответствующей куки ( PHPSESSID ), который включается в имя файла сессии.
Именно благодоря значению куки мы можем индифицировать клиента и связать его с соответствующим файлом сессии.
То, что находится в поле » время действии куки » — » сессионная «, обозначает, что данная кука будет связана с файлом сессии только на протяжении одного сеанса, то есть до тех пор, пока не будет закрыт браузер.
Чтобы запомнить некие данные, больше чем на один сеанс (например — авторизация на сайте), нужно записать их в файл куки браузера пользователя. Куки браузера — это что-то сродни файлу сессии на сервере . Файл кук и хранится на стороне клиента (где-то во временной папке браузера)
Мы, в этот файл куки, можем записать любую информацию, например, какую-то строку, благодоря которой, в дальнейшем сможем востановить сессию для клента.
Функция 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 и запишем в него:
// здесь ничего не должно быть
setcookie ( ‘test’ , ‘My Value’ );
echo $_COOKIE [ ‘test’ ];
?>
где:
— первый параметр test — имя куки
— второй параметр My Value — значение куки
— выводим куку, обратившись к соответствующему массиву куки и к его ключу — ‘test’
Обновив нашу страницу (и нажав «исследовать элемент») мы увидим, что кука » test » создана, значение у нее -» My Value «, но на экран она не выводится. Для того, чтобы получить это значение куки, мы должны запросить ее обратно из браузера. То есть значение будет выведено при следующем обновлении страницы. Еще увидим, что наша кука установленна на момент сессии (на момент одного сеанса).
Если мы хотим установить куку на большее количество времени, мы используем функцию time() , которая вернет текущее время и к нему мы прибавим нужное нам количество времени (time() + 3600 — устанавливаем куку на один час).
// здесь ничего не должно быть
setcookie ( ‘test’ , ‘My Value’ , time () + 3600 );
echo $_COOKIE [ ‘test’ ];
?>
К куки, как и к сессии, мы имеем доступ из различных файлов
Создадим в папке с уроком файл test.php и попробуем здесь вывести куку — http://phplessons/20/test.php (здесь куку не устанавливаем).
В данном случае кука прекрасно выводится.
Создадим этот же файл test.php, но в другой директории — директория » test » в папке с уроком. Попробуем вывести куку там. Здесь тоже у нас все работает.
Создадим новую куку в файле test.php директории » test «:
setcookie(‘test2’, ‘My Value2’) ;
И выведем для наглядности весь массив куки в файле index.php: var_dump ($_COOKIE) ;
Файл test.php в директории test .
— файл test.php в директории test —
setcookie ( ‘test2’ , ‘My Value2’ );
echo $_COOKIE [ ‘test’ ];
echo ‘
‘ ;
echo $_COOKIE [ ‘test2’ ];
echo ‘
‘ ;
echo ‘файл test из директории test’ ;
?>
setcookie ( ‘test’ , ‘My Value’ , time () + 3600 );
echo $_COOKIE [ ‘test’ ];
echo ‘
‘ ;
var_dump ( $_COOKIE );
echo ‘
‘ ;
echo ‘файл index.php’ ;
?>
На странице директории /test/test.php — новая кука test2 — создалась и при обновлении страницы выводится ее значение — My Value2 :
А на странице /index.php новая кука не появилась и значение ее не вывелось.
Это происходит потому, что кука по умолчанию создается для текущей директории и для всех вложенных в нее директорий . Для всех папок, которые находятся уровнем выше, эта кука будет уже не доступна.
Если мы хотим сделать куку доступной для всего сайта, тогда мы должны использовать еще один параметр: это параметр — path .
Если задать ‘ / ‘, куки будут доступны во всем домене phplessons .
Файл test.php в директории test .
— файл test.php в директории test —
// эта кука будет доступна для всего домена phplessons.
setcookie ( ‘test2’ , ‘My Value2’ , time ()+ 3600 , ‘/’ )
echo $_COOKIE [ ‘test’ ];
echo ‘
‘ ;
echo $_COOKIE [ ‘test2’ ];
echo ‘
‘ ;
echo ‘файл test из директории test’ ;
?>
Страница /test/test.php:
Удаление куки
Чтобы удалить куку надо использовать ту же самую функцию setcookie и в ней в качестве срока действия указать какое-либо время в прошлом .
Удалим куки test и test2 из файла index.php, предварительно закоментировав создания кук (в файлах index.php и /test/test.php):
// setcookie(‘test’, ‘My Value’, time() + 3600);
// удаляем куку test
setcookie ( ‘test’ , » , time () — 3600 );
// удаляем куку test2, здесь надо указать путь ‘/‘
setcookie ( ‘test2’ , » , time () — 3600 , ‘/’ );
echo $_COOKIE [ ‘test’ ];
echo ‘
‘ ;
var_dump ( $_COOKIE );
echo ‘
‘ ;
echo ‘файл index.php’ ;
?>
— куки test и test2 (для всего домена) будут удалены
Счетчик посещения страницы
Напишем счетчик , который будет фиксировать сколько раз мы посетили страницу и выводить данное количество (файл index.php)
Используем тернарный оператор .
— проверяем: если у нас существует ( isset ) кука ( $_COOKIE[‘counter’] ) тогда мы ( ? ) используем функцию ( setcookie(‘counter’) ), устанавливаем ее значение ( $_COOKIE[‘counter’] ) и увеличиваем ее значение на единицу с помощью оператора префиксного инкремента , далее устанавливаем время , например, на один час, и устанавливаем путь для всего домена — (‘ / ‘).
В противном случае ( : ), если у нас такой куки нет , тогда мы запишем в нее единицу
isset ( $_COOKIE [ ‘counter’ ]) ? setcookie ( ‘counter’ , ++ $_COOKIE [ ‘counter’ ], time () + 3600 , ‘/’ ): setcookie ( ‘counter’ , 1 , time() + 3600 , ‘/’ );
.
?>
Таким образом, при первом обращении, проверка у нас не выполнится, поскольку куки такой нет, и соответственно выполнится вторая строка кода, то есть мы создадим куку ‘ counter ‘ со значением один ( 1 ) и на один час для всего домена .
При повторном обращении к странице, увеличим ее значение на единицу.
Выводим куку.
— если у нас существует кука, тогда мы ее выведим $_COOKIE[‘counter’] , в противном случае мы выведем единицу.
.
echo isset ( $_COOKIE [ ‘counter’ ]) ? $_COOKIE [ ‘counter’ ] : 1 ;
?>