Поиск

Создание и чтение cookie

Самое важное, что необходимо понять о cookies, это то, что они посылаются сервером до отправки какойлибо другой информации. Если сервер отправля ет cookie после того, как браузер уже начал получать HTMLстраницу, хотя бы простой пробел, то будет сгенерировано сообщение об ошибке и cookie послан не будет (рис. 12.2). На сегодняшний день это самая распространенная ошибка при работе с описываемым инструментом.

Cookie посылаются с помощью функции setcookie ( ) :
setcookie("name","value");

Эта строка кода пошлет cookie в браузер с именем name и значением value (рис.12.3).

Несколько cookie разрешается отправлять в браузер с помощью функции setcookie ( ) , однако Webпротоколы не позволяют посылать более 20 cookie с одного сервера одному пользователю:

setcookie("name2","value2");
setcookie("патеЗ","value3");


Извлечь значение из cookie можно, обратившись к имени cookie как к пере менной (знак доллара, затем имя), точно так же, как мы обращаемся к элементу HTMLформы как к переменной на странице обработки. Например, для извле чения значения cookie, созданного строкой setcookie ("UserName", "Larry") ;, используется переменная $UserName.

Для примера создания cookie мы напишем сценарий, который позволит пользователю задавать цвета_ текста и фона страницы.
Отправка и извлечение cookie в РНР

  1. Создайте новый PHPдокумент в текстовом редакторе, начав Со стандарт ного открывающего РНРтэга.
  2. <?php
  3. Напишите условную инструкцию, которая отправит cookie, как только форма будет передана. if ($BeenSubmitted) { Как и раньше, переменная $BeenSubmitted будет использоваться для опре деления того, была ли передана форма. Если значение истинно, РНР обработа ет форму.
  4. Задайте cookie, а затем цвета для страницы. setcookie("BGColor", "$NewBGColor");
    setcookie("TextColor", "$NewTextColor");
    $BGColor = $NewBGColor;
    $TextColor = $NewTextColor;
    Если форма передана, тэг РНР отправит две переменных cookie со значени ями цвета текста и фона. Сценарий заменит текущие значения (переменные BGColor и TextColor) на выбранные (NewBUColor и NewTextColor), моменталь но отразив эти изменения.
  5. Допишите условную конструкцию. } else {
    if (!$BGColor) {
    $BGColor = "WHITE";
    if (!$TextColor) {
    $TextColor = "BLACK";
    Если форма не была передана, PHP присвоит переменным значения по умолчанию.
  6. Закройте первый PHPраздел и создайте HTMLзаголовок.
  7. ?>
    <HEAD>
    <TITLE>User Custom!zation</TITLE>
    </HEAD>
  8. L Вставьте еще один PHPраздел для печати тэга <BODY> с соответствующи ми значениями цвета фона и текста.
  9. <?php
    print ("<BODY BGCOLOR=$BGColpr TEXT=$TextColor>\n");
    ?>
  10. Напечатайте простое предложение, которое покажет цвет текста.
  11. Currently your page looks like this!
  12. Создайте HTMLформу, которая будет вызывать сама себя!
  13. <FORM ACTION="cookies.php" METHOD=POST>

    Для имени сценария все же удобнее использовать значение встроенной пе ременной $PHP_SELF, которая всегда содержит это имя.

  14. Создайте два ниспадающих меню, в которых пользователь сможет вы брать цвет фона и текста.
  15. Select a new background color:
    <SELECT NAME="NewBGColor">
    <OPTION VALUE=WHITE>WHITE</OPTION>
    «DPTION VALUE=BLACK>BLACK</OPTION>
    «DPTION VALUE=BLUE>BLUE</OPTION>
    <OPTION VALUE=RED>RED</OPTION>
    <OPTION VALUE=GREEN>GREEN</OPTION>
    </SELECT>
    Select a new text color:
    <SELECT NAME="NewTextColor">
    <OPTION VALUE=WHITE>WHITE</OPTION>
    <OPTION VALUE=BLACK>BLACK</OPTION>
    <OPTION VALUE=BLUE>BLUE</OPTI0N>
    <OPTION VALUE=RED>RED</OPTION>
    <OPTION VALUE=GREEN>GREEN</OPTION>
    </SELECT>

    Каждое ниспадающее меню имеет 5 опций, представленных в виде слов. При желании в эти меню можно добавить другие цвета. Набор цветов ограни чен только палитрой HTML.

  16. Задайте скрытую переменную, которая будет показывать, передана ли форма.
  17. <INPUT TYPE=HIDDEN NAME=BeenSubmitted VALUE=TRUE>

    Эта переменная сообщает сценарию, что пользователь уже сделал свой выбор.

  18. Создайте кнопку Submit, закройте форму и HTMLстраницу.
  19. <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!">
    </FORM>
    </BODY>
    </HTML>
  20. Сохраните сценарий как cookies.php (листинг 12.1), загрузите его на сер вер и протестируйте в браузере (рис. 12.412.8).
    Листинг 12.1 т Две переменных cookie используются для хранения инфор мации о выбранных пользователем цветах фона и текста. Переданные из фор мы значения будут присвоены переменным на странице, чтобы требуемые из менения произошли немедленно.
  21. 1 <?php
    2 if ($BeenSubmitted) {
    3 setcookie("BGColor", "$NewBGColor");
    4 eetcookie("TextColor", "$NewTextColor");
    5 $BGColor = $NewBGColor;
    6 $TextColor = $NewTextColor;
    7 } else {
    8 if (!$BGColor) {
    9 $BGColor = "WHITE";
    10 }
    11 if (!$TextColor) {
    12 $TextColor = "BLACK";
    13 }
    14 }
    15 ?>
    16 <HEAD>
    17 <TITLE>User Customization</TITLE>
    18 </HEAD>
    19 <?php
    20 print ("<BODY BGCOLOR=$BGColor TEXT=$TextColor>\n");
    21 ?>
    22 Currently your page looks like this!
    23 <FORM ACTION="cookies.php" METHOD=POST>
    24 Select a new background color:
    25 <SELECT NAME="NewBGColor">
    26 <OPTION VALUE=WHITE>WHITE</OPTION>
    27<OPTION VALUE=BLACK^BLACK</OPTION>
    28«DPTION VALUE=BLUE>BLUE</OPTION>
    29<OPTION VALUE=RED>RED</OPTION>
    30<OPTION VALUE=GREEN>GREEN</OPTION>
    31</SELECT>
    32 Select a new text color:
    33 <SELECT NAME="NewTextColor">
    34<OPTION VALUE=WHITE>WHITE</QPTION>
    35 <OPTION VALUE=BLACK>BLACK</OPTION>
    36 <OPTION VALUE=BLUE>BLUE</OPTION>
    37 <OPTION VALUE=RED>RED</OPTION>
    38<OPTION VALUE=GREEN>GREEN</OPTION>
    39 </SELECT>
    40 <INPUT TYPE=HIDDEN NAME=BeenSubmitted VALUE=TRUE>
    41 <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!">
    42 </FORM>
    43 </BODY>
    44 </HTML>
    Значение cookie автоматически кодируется с помощью переменной urlencode () при отправке и декодируется при поступлении в PHPстраницу. То же самое про исходит со значениями, посылаемыми HTMLформами.




    Важно помнить, что значения cookie будут всегда иметь приоритет перед значе ниями, отправляемыми формой. В сценарии cookies.php, например, могут возник нуть проблемы, если в форме использовать имена полей BGColor и TextColor, поскольку они будут переписаны значениями cookie с такими же именами.