Учимся работать с cookie в PHP. Setcookie - Посылает cookie Получение cookie в PHP

int setcookie (string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Setcookie() определяет куку для отправки вместе с остальной header-информацией.Куки обязаны быть отправлены до любых других шапок/headers (это ограничение кук, а не РНР). Это требует, чтобы вы помещали вызовы этой функции перед тэгами или. Все аргументы, кроме name , являются необязательными.Если имеется только аргумент name, кука с этим именем будет удалена с удалённого клиента.Вы можете также заместить любой аргумент пустой строкой (""), чтобы пропустить этот аргумент.Аргументы expire и secure это целые числа/integer и они не могут быть пропущены с помощью пустой строки. В них используйте нуль (0).Аргумент expire это обычное Unix time integer, возвращаемое функциями time() или mktime() .Аргумент secure указывает, что данная кука должна передаваться только через секретное HTTPS-соединение. После того как куки установлены, доступ к ним может быть получен при загрузке следующей страницы через массив $_COOKIE (который вызывается $HTTP_COOKIE_VARS в версиях PHP до 4.1.0). Обычные ловушки:Куки будут невидимы до тех пор, пока не будет загружена следующая страница.Куки обязаны быть удалены с теми же параметрами, с которыми были установлены. В PHP 3 множественные вызовы setcookie() в том же скрипте могут быть выполнены в реверсном порядке. Если вы пытаетесь удалить одну куку до вставки другой, вы должны сделать вставку до удаления. В PHP 4 множественные вызовы setcookie() выполняются в порядке вызова. Далее идут примеры отправки кук:
Обратите внимание, что часть value куки будет автоматически urlencoded при отправке куки, и, когда она получена, она автоматически декодируется и присваивается переменной с тем же именем, что и имя куки. Для просмотра содержимого нашей тестовой куки в скрипте просто используйте один из следующих примеров: О куках дополнительно см. спецификацию Netscape по адресу: http://www.netscape.com/newsref/std/cookie_spec.html . Microsoft Internet Explorer 4 с Service Pack 1 некорректно работает с куками, которые имеют установленный параметр path. Netscape Communicator 4.05 и Microsoft Internet Explorer 3.x обрабатывают куки некорректно, если path и time не установлены.

Определяет куку для отправки вместе с остальной header-информацией. Куки обязаны быть отправлены до любых других шапок/headers (это ограничение кук, а не РНР). Это требует, чтобы вы помещали вызовы этой функции перед первым выводом на страницу, т.е. до тэга.

int setcookie (string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Все аргументы, кроме name , являются необязательными. Если имеется только аргумент name, кука с этим именем будет удалена с удалённого клиента. Вы можете также заместить любой аргумент пустой строкой ("" ), чтобы пропустить этот аргумент. Аргументы expire и secure это целые числа/integer и они не могут быть пропущены с помощью пустой строки. В них используйте нуль (0 ). Аргумент expire это обычное Unix time integer, возвращаемое функциями time() или mktime() . Аргумент secure указывает, что данная кука должна передаваться только через секретное HTTPS-соединение.

После того как куки установлены, доступ к ним может быть получен при загрузке следующей страницы через массив $_COOKIE (который вызывается $HTTP_COOKIE_VARS в версиях PHP до 4.1.0).

Обычные ловушки:

    Куки будут невидимы до тех пор, пока не будет загружена следующая страница.

    Куки обязаны быть удалены с теми же параметрами, с которыми были установлены.

В PHP 3 множественные вызовы setcookie() в том же скрипте могут быть выполнены в реверсном порядке. Если вы пытаетесь удалить одну куку до вставки другой, вы должны сделать вставку до удаления. В PHP 4 множественные вызовы setcookie() выполняются в порядке вызова.

Пример 1. Отправка кук функцией setcookie()
setcookie ("TestCookie", $value); setcookie ("TestCookie", $value,time()+3600); // период действия - 1 час setcookie ("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);

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

Пример 2. Удаление куки с помощью setcookie()
// установить дату окончания действия на один час назад setcookie ("TestCookie", "", time() - 3600); setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);
Пример 3. Удаление всех кук
foreach($_COOKIE as $ind=>$val) @setcookie($ind,"",time()-999, "/", ".".$_SERVER["SERVER_NAME"]);
Пример 4.

Обратите внимание, что часть value куки будет автоматически urlencoded при отправке куки, и, когда она получена, она автоматически декодируется и присваивается переменной с тем же именем, что и имя куки. Для просмотра содержимого нашей тестовой куки в скрипте просто используйте один из следующих примеров:

Echo $TestCookie; echo $_COOKIE["TestCookie"];

Пример 5.

Вы можете также установить куки массива, используя нотацию в имени куки. Это даёт эффект установки стольких кук, сколько элементов в этом массиве, но, когда кука получается скриптом, значения помещаются в массив с именем куки:

Setcookie ("cookie", "cookiethree"); setcookie ("cookie", "cookietwo"); setcookie ("cookie", "cookieone"); foreach($_COOKIE as $name=>$val) { echo "$name = $value
\n"; }

Пример 6.

Если у Вашего сервера два доменных имени: "www.domain.com" и "other.domain.com", и Ваш аккаунт позволяет Вам обслуживать страницы из каталога ~/myhome, Вы должны вызывать функцию setcookie() следующим образом:

Setcookie("name", $value, time()+3600, "~/myhome", ".domain.com ");

Пример 7. Счетчик в куки с помощью setcookie()

О куках дополнительно

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

Приведем пример использования Cookies на конкретном примере.

Предположим, нам нужно написать счетчик посещения сайта. Нам нужно знать, какое число посещений сайта осуществлялось каждым конкретным посетителем.

Данную задачу можно решить двумя способами. Первый из них заключается в ведении учета IP-адресов пользователей. Для этого нужна база данных всего из одной таблицы, примерная структура которой такая:

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

  • Для каждого IP-адреса нужно вести учет в одной таблице, которая может быть очень большой. А из этого следует, что мы нерационально используем процессорное время и дисковое пространство;
  • У большинства домашних пользователей IP-адреса являются динамическими. То есть, сегодня у него адрес 212.218.78.124, а завтра - 212.218.78.137. Таким образом, велика вероятность идентифицировать одного пользователя несколько раз.

Можно использовать второй способ, который намного легче в реализации и более эффективен. Мы устанавливаем в Cookie переменную, которая будет храниться на диске удаленного пользователя. Эта переменная и будет хранить информацию о посещениях. Она будет считываться скриптом при обращении посетителя к серверу. Выгода такого метода идентификации очевидна. Во-первых, нам не нужно хранить множество ненужной информации о IP-адресах. Во-вторых, нас не интересуют динамические IP-адреса, поскольку данные о своих посещениях хранятся конкретно у каждого посетителя сайта.

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

Файлы Cookies представляют собой обыкновенные текстовые файлы, которые хранятся на диске у посетителей сайтов. Файлы Cookies и содержат ту информацию, которая была в них записана сервером.

Программирование Cookies

Приступим к программированию Cookies.

Для установки Cookies используется функция SetCookie() . Для этой функции можно указать шесть параметров, один из которых является обязательным:

  • name - задает имя (строк), закрепленное за Cookie;
  • value - определяет значение переменной (строка);
  • expire - время "жизни" переменной (целое число). Если данный параметр не указать, то Cookie будут "жить" до конца сессии, то есть до закрытия браузера. Если время указано, то, когда оно наступит, Cookie самоуничтожится.
  • path - путь к Cookie (строка);
  • domain - домен (строка). В качестве значения устанавливается имя хоста, с которого Cookie был установлен;
  • secure - передача Cookie через защищенное HTTPS-соединение.

Обычно используются только три первые параметра.

Пример установки Cookies:



SetCookie ("Test" , "Value" );

// Устанавливаем Cookie на один час после установки:
SetCookie ("My_Cookie" , "Value" , time ()+ 3600 );

?>

При использовании Cookies необходимо иметь в виду, что Cookies должны устанавливаться до первого вывода информации в браузер (например, оперетором echo или выводом какой-либо функции). Поэтому желательно устанавливать Cookies в самом начале скрипта. Cookies устанавливаются с помощью определенного заголовка сервера, а если скрипт выводит что-либо, то это означает, что начинается тело документа. В результате Cookies не будут установлены и может быть выведено предупреждение. Для проверки успешности установки Cookies можно использовать такой метод:

// Устанавливаем Cookie до конца сессии:
// В случае успешной установки Cookie, функция SetCookie возвращает TRUE:
"

Cookies успешно установлены!

" ;
?>

Функция SetCookie() возвращает TRUE в случае успешной установки Cookie. В случае, если Cookie установить не удается SetCookie() возвратит FALSE и возможно, предупреждение (зависит от настроек PHP). Пример неудачной установки Cookie:

// Cookies установить не удастся, поскольку перед отправкой
// заголовка Cookie мы выводим в браузер строку "Hello":
echo "Hello" ;
// Функция SetCookie возвратит FALSE:
if (SetCookie ("Test" , "Value" )) echo "

Cookie успешно установлен!

" ;
else echo "

Cookie установить не удалось!

"
;
// Выводит "Cookie установить не удалось!".
?>

Cookie установить не удалось, поскольку перед посылкой заголовка Cookie мы вывели в браузер строку "Hello".

Чтение значений Cookies

Получить доступ к Cookies и их значениям достаточно просто. Они хранятся в суперглобальных массивах и $_COOKIE и $HTTP_COOKIE_VARS .

Доступ к значениям осуществляется по имени установленных Cookies, например:

echo $_COOKIE["my_cookie"];
// Выводит значения установленной Cookie "My_Cookie"

Пример установки Cookie и последующего его чтения:

// Устанавливаем Cookie "test" со значением "Hello" на один час:
setcookie ("test" , "Hello" , time ()+ 3600 );
// При следующем запросе скрипта выводит "Hello":
echo @$ _COOKIE [ "test" ];
?>

В рассмотренном примере при первом обращении к скрипту устанавливается Cookie "test" зо значением "hello". При повторном обращении к скрипту будет выведено значение Cookie "test", то есть строка "Hello".

При чтении значений Cookies обращайте внимание на проверку существования Cookies, например, используя оператор isset() . Либо путем подавления вывода ошибок опереатором @

А вот пример, как построить счетчик числа загрузок страницы с помощью Cookies:

// Проверяем, был ли уже установлен Cookie "Mortal",
// Если да, то читаем его значение,
// И увеличиваем значение счетчика обращений к странице:
if (isset ($ _COOKIE [ "Mortal" ])) $ cnt =$ _COOKIE [ "Mortal" ]+ 1 ;
else $ cnt = 0 ;
// Устанавливаем Cookie "Mortal" зо значением счетчика,
// С временем "жизни" до 18/07/29,
// То есть на очень долгое время:
setcookie ("Mortal" ,$ cnt , 0x6FFFFFFF );
// Выводит число посещений (загрузок) этой страницы:
echo "

Вы посещали эту страницу " .@$ _COOKIE [ "Mortal" ]. " раз

" ;
?>

Удаление Cookies

Иногда возникает необходимость удаления Cookies. Сделать это несложно, необходимо лишь вновь установить Cookie с идентичным именем и пустым параметром. Например:

// Удаляем Cookie "Test":
SetCookie ("Test" , "" );
?>

Установка массива Cookies и его чтение

Мы может установить массив Cookies, используя квадратные скобки в именах Cookies , а затем прочитать массив Cookies и значения этого массива:

// Устанавливаем массив Cookies:
setcookie ("cookie" , "Первый" );
setcookie ("cookie" , "Второй" );
setcookie ("cookie" , "Третий" );

// После перезагрузки страницы мы отобразим
// Состав массива Cookies "cookie":
if (isset ($ _COOKIE [ "cookie" ])) {
foreach ($ _COOKIE [ "cookie" ] as $ name => $ value ) {
echo "$name: $value
" ;
}
}
?>

Преимущества использования Cookies неоспоримы. Однако существуют и некоторые проблемы их использования. Первая из них заключается в том, что посетитель может блокировать прием Cookies браузером или попросту удалить все Cookies или их часть. Таким образом, мы можем иметь некоторые проблемы в идентификации таких посетителей.



<<< Назад Содержание Вперед >>>
Есть еще вопросы или что-то непонятно - добро пожаловать на наш


В этой статье я расскажу вам о том, что такое Cookie (в переводе с английского - печенье, к слову об изображении), как их используют, насколько они важны в современном Рунете и как с ними работать средствами PHP.

Теперь немного сухой, но обязательной информации, которая после будет объяснена на примерах)

Cookie - это набор данных (сохраняемый как текстовый файл), который создаётся web-сервером и который отсылается при каждом обращении к серверу. Cookie хранятся в браузере пользователя и составляются для определённого сайта.

Куки, как правило, используют для хранения технических данных пользователя (кэш уникального id для автоматического входа на сайт, личные настройки и статистики), интернет-ресурсу (что смотрел, что нажимал) и общим данным по предпочтениям (например любит сайты, посвящённые автомобилям, а значит ему можно показывать соответствующую рекламу на других сайтах - обращали внимание на такое? Это cookie). Куку удаляют в основном двумя способами: средствами PHP и самостоятельной чисткой пользователя кук своего браузера.

Примеры записи cookie на PHP

Первое и самое главное - запись куки в браузер. Ниже приведены примеры записи, продления, сокращения на PHP.
Для записи, продления, сокращения срока действия куки используется setcookie .

// создаём куку
setcookie("Name", "Value",time()+3600); // создали cookie с названием Name, значением Value на 1 час (3600 секунд)

// сокращаем срок действия
setcookie ("Name", "", time() - 3600); // срок действия куки сокращён на час
?>

Как проверить, записалось ли значение для cookie?

setcookie("Name", "Value",time()+3600); // создаём куку
if (SetCookie("Test","Value")) echo "

Cookies успешно установлены!

";
// при следующем запросе выведет "Value":
echo @$_COOKIE["Test"]; // выводим куку. Напоминаю, знак @ не выводить ошибку в случае отсутствия куки
?>
В последнем примере при выводе куки мы используем специальный для этого массив $_COOKIE.

Как удалить Cookie в PHP?

Для удаления куки используется также setcookie или unset .

unset($_COOKIE["Name"]); // первый способ удалить куку
setcookie("Name","Value",time()-1); // второй способ - возьмём и просрочим действие куки
setCookie("Name",""); // третий способ - оставляем значение пустым
?>

Пишем первый скрипт с использованием Cookie на PHP - форма авторизации

И давайте сейчас с Вами решим такую задачу: если пользователь авторизован на сайте, то поздороваться с ним, иначе вывести форму входа. Причём, если данные, введённые в форму, неправильные, то вывести соответствующее предупреждение. Реализация выглядит следующим образом:

// вывод формы для ввода данных
// после нажатия "Войти" страница обновляется
function showForm() {
$string = "

";
$string .= "";
$string .= "";
$string .= "";
$string .= "";
$string .= "";
$string .= "";
$string .= "";
$string .= "
";
return $string;
}
// проверка введённых пользователем данных. Если верно, то возвращает true
function check($login, $pass) {
if (($login == "admin") && ($pass == md5("12345"))) return true;
else return false;
}
// теперь запись
if (isset($_POST["log"])) {
$login = $_POST["login"];
$pass = md5($_POST["pass"]);
if (check($login, $pass)) {
setcookie("login", $login);
setcookie("pass", $pass);
}
else echo "Вы ввели неверные данные. Пожалуйста, попробуйте ещё";
}
?>




setcookie("login", $login);
setcookie("pass", $pass);
// ниже дубль предыдущего кода, который позволяет реализовать сценарий в рамках одной страницы
$login = $_COOKIE["login"];
$pass = $_COOKIE["pass"];
if (check($login, $pass)) echo "Здравствуйте, $login";
else echo showForm();
?>


Смотрим результат работы. После демонстрации обязательно прочитайте описание работы кода.

Код и его логика простые. В верхней части мы создали функции-обработчики: вывод формы для входа, проверка соответствия данных (если успех, то возвращает true, если данные не совпадают, то - false):

После этого производим запись куки.

Обратите внимание на $_SERVER (можно заменить на $_SERVER). Эта константа содержит путь к текущему файлу. В результате обработки формы (значение атрибута action) обращается по этому же пути, к этому файлу.

Следом идёт проверка отправки формы (передавались ли значение log, то есть нажимали ли кнопку Войти). Если да, то проверяются данные login и pass. Стоит обратить внимание, что пароль не передаётся в чистом виде, а зашифровывается встроенной в PHP функцией шифрования данных md5().

Сравнение пароля в данном скрипте происходит по модели шифруем(пароль из формы) совпадает ли с шифруем(пароль по умолчанию) . Если проверка прошла успешно, то получаем true и далее происходит запись в cookie. Если нет, то выводится сообщение - Вы ввели неверные данные. Пожалуйста, попробуйте ещё. И вновь выводим форму авторизации с HTML-тегами.

Спасибо за внимание!

В сегодняшнем уроке мы поговорим о работе с cookie в PHP. Начнём с того, что же это такое, для чего это нужно и почему оно вообще появилось.

Для чего нужны cookie

Как мы с вами уже знаем, в PHP мы можем работать с GET- и POST-запросами. Они позволяют нам передавать серверу данные, чтобы как-то повлиять на работу кода. Мы можем передать скрипту логин и пароль, он их проверит и разрешит нам доступ к какой-либо информации. Однако, это не позволит создать сессию между нами и сервером. То есть сервер не может нас «запомнить», и каждый раз, как мы хотим сказать что это мы, придется отправлять отдельный новый запрос с логином и паролем.

В качестве решения придумали cookie. Это такие записи с типом ключ-значение, типа массива в PHP, только хранятся они в браузере у пользователя сайта. Для каждого сайта cookie хранятся отдельно. Каждый раз, когда пользователь обращается с запросом на сайт, браузер проверяет наличие этих записей для данного сайта. И если они имеются, то он отправляет их в заголовке каждого запроса к этому сайту.

Откуда берутся cookie

Cookie создаются в браузере по «просьбе» сервера. В какой-то момент мы решаем, что нужно в браузере посетителя создать cookie с каким-то значением. Для этого нужно чтобы сервер передал в ответе клиенту специальный заголовок, в котором указано, какую запись нужно создать в браузере для данного сайта.

Всё это происходит в фоне и не заметно для пользователя. По этому принципу работает авторизация на любом сайте. В простейшем случае, после того как вы ввели логин и пароль на сайте, сервер проверяет, верны ли они. И если да, то сервер может попросить браузер сохранить эти данные в cookie и при каждом запросе отправлять их ему.

То есть сервер примерно говорит: «Эй, браузер, создай запись для меня с ключом “login” и значением “admin”, и ещё одну с ключом “password” и значением “123”». После этого браузер при любом запросе к серверу начинает отправлять дополнительные данные типа:

Login: admin password: 123

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

Про время жизни

При этом у cookie есть TTL (Time To Live – время жизни). То есть эти записи могут быть временными. Это время жизни так же указывается сервером во время установки cookie в браузер. Благодаря этому можно сделать так, чтобы сессия длилась пол часа. А после этого времени пользователю надо будет авторизоваться снова. Наверняка вы замечали это в действии на многих сайтах.

Как работать с cookie в PHP

Итак, мы в общих чертах разобрались с тем, как работают cookie. Давайте теперь посмотрим, как с ними можно работать в языке PHP.

Давайте создадим в нашем проекте файл с именем viewCookies.php. Поместим в него следующий код.

Как вы уже должны были догадаться, $_COOKIE - это еще один глобальный массив в PHP, аналогично массивам $_GET и $_POST . Только в нём хранятся все cookie, которые были отправлены браузером в рамках текущего запроса.

Давайте посмотрим на работу данного скрипта, открыв в браузере страницу: http://myproject.loc/viewCookies.php

Как мы видим, в данный момент этот массив пуст. Давайте же его наполним:) Для этого нам нужно установить какую-нибудь cookie в браузер. В PHP для этого используется функция setcookie($name, $value, $ttl, $path)

Передаваемые параметры:

  • $name – название cookie
  • $value – её значение
  • $ttl – время жизни. Если указать 0, то cookie будет установлена навсегда (пока её не удалят).
  • $path – путь в адресной строке. Если задать "/", cookie будут доступны из всех директорий сайта. Например, и в http://myproject.loc/ и в http://myproject.loc/posts/ . Если задать "/posts/", cookie будут доступны только из директории http://myproject.loc/posts/ и всех ее поддиректорий (например, http://myproject.loc/posts/new/). По умолчанию значением является текущая директория, в которой cookie устанавливается. Если мы хотим, чтобы cookie была доступна на всём сайте, то нужно устанавливать это значение в "/".

Есть еще несколько параметров, о них вы можете прочитать в официальной документации .

А теперь давайте попробуем эту функцию в деле. Создадим файл setCookies.php и запишем в него следующий код:

После этого перейдём по адресу http://myproject.loc/setCookies.php , где увидим пустую страницу. Как мы уже говорили, работа с cookie не видна пользователю.

Однако, эту работу всегда можно увидеть в консоли разработчика Google Chrome. Давайте откроем её (нажатием F12), перейдём во вкладку Network, обновим страницу в браузере и найдём её в списке загруженных данных (она там одна).

Нажмем на эту запись и в открывшемся справа окне выберем вкладку Headers. Здесь, в секции Response Headers мы можем видеть заголовок Set-Cookie с указанными нами данными.

Таким образом, cookie были успешно установлены в браузере. Давайте теперь перейдём на нашу страничку, выводящую массив $_COOKIE - http://myproject.loc/viewCookies.php

Как мы видим, теперь на сервер передаются cookie, ранее установленные в браузере. Увидеть их можно и в запросе, посмотрев в консоли разработчика секцию Request Headers.

Если вам нужно посмотреть все cookie, которые имеются в браузере для данного сайта - можно посмотреть их в той же консоли разработчика Google Chrome. Для этого перейдем во вкладку Application, выберем в левом списке пункт Cookies, а внутри него наш сайт.

Все cookie будут представлены в виде удобного списка.

Что еще нужно знать про cookie

И в заключение данного урока нужно добавить, что cookie устанавливаются с помощью заголовка в ответе сервера по протоколу HTTP. Протокол HTTP устроен таким образом, что заголовок должен всегда идти перед данными, и никак иначе. Таким образом, функция setcookie и любые другие функции в PHP, изменяющие заголовок в HTTP-ответе, должны вызываться до любого вывода данных.

Можно сначала задать cookie, а затем вывести текст.

Всё прекрасно отработает.

Но нельзя вывести текст (являющийся телом HTTP-ответа), а затем пытаться установить cookie.

Как мы видим, это приведет к ошибке. Так устроен протокол HTTP. Сначала - заголовок, затем - тело. Только так и никак иначе.

Установка нескольких cookie

Нет ничего проще, чем установить несколько cookie. Для этого нужно просто несколько раз вызвать функцию setcookie.

Они успешно будут переданы клиенту.

Пример полноценного взаимодействия с пользователем через cookie мы рассмотрим в следующем уроке. А пока - за домашку.