PHP - Урок 10. COOKIE.
PHP - Урок 10. COOKIE
Предыдущие уроки:
Программируем на PHP - Введение
PHP - Запросы от браузера к серверу
PHP - Как работает сервер
PHP - Урок 4. PHP - интерпретатор
PHP - Урок 5. Переменные сервера и глобальные переменные
PHP - Урок 6. Конструкции print и echo. Кавычки одинарные и двойные и конкатенация строк
PHP - Урок 7. Переменные, константы и условия
PHP - Урок 8. Точка входа в приложение. Настройка mod_rewrite и файл .htaccess
PHP - Урок 9. Массивы и switch. Кодим основной каркас
Сегодня как и обещал выясним как на стороне сервера (на сайте) запоминается пользовательский браузер. Именно браузер, а не сам пользователь. Подобно тому, как если вы заходите в соцсеть, и до этого недавно залогинились - вам не потребуется заново вводить свои логин и пароль. Их запомнил браузер и отправляет их серверу автоматически при заходе на сайт. Запоминает их он путем добавления в специальном своем файле строк в каждой которых помимо данных сайта и другой информации хранится пары имя (чаще называют ключом) и значение. Если в браузере для данного сайта есть куки - то при посещении сайта с этого браузера они будут отправлены на сервер в заголовках запроса.
Как посмотреть наличие кук для сайта и почистить их
Вчера кто заходил на голос со своего постоянного браузера вылезала ошибка 502. Чтобы эту ошибку одолеть надо было всего лишь почистить куки.
Причем достаточно только для сайта golos.io, а не для всех посещаемых сайтов. Мы программисты делать должны это так
Открыть консоль разработчика (F12) - Вкладка ресурсы - пункт дерева ресурсов cookie. Тут на куки можно посмотреть. И если вызвать контекстное меню для пункта куки и выбрать clear (очистить) - то все куки для данного сайта удаляться. Что вчера нам и нужно было сделать.
Итак куки передаются серверу при запросе ресурса автоматически от браузера, если они есть. Однако как эти куки записать в браузер из нашего php-скрипта.
Запись cookie в клиентский браузер из php
Как мы обсуждали ранее - заголовки передаются в том числе и с сервера клиенту. Легко догадаться, что если такие заголовки получает браузер, то он понимает, что их нужно сохранить в свой файл кук для данного сайта.
Для этого существует функция setcookie(). Эта функция создает заголовок, который отправляется браузеру для сохранения кука.
А вот чтобы читать заголовки приходящие от браузера серверу существует глобальный массив $_COOKIE['ИмяКука']. Как вы наверное заметили по принципу работы он аналогичен $_GET и $_POST.
Простой пример
Откроем файл test.php в папке нашего сайта (thesite.loc/www) и отредактируем его так:
<?php
$name = 'Руслан';
$num = 48;
//echo "Привет, $name, ты живешь в квартире номер $num! \n Мы Anonimous - жди нас.";
print_r($_COOKIE);
Если у браузера будут куки для нашего сайта он их передаст вместе с запросом и соответственно они появятся в этом массиве. В результате будут отображены на экране функцией print_r().
Однако кук там нет. Поэтому нужно предварительно их отправить.
Добавим в начало файла (до любого вывода echo, print_r и т.п) следующий код.
<?php
$name = 'Руслан';
$num = 48;
setcookie ("user_name", $name, time()+3600);
setcookie ("user_id", $num, time()+3600);
//echo "Привет, $name, ты живешь в квартире номер $num! \n Мы Anonimous - жди нас.";
print_r($_COOKIE);
Первый параметр функции setcookie - это ключ. Второй - значение. А третий - время сколько будет хранится кука. В примере 1 час. Однако я выбираю в реальных проектах период не меньше месяца.
Как мы уже знаем заголовки отправляются до любого вывода (на то они и заголовки), если вы функцию создающую заголовки добавите после вывода контента страницы - это уже не заголовок. И соответственно куки не сохранятся. А php выведет предупреждение на экран или в логи в зависимости от настроек.
Написав данный код в нашем файле test.php мы его сохраним и обновим.
На первый раз массив $_COOKIE ничего не выдаст. Так как в первый раз куки только записались в браузер.
А вот когда мы обновим страницу второй и последующие разы. Куки в заголовках вместе с запросом будут отправляться серверу. И мы увидим их распечатку в массиве.
Array ( [user_name] => Руслан [user_id] => 48 )
Таким образом браузер и запоминает логины пользователей. А вместо паролей для кук нужно генерировать специальный хеш для безопасности. Вскоре мы с этим познакомимся.