пятница, 13 января 2012 г.

Детальное описание PHP Cookies, примеры использования и массивы на базе cookies (cookies arrays)


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

Синтаксис setcookie()
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])
  • name: этот аргумент задает имя куки например setcookie('mycookie', …) присвоит mycookie и будет доступен в массиве $_COOKIE['mycookie'] на стороне сервера.
  • value: принимает значение куки. Так как это значение хранится на стороне клиента (в браузере), будьте предельно осторожны чтобы туда не попали такие данные как пароли. Значение куки будет доступно в $_COOKIE['mycookie'] на стороне сервера.
  • expire: Устанавливает время истечения срока жизни куки. Значение задается в формате метки времени (Unix timestump), потому часто используется с функцией времени time(). Для примера time()+60*37. Данная запись установит куку на 37 минут. Если этот параметр не задан, кука не является постоянной и будет удалена при закрытии браузера.
  • path: Путя в кукис используються для их корректной организации, основываясь на путях веб-сервера/сайта. Если path установлен в '/' то кука будет доступна со всех подкаталогов или страниц в глубине сайта. Если path установлен например в '/dir1/' то он будет доступен только в dir1 и во всех дочерних каталогах /dir1, /dir1/sub1 и т.п. Обратите внимание на то что по умолчанию path принимает значение текущего каталога а не корневого каталога '/'.
  • domain: Этот аргумент определяет в каком домене доступна кука. Значения типа: 'www.example.com' сделает куку доступной только в поддомене www. чтобы установить ее доступной во всех поддоменах ресурса example.com, значение должно быть установлено в '.example.com' .
  • secure: Значение 1 указывает на то что кука должна использоваться на защищенных соединениях (https). Значение по умолчанию 0.
Примеры setcookie()
setcookie('mycookie', 'Test mycookie');
Установит 'mycookie' с значением 'Test mycookie' и удалиться при закрытии браузера.
setcookie('mycookie', 'Test mycookie', time()+3600*24);
Удалиться при истечении 24 часов.
setcookie('mycookie', 'Test mycookie', time()+3600*24, "/dir1/");
Доступна для категории /dir1 и во всех ее поддиректориях.


Доступ к значениям cookies на стороне сервера
На стороне сервера, присланные куки будут превращены в PHP переменные. После PHP версии 4.1.0, они будут доступны в супер-глобальном массиве $_COOKIE. В старых версиях они доступны в массиве $HTTP_COOKIE_VARS (PHP 4.1.0<).
echo $_COOKIE["mycookie"];
Выведет на экран "Test mycookie".


Тестирование cookie
Если функция setcookies() вернула true, это еще не означает что браузер клиента сохранил ее у себя. Это нужно проверить при следующей загрузке страницы. Это можно сделать с помощью PHP функции print_r($_COOKIE). Она покажет какие куки находятся в этом супер-глобальном массиве, а также их значения.


Множественные cookies
Для создания множественных кук достаточно выполнить следующее:
  1. setcookie('mycookie1', 'Test mycookie1');
  2. setcookie('mycookie2', 'Test mycookie2');
  3. setcookie('mycookie3', 'Test mycookie3');
  4. setcookie('mycookie4', 'Test mycookie4');
при этом к ним можно будет достучится:
  1. echo $_COOKIE["mycookie1"];
  2. echo $_COOKIE["mycookie2"];
  3. echo $_COOKIE["mycookie3"];
  4. echo $_COOKIE["mycookie4"];

Массивы cookies
Мы можем использовать PHP массивы для cookies.
  1. setcookie("mycookie[0]", "value1");
  2. setcookie("mycookie[1]", "value2");
  3. setcookie("mycookie1['one']", "value11");
  4. setcookie("mycookie1['five']", "value15");
Эта форма определения подобна пред ведущей для множественных кук но с использованием свойств PHP массивов. Пример использования:
  1. foreach ($_COOKIE['mycookie'] as $key => $value) {
  2. echo "$key:$value ";
  3. }
Отобразит 0:value1 1:value2, а
  1. foreach ($_COOKIE['mycookie1'] as $key => $value) {
  2. echo "$key:$value";
  3. }
Отобразит one:value11 five:value15



Удаление cookie
Чтобы удалить cookies, достаточно установить их значение в "" при этом все остальные параметры должны быть те же что были установлены на время отправки куки. Когда мы удаляем куку мы также должны быть уверены в том что дата продолжительности куки уже указывает в прошлое. Например:
  1. setcookie ("mycookie", "", time() – 3600);
  2. setcookie ("mycookie", "", time() – 3600, "/dir1/");

Для удаления массива cookies используйте следующую конструкцию:

  1. foreach($_COOKIE['mycookie1'] as $key=>$value)
  2. setcookie("section[" . $key . "]","",time()-3600);