Php чтение cookie. Работа с файлами сессий и cookies в PHP и MYSQL. Удаление куки. Как удалить cookie

Всем привет!

Я снова в строю! В последнее время перемены в жизни вынуждают частенько отдаляться от блога, но тем не менее я здесь и никуда не ухожу! Скоро будет ряд очень полезных и познавательных уроков по заработку! Не пропустите! А пока я расскажу о том, как в php работать с куками. Как можно легко создать, удалить или обновить куки в php?

В последующих статьях мы рассмотрим работу куки в WordPress. А пока для общего развития разберем само понятие куки.

Не буду писать банальщину о том, что куки это в переводе печеньки и все такое. Информация эта, на мой взгляд, совершенно бесполезная. Скажу иначе, куки - это какая-то информация, которая хранится в Вашем браузере.

Например, Вы решили проголосовать в опросе. Далее Вы еще раз захотели проголосовать, но вместо принятия голоса вылезает сообщение: "Вы уже голосовали". Казалось бы, на сайте мы не регистрировались, откуда информация, что мы уже голосовали?

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

Как создать куки в php?

Создаются куки в php благодаря функции setcookie . Эта функция принимает в себя следующие параметры:

setcookie ("Имя" , "Значение" , "Срок" , "Путь" , "Домен" , "Защита" ) ;

  • Обязательный здесь только один параметр - "Имя".
  • "Значение" указывается значение куки, как уже все догадались.
  • Срок - сколько времени куки будут работать? После окончания срока действия, кука автоматически будет удалена. Срок может быть бессрочным, в случае, если мы не указываем значение "срок". Срок устанавливается только в секундах!
  • Путь - из какого каталога будет доступна кука. (обычно не указывается, и доступна из всех каталогов)
  • Домен - Домен указывается автоматически. В случае, если доступ к куки нужно получать и на поддоменах, можно указать ".сайт". В таком случае кука будет доступна на всех сайтах с адресами: name.сайт
  • Защита - если написано TRUE, тогда куки передаются по шифрованному соединению (ssl).

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

Теперь если посмотреть в браузере (я использую mozilla), то мы увидим куку в действии:

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

Как обновить куки php?

Предположим нам нужно обновить значение куки. Т.е. название будет то же, но значение или срок действия надо изменить. В таком случае нам опять же понадобится функция setcookie .

Операция ничем не отличается от операции создания куков. Точно так же пишем похожий код, но с измененными данными:

Теперь посмотрим, что содержится в браузере:

Как видите, обновление куки произошло успешно!

Как прочитать\получить куку php?

То, что в браузере отображается кука, это хорошо, но мы ведь ее создаем, чтобы впоследствии использовать в наших скриптах. Так как же получить куку? Для этого существует глобальный массив кук $_COOKIE , в котором находятся вообще все созданные куки. Обратиться к ним легко - достаточно знать имя.

Теперь кука удалится!

Одно важное замечание, о котором никто не говорит. Когда я только начинал изучать программирование, я удалил куку этим способом. Зашел в браузер - кука осталась. Перерыл все форумы - такая проблема часто встречается, но все отвечают мол: "Хм, не знаю, у меня работает". А причина вот в чем - кука удаляется, но не из файлов пользователя. Там она остается. И открывая браузер, Вы ее видите, но если мы обратимся к ней посредством $_COOKIE["wpguru"] , то в результате будет 0. Вот так можно легко проверить, удалена ли кука.

На этом у меня все, в ближайшее время будут выходить еще статьи. Скорей всего я опишу в следующей статьи, какие планы ждут блог, и подробно расскажу про серию статей о заработке. Все будет в онлайн-режиме, т.е. я зарабатываю, и пишу статью. А не просто теорию вещаю.

Так что ждите.

До скорых встреч!

(PHP 4, PHP 5, PHP 7)

setcookie — Посылает cookie

Описание

Bool setcookie (string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]])

setcookie() задает cookie, которое будет передано клиенту вместе с другими HTTP заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться прежде остального вывода, включая вывод тэгов и , а также пустые строки и пробелы.

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

Список параметров

