Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

9.8. HTTP-Cookies

РНР поддерживает Cookies HTTP, как определено в соответствии с спецификацией Netscape. Cookies — механизм для накапливания данных в отдаленной программе просмотра, помогающий производить идентификацию возвращающихся пользователей. Вы можете устанавливать Cookies при помощи функции setcookie(). Cookies — часть HTTP, поэтому функция setcookie должна быть вызвана прежде, чем любой запрос послан программе просмотра (браузеру). Такое же ограничение касается функции header(). Любые Cookies, посланные вам от клиента, будут автоматически преобразовываться в PHP-переменную точно также, какданные Get и Post метода.

Передавать данные скрипту можно не только посредством параметров в URLmin в полях формы. Практически все современные браузеры понимают Cookies. В РНР вы можете пользоваться ими совершенно свободно. Когда браузер отдает Cookies вашему скрипту, вы просто получаете переменную с именем Cookies. Отдать же Cookies браузеру вы можете функцией

setcookie("имя","значение",[необязательные параметры]);

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


ВНИМАНИЕ

Если вы желаете назначить multiple-переменные к одиночному Cookies, просто добавьте [] к названию Cookies. Например:

setcookie ("MyCookie[]", "Testing", time()+3600);

СОВЕТ

Если у вас возникнет необходимость сделать так, чтобы Cookies сохранялся у клиента какое-то время, необходимо просто задать Cookies время действия (укажешь им январь 3000 года, и будут Cookies тысячу лет «болтаться»).


При помощи Cookies PHP позволяет хранить в браузере клиента информацию. Для этого реализован механизм Cookies-массива. Например, после выполнения такого фрагмента кода:

<?

$myData['id']=2345;

$myData['name'] = 'Петя';

$myDate['email'] = 'mynew@domainname.ru';

setcookie('myData[]', $myData);

?>

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


СОВЕТ

Не храните в Cookies текст на русском языке или двоичную информацию, лучше предварительно закодируйте ее с помощью функции rawurlencode().


Если же вам очень хочется завести о пользователе целую уйму персональных данных, а делать это при помощи Cookies неудобно, то вам стоит выбрать одну из схем «ведения пользователя». Их существует множество — это и модули к Web-серверу, и отдельные библиотеки к РНР, и множество готовых функций или классов, написанных на самом РНР. Вы легко можете сделать и свою систему ведения. Приведем пример. Включив этот файл в начало любого скрипта, вы можете вести пользователей, сохраняя информацию о пользователе в течение года.

Пример 9.6. HTTP-Cookies

<?

Function userTrack () {

Global $mySesID;

$db = dbmopen('/путь/userTrack.db'r 'c');

if (! (isset ($mySesID)&&dbmfetch ($mySesID) ) )

{

    $mySesID = uniqid();

    dbminsert ($mySesID, userTrackNew() );

    setcookie ( 'mySesID', $mySesID, time() + 60*60*24*365);

}

dbmclose($db);

$tmp = spit(<<'\t>>, dbmfetch ($mySesID) );

$user = array() ;

for ($i=0; $i<count($tmp) ; $i++)

{

    list($x,$y)=split('=', $tmp[$i]);

    $user[$x]=$y;

}

return $user;

}

?>

Подробно опишем программу и поясним, для чего нужна та или иная строка. function userTrack () { — задает функцию с именем userTrack. Чтобы можно было использовать переменные в функции строкой Global $mySeslD;, объявляется переменная, в которой будут храниться данные Cookies. Также требуется открыть хэш-базу, в нашей программе это делается строкой $db = dbmopen (/путь/userTrack.db', 'с');. Постарайтесь указать путь как можно точнее, неправильное задание пути — это одна из распространенных ошибок при программировании у начинающих. Далее идет оператор условия if — (см. П. 13.7) — строка if (! (isset (SmySesID)&&dbmfetch (SmySesID) ) ); { — позволяет определять присутствие Cookies в хэш-базе, т. е. если Cookies нет в базе, то вносятся новые. $mySesID = uniqid() ; — задается новый уникальный идентификатор. Он и данные по умолчанию добавляются при помощи операции: dbminsert ($mySesID, user TrackNew () );. После этого функцией setcookie() устанавливаются Cookies на год: setcookie ( 'mySesID' , $mySesID, time () +60*60*24*365);, время как год устанавливается в секундах именно строкой time 0+60*60*24*365. Вы можете изменять время на необходимое вам. После этой операции, которая реализуется при положительном исходе оператора if, завершается работа с ним. В самой функции определяется пустой массив: $user = array ();. Далее данные необходимо перевести в хэш:

for($i=0; $i<count($tmp);$i++) {

    list{$x,$y) = split('=', $tmp[$i]);

    $user[$x]=$y;

}

return $user; //— возвращает значения.

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

<?

include ('userTrack.inc');

function userTrackNew()

{

    return "id=5\tname=Cepreй\tcolor=white";

}

$userinfo = userTrack() ; // получаем данные о пользователе

?>

В результате получим хэш-массив со всеми заданными нами настройками посетителя. Базы данных dbm* работают очень быстро, не требуют больших ресурсов и пользоваться ими можно и нужно.


СОВЕТ

Для хранения данных можно использовать СУБД (см. гл. 32), но при небольшом объеме данных это нерационально. Применение SQL СУБД оправданно, если большая часть ваших страниц также формируется из базы данных. Сейчас очень модно применять SQL-серверы везде, где надо и где не надо. На SQL-базах делают даже чаты. При небольших объемах данных все же следует использовать простые средства: текстовые файлы, хэш-базы (dbm*) и т. д.


<< Предыдущий параграф Следующий параграф >>
Оглавление