| |
ы строками, а потому вместо пустых строк здесь нужно использовать 0.
Параметр $expire задает timestamp, который, например, может быть сформирован
функциями time() или mktime(). Параметр $secure говорит о том, что величина
Cookie может передаваться только через безопасное HTTPS-соединение (мы не будем
рассматривать в этой книге HTTPS, о нем можно написать целые тома, что, вообще
говоря, и делается). Вот несколько примеров использования SetCookie():
// Cookie на одну сессию, т. е. до закрытия браузера
SetCookie("TestCookie","Test Value");
// Эти Cookies уничтожаются браузером через 1 час после установки
SetCookie("TestCookie",$val,time()+3600);
SetCookie("TestCookie",$val,time()+3600,"/~rasmus/",".utoronto.ca",1);
После вызова функции SetCookie() только что созданный Cookie сразу появляется
среди глобальных переменных как переменная с заданным в параметре $name име-
нем. Она появится и при следующем запуске сценария — даже если SetCookie() в
нем и не будет вызвана. Параметр $value автоматически URL-кодируется при по-
сылке на сервер, а при получении Cookie — автоматически декодируется, как это
происходит и с данными формы, так что нам не нужно об этом заботиться.
И еще один пример: счетчик посещения страницы конкретным посетителем. Запуская
данный сценарий, пользователь будет видеть, сколько раз он уже гостил на вашей
странице.
Листинг 21.1. Индивидуальный счетчик посещений
if(!isSet($Counter)) $Counter=0;
$Counter++;
SetCookie("Counter",$Counter,0x7FFFFFFF);
echo "Вы запустили этот сценарий $Counter раз!";
Глава 21. Работа с WWW 293
Видите, как просто мы храним информацию о посещениях, даже если наш сайт по-
сещают миллионы человек в день? А теперь представьте себе, какой код пришлось
бы написать, чтобы сделать аналогичную программу, но с сохранением данных на
сервере...
Возможно, вам понадобится сохранять в Cookies не только строки, но и сложные
объ-
екты. Для этой цели объект нужно сначала преобразовать в строку (например, при
помощи Serialize()) и поместить ее в Cookie.
А потом, наоборот, распаковать строку, используя Unserialize().
Однако, если сохраняемый массив имеет небольшой размер, каждый его элемент
можно разместить в отдельном Cookie:
SetCookie("Arr[0]","aaa");
SetCookie("Arr[1]","bbb");
SetCookie("Arr[2][0]","ccc"); // многомерный массив
По сути, Cookie с именем Arr[0] ничем не отличается с точки зрения браузера и
сер-
вера от обычного Cookie. Зато PHP, получив Cookie с именем, содержащим квадрат-
ные скобки, поймет, что это на самом деле элемент массива, и создаст его
(массив).
Тут нет ничего удивительного — ведь PHP поступает точно так же и с переменными,
поступившими из формы пользователя... Правда, в отличие от форм, не советую вам
особо увлекаться подобными Cookies: дело в том, что в большинстве браузеров
число
Cookies, которые могут быть установлены одним сервером, ограничено, причем
огра-
ничено именно их количество, а не суммарный объем. Поэтому, наверное, лучше бу-
дет все-таки воспользоваться функцией Serialize() и установить один Cookie, а
еще лучше — написать собственную функцию сериализации, которая упаковывает
данные чуть эффективнее.
Получение Cookie
Еще кое-что о Cookies. Предположим, сценарий отработал и установил какой-то
Cookie, например, с именем Cook и значением Val. В следующий раз при запуске
этого сценария (на самом деле, и всех других сценариев, расположенных на том же
сервере в том же каталоге или ниже по дереву) ему передастся пара типа Cook=Val
(через специальную переменную окружения). PHP это событие перехватит и автома-
тически создаст переменную $Cook со значением Val. То есть интерпретатор дейст-
вует точно так же, как если бы значение нашего Cookie пришло откуда-то из формы.
Та переменная, которую мы установили в прошлый раз, будет доступна и сейчас!
SSI и функция vi
|
|