Все аргументы, за исключением name , являются необязательными. Если нужно пропустить какой-либо аргумент, можно вместо него поставить пустую строку ("" ). Это не относится к аргументу expire . Так как он принимает значение типа integer, для его замены пустая строка не подходит. Используйте вместо нее ноль (0 ).

Expire

Время, когда срок действия cookie истекает. Это метка времени Unix, то есть это количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime() . time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечет с окончанием сессии (при закрытии броузера).

Замечание :

Можно заметить, что expire принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT . PHP делает внутреннее преобразование автоматически.

path

Путь к директории на сервере, из которой будут доступны cookie. Если задать "/" , cookie будут доступны во всем домене domain . Если задать "/foo/" , cookie будут доступны только из директории /foo/ и всех ее поддиректорий (например, /foo/bar/ ) домена domain . По умолчанию значением является текущая директория, в которой cookie устанавливается.

Домен, которому доступны cookie. Задание домена "www.example.com" сделает cookie доступными в поддомене www и поддоменах более высоких порядков. Cookie доступные низким уровням, таким как "example.com" , будут доступны во всех поддоменах высших уровней, с том числе "www.example.com" . Старые броузеры, следующие устаревшим нормативам » RFC 2109 , могут требовать . перед доменом, чтобы включались все поддомены.

Указывает на то, что значение cookie должно передаваться от клиента по защищенному HTTPS соединению. Если задано TRUE , cookie от клиента будет передано на сервер, только если установлено защищенное соединение. При передаче cookie от сервера клиенту следить за тем, чтобы cookie этого типа передавались по защищенному каналу, должен программист веб-сервера (стоит обратить внимание на $_SERVER["HTTPS"]).

Httponly

Если задано TRUE , cookie будут доступны только через HTTP протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS атак (несмотря на то, что поддерживается не всеми броузерами). Стоит однако же отметить, что вокруг этой возможности часто возникают споры о ее эффективности и целесообразности. Аргумент добавлен в PHP 5.2.0. Может принимать значения TRUE или FALSE .

Возвращаемые значения

Если перед вызовом функции клиенту уже передавался какой-либо вывод (тэги, пустые строки, пробелы, текст и т.п.), setcookie() вызовет отказ и вернет FALSE . Если setcookie() успешно отработает, то вернет TRUE . Это, однако, не означает, что клиентское приложение (броузер) правильно приняло и обработало cookie.

Примеры

Ниже представлено несколько примеров, как отправлять cookie:

Пример #1 Пример использования setcookie()

$value = "что-то где-то" ;

Setcookie ("TestCookie" , $value );
setcookie ("TestCookie" , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ("TestCookie" , $value , time ()+ 3600 , "/~rasmus/" , "example.com" , 1 );
?>

Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() (работает в PHP 5). Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:

// Вывести одно конкретное значение cookie
echo $_COOKIE [ "TestCookie" ];
echo $HTTP_COOKIE_VARS [ "TestCookie" ];

// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ($_COOKIE );
?>

Пример #2 Пример удаления cookie посредством setcookie()

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

// установка даты истечения срока действия на час назад
setcookie ("TestCookie" , "" , time () - 3600 );
setcookie ("TestCookie" , "" , time () - 3600 , "/~rasmus/" , "example.com" , 1 );
?>

Пример #3 setcookie() и массивы

Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:

// отправка cookie
setcookie ("cookie" , "cookiethree" );
setcookie ("cookie" , "cookietwo" );
setcookie ("cookie" , "cookieone" );

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

в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.

Замечание :

Общие замечания:

  • Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задается в параметре expire . Удобно проверять существование cookie простым вызовом print_r($_COOKIE); .
  • При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку или FALSE , а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение "deleted", а срок действия переносится на год в прошлое.
  • Так как установка значения FALSE приведет к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для FALSE и 1 для TRUE .
  • Cookie можно именовать, как массивы, и они будут доступны в PHP скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имен и значений желательно использовать функцию explode() . Не рекомендуется для этих целей использовать функцию serialize() , так как это негативно сказывается на безопасности скрипта.

При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.

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 не установлены.

Последнее обновление: 1.11.2015

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

Сохранение cookie

Для сохранения куки на компьютере пользователя используется функция setcookie() . Она имеет следующее определение:

Bool setcookie(string $name, string $value, int $expire, string $path, string $domain, bool $secure, bool $httponly);

Функция setcookie() может принимать следующие параметры:

    name: имя cookie, которое будет использоваться для доступа к его значению

    value: значение или содержимое cookie - любой алфавитно-цифровой текст не более 4 кБайт

    expire (необязательный параметр): срок действия, после которого cookie уничтожаются. Если данный параметр не установлен или равен 0, то уничтожение cookie происходит после закрытия браузера.

    path (необязательный параметр): путь к каталогу на сервере, для которого будут доступны cookie. Если задать "/", cookie будут доступны для всего сайта. Если задать, например, "/mydir/" , cookie будут доступны только из каталога /mydir/" и всех его подкаталогов. По умолчанию значением является текущий каталог, в котором устанавливаются cookie.

    domain (необязательный параметр): задает домен, для которого будут доступны cookie. Если это домен второго уровня, например, localhost.com , то cookie доступны для всего сайта localhost.com, в том числе и для его поддоменов типа blog.localhost.com .

    Если задан поддомен blog.localhost.com , то cookie доступны только внутри этого поддомена.

    secure (необязательный параметр): указывает на то, что значение cookie должно передаваться по протоколу HTTPS. Если задано true , cookie от клиента будет передано на сервер, только если установлено защищенное соединение. По умолчанию равно false .

    httponly (необязательный параметр): если равно true , cookie будут доступны только через http протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, например, JavaScript. По умолчанию параметр равен false

Сохраним cookie:

$value1 = "Сингапур"; $value2 = "китайский"; setcookie("city", $value1); setcookie("language", $value2, time()+3600); // срок действия 1 час

Здесь устанавливаются две куки: "city" и "language". Первая куки уничтожается после закрытия браузера, а вторая - через 3600 секунд, то есть через час

Получение cookie

Чтобы получить cookie, можно использовать глобальный ассоциативный массив $_COOKIE , например, $_COOKIE["city"] . Так, получим ранее сохраненные куки:

If (isset($_COOKIE["city"])) echo "Город: " . $_COOKIE["city"] . "
"; if (isset($_COOKIE["language"])) echo "Язык: " . $_COOKIE["language"];

Сохранение массивов в cookie

Сохранение в куки массивов имеет некоторые особенности. Например, сохраним следующий массив:

Setcookie("lan", "PHP"); setcookie("lan", "C#"); setcookie("lan", "Java");

Теперь получим его и выведем на страницу:

If (isset($_COOKIE["lan"])) { foreach ($_COOKIE["lan"] as $name => $value) { $name = htmlspecialchars($name); $value = htmlspecialchars($value); echo "$name. $value
"; } }

Удаление cookie

Для удаления cookie достаточно в качестве срока действия указать какое-либо время в прошлом:

Setcookie ("city", "", time() - 3600);

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

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

Для дальнейшего понимания функционирования механизма cookie в PHP вам необходимо ознакомиться со статьей "Интерпретатор PHP. Основы, принципы функционирования" , в особенности, где затрагивается понятие так называемого "первого вывода". Итак, задействовать механизм можно на этапе формирования HTTP-ответа на запрос. Для того, чтобы указать веб-клиенту сохранить у себя какой-то параметр в HTTP-ответ добавляется заголовок со значением вида name=value (имя параметра, значение параметра), например:

Set-Cookie: myname=john

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

Cookie: name=value

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

В куки можно указать время ее жизни. Для этого добавляется специальный атрибут expires следующим образом:

Set-Cookie: name=value; expires=date

Где date - дата и время, когда браузеру следует удалить данную куки, например:

Обратите внимание на формат атрибута expires.

При помощи атрибута path можно ограничить область действия куки. По умолчанию куки применяются ко всем запросам данного домена, что соответствует значению path=/ . Если, допустим, задать path=/doc/ , то куки будут применяться только к запросам к директории /doc/, а также всем ее поддиректориям и документам, например, /doc/images/. Пример с атрибутом path:

Можно также переопределить привязку к домену при помощи атрибута domain . По умолчанию куки привязывается к домену документа, запрос которого инициализировал создание куки. Если указать .domain.ru , то куки будет распространяться на запросы к домену domain.ru, а также ко всем его поддоменам. Можно ограничить действие конкретным поддоменом, например www.domain.ru. Пример с использованием атрибутов expires, path и domain:

Настало время разобраться, как работать с куки в PHP. Для установки куки существует PHP-функция setcookie:

Bool ( string $name [ , string $value [ , int $expire = 0 [ , string $path [ , string $domain [ , bool $secure = false [ , bool $httponly = false ] ] ] ] ] ] )

Большинство параметров функции необязательные. Разберемся на реальном примере (предложенная ранее страница с выбором цвета фона):

"#090" , "синий" => "#009" , "красный" => // Цвет фона по умолчанию (белый). Цвет будет взят из куки, если соответствующая куки будет существовать (реализуем позже) ?>
">
Желаемый фон:

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

"#090" , "синий" => "#009" , "красный" => "#900" ) ; $bgcolor = "#fff" ; // Цвет фона по умолчанию (белый). Цвет будет взят из куки, если соответствующая куки будет существовать (реализуем в следующем примере) //--Сохраняем значение цвета фона в куки. Подробности ниже в статье } ?>

Обработчик получает значение выбранного пользователем цвета и сохраняет его в куки при помощи PHP-функции setcookie. Функция setcookie добавит в формирующийся HTTP-ответ заголовок Set-Cookie с нашей куки. Ее, как и функцию header, можно использовать только до вывода, то есть, как можно выше в коде.

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

if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $colors ) ) { $bgcolor = [ "bgcolor" ] ; }

Все очень просто. Если вместе с запросом скрипта были отправлены какие-либо куки, PHP помещает их в глобальный массив $_COOKIE. Таким образом, работа с принятыми куки ничем не отличается от, скажем, работы с принятыми GET или POST-параметрами. Полный листинг скрипта:

"#090" , "синий" => "#009" , "красный" => "#900" ) ; $bgcolor = "#fff" ; // Цвет фона по умолчанию (белый) //--Проверяем, есть ли уже сохраненный в куки bgcolor (также проверяем на корректность, т.к. куки легко подменить) if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $colors ) ) { //--Если есть, используем сохраненное значение $bgcolor = [ "bgcolor" ] ; } //--Проверяем, был ли передан GET-параметр bgcolor и имеется ли он в нашем массиве. А то, знаете ли, могут передать мало ли чего, а нам потом расхлебывать;) if ( isset ($_GET [ "bgcolor" ] ) && in_array ($_GET [ "bgcolor" ] , $colors ) ) { $bgcolor = $_GET [ "bgcolor" ] ; //--Это будет наш новый фон для страницы ("bgcolor" , $bgcolor ) ; } ?> Возможность выбора фона страницы
">
Желаемый фон:

Вникните в работу скрипта, если есть вопросы - welcome в комментарии. Цвет фона сохраняется в так называемую временную куки , которая при закрытии браузера будет удалена. Давайте используем постоянную куки, для этого необходимо в функции setcookie определить третий параметр - время удаления куки, который будет преобразован в атрибут expires HTTP-заголовка Set-Cookie. В параметре указывается отметка времени в Unix формате. Чаще всего для формирования такой отметки используют PHP-функцию time(), которая возвращает текущее время в Unix формате, прибавляя к ней количество секунд, по истечении которых куки должна быть удалена. Например, time()+3600 - удалить куки через час. Сделаем нашу куки активной одну неделю:

("bgcolor" , $bgcolor , time () + 3600 * 24 * 7 ) ; //--Сохраняем значение цвета фона в куки

Все, теперь выбранный цвет фона сайт "помнит" даже после закрытия браузера. Кстати, чтобы удалить куки достаточно указать в качестве expire прошедшую дату, например time()-3600 . Не забывайте просматривать HTTP-заголовки при тестировании примеров.