Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
php_vvedenie.doc
Скачиваний:
7
Добавлен:
16.09.2019
Размер:
121.34 Кб
Скачать

Обработка формы

Теперь рассмотрим функцию process_form() обработки формы после ввода ответов пользователем.

<?php function process_form() {   global $name;   global $cheese;   global $times;

  if ($cheese == 'brie') { $cheese_message = 'I love brie.'; }   elseif ($cheese == 'cheddar') { $cheese_message = 'Cheddar is awesome!'; }   else { $cheese_message = 'Fresh mozzarella is divine.'; }

  $favorite_times = count($times);

  if ($favorite_times <= 1) {     $times_message = 'You should eat cheese more often.';   } elseif ($favorite_times > 1 && $favorite_times < 4) {   $times_message = 'Those are good times to eat cheese.';   } else {     $times_message = 'You are eating too much cheese.';   }

  echo "Hello $name.";   echo "$cheese_message $times_message"; }

?>

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

Далее используется функция count() для того, чтобы подсчитать, сколько раз в день ест сыр человек, ответивший на наши вопросы. Если в предыдущем случае мы должны были сравнить ответ посетителя с каждым из возможных значений переменной $cheese, то при анализе значений переменной $favorite_times можно воспользоваться операциями сравнения "меньше чем" и "больше чем". Знаки && в условном операторе "$favorite_times > 1 && $favorite_times < 4" означают логическую операцию "И" ("and"). То есть $favorite_times должно одновременно быть больше 1 и меньше 4 для того, чтобы условие было выполнено.

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

Организуем вывод формы

Теперь, когда мы имеем эти две функции, остается добавить только маленький кусочек кода для того, чтобы вызвать их в нужной последовательности. Итак, после (или ниже) записи тела функций display_form() и process_form() добавляем:

<?php

if (empty($stage)) { display_form(); } else { process_form(); }

?>

Здесь мы вначале проверяем, задано ли какое-либо значение переменной $stage. В PHP переменная считается пустой (empty), если ее значение не задано явно (то есть ей никогда не придаются значения по-умолчанию), или ей задано пустое значение (переменной присвоено значение пусто, если она приравнена пустой строке - '', или ей присвоено значение 0). Когда посетитель впервые попадает на нашу страницу, переменная $stage пуста. Поэтому на страницу будет выводиться форма с нашими вопросами; в противном случае мы должны обработать заполненную форму.

И это все, что мы хотели сказать об обработке простых форм с помощью PHP.

Многостраничные формы

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

К сожалению, протокол HTTP не имеет встроенных механизмов переноса данных с одной страницы на другую, поскольку в нем не определено понятие серии страниц. К счастью, с помощью нескольких хитрых трюков и ряда удобных встроенных функций языка PHP мы можем обойти это ограничение без больших затруднений. Основная идея очень проста - мы сохраняем в скрытых переменных все значения, введенные посетителем в поля формы на предыдущей странице(ах) и используем их затем на последующих страницах. Таким образом, нужная информация сохраняется при переходе со страницы на страницу. Реализация этой идеи - самое первое (хотя, возможно, и не самое лучшее) решение поставленной задачи, но это самый простой способ, и он не требует использования баз данных или cookies.

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

Для удобства вернемся к примеру формы, который мы рассматривали выше. Но на этот раз, нашу страницу с животрепещущими вопросами о любимых сортах сыра разобьем на две страницы.

В результате мы будем иметь три функции вместо двух. В дополнение немного изменим их названия, чтобы они соответствовали изменившемуся содержанию. Функция display_form() теперь будет называться display_name().

<?php function display_name() {  global $PHP_SELF;

?> <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET> Name: <INPUT TYPE=TEXT NAME="name"><BR> <INPUT TYPE=HIDDEN NAME="stage" VALUE="cheese"> <INPUT TYPE=SUBMIT VALUE="Thanks!"> </FORM> <?php } ?>

Она идентична ранее введенной функции за тем исключением, что мы удалили все вопросы, кроме первого, и изменили название следующего этапа на "cheese", чтобы дать более точное указание на то, что будет делаться на следующем этапе.

Далее идет функция display_cheese().

<?php function display_cheese() {   global $PHP_SELF;   global $name;

?> <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET> Ваш любимый сорт сыра:                  <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie                  <INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar                  <INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella

Когда Вы предпочитаете есть сыр:                  <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">на завтрак                  <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">на обед                  <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">на ужин                  <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">поздно ночью

<INPUT TYPE=HIDDEN NAME="name" VALUE="<?php echo htmlspecialchars($name); ?>"> <INPUT TYPE=HIDDEN NAME="stage" VALUE="results"> <INPUT TYPE=SUBMIT VALUE="Thanks!"> </FORM> <?php } ?>

Этот код вам тоже уже знаком. Тут не никаких неожиданных изменений по сравнению с предыдущим вариантом. Просто, перед тем как изменить значение скрытой переменной, используемой для определения этапа перемещения по нашим страницам, мы еще запоминаем имя и значение переменной $name, то есть ту часть информации, которая была получена на предыдущем этапе. При этом мы не просто напрямую передаем это значение, а пропускаем его через функцию PHP, которая называется htmlspecialchars(). Стандарт HTML определяет четыре символа, которые не могут использоваться в других целях, кроме как в тегах для разметки документов : <, >, ", и &. По этой причине, для того чтобы убедиться, что мы не поставим браузер пользователя в затруднительное положение, мы пропускаем $name через функцию htmlspecialchars(), чтобы некто, имеющий имя "Bret & Jeff", так и остался "Brett & Jeff."

Теперь, когда передается информация, введенная в эту форму, мы не потеряем ни одной части этой информации.

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

<?php if (empty($stage)) { display_name(); } elseif ($stage == 'cheese') { display_cheese(); } else { process_form(); } ?>

Что мы видим? Все, что мы сделали, - добавили elseif в серединку между двумя предыдущими операторами. В этом прелесть использования переменной $stage. Если мы хотим добавить дополнительные страницы, нам нужно только написать новые функции для отображения того, что мы хотим, и еще по одной строке в оператор управления в соответствии с тем, когда эти страницы должны быть отображены.

Cookies

Примечания переводчика: 1) если Вы плохо представляете себе, что такое cookie, прочитайте очень хороший материал на эту тему "Что такое cookies и как с ними работать" Андрея Аликберова (http://www.citforum.ru/internet/html/cookie.shtml) 2) я не знаю русского эквивалента термину cookie (так же как и А.Аликберов), так что в тексте этот термин оставлен в английской транслитерации.

Установка и считывание cookies в PHP - это, можно сказать, подарок судьбы! Мы не хотим заниматься здесь агитацией в пользу cookie, но нельзя не сказать, что это очень удобный инструмент.

Для создания и модификации значения cookie используется функция PHP setcookie(). Функция setcookie() воспринимает до шести аргументов, в зависимости от того, как Вы собираетесь управлять значениями cookie и кто будет считывать ее значения.

Простейший способ установить cookie таков:

setcookie('name', 'bret');

Затем, для каждой последующей страницы на Вашем сайте, просматриваемой в течение данной сессии (пока пользователь не покинет сайт) переменная $name будет иметь значение 'bret' и его можно легко прочитать средствами PHP. Этот тип cookie известен как cookie-сессия, поскольку значение сохраняется в течение пользовательской сессии.

Если Вы хотите, чтобы значение cookie запоминалось браузером после того, как пользователь закончит сессию, Вы должны передать функции setcookie() третий параметр - дату истечения срока действия cookie. Поскольку PHP сформировался в основном в среде Unix, Вы должны представить время истечения срока действия cookie как число секунд, прошедших с 1 января 1970 г. Если Вы имеете опыт программирования для Unix, это не покажется Вам удивительным. Но, если Вы программировали только в среде Windows или Macintosh, Вы, может быть, удивитесь, что за чокнутый народ эти Unix-оиды.

Но не бойтесь. PHP имеет очень удобную функцию, mktime(). Вы указываете ей в качестве параметров (в указанном порядке) час, минуту, секунду, месяц, день и год, задающие тот момент времени, который Вы хотите представить в воспринимаемом UNIX формате, и mktime() возвращает Вам число секунд, прошедших с 1 января 1970 г. до указанного момента времени. Например, если Вы хотите, чтобы срок действия cookie истек 1 января 2000 г., Вы записываете:

<?php $y2k = mktime(0,0,0,1,1,2000); setcookie('name', 'bret', $y2k); ?>

Если Вы хотите изменить значение cookie на новое, Вы можете просто переписать его (ее?) значение. Таким образом, даже если браузер уже посылал значение cookie серверу на одной из предыдущих страниц, вполне возможно сообщить серверу, что в действительности Вас зовут "jeff."

<?php $y2k = mktime(0,0,0,1,1,2000); setcookie('name', 'jeff', $y2k); ?>

Обратите внимание на то, что при этом не меняется значение переменной $name. Оно устанавливается при загрузке страницы. Если Вы хотите чтобы значение переменной изменялось синхронно с изменением значения cookie, Вы должны изменить код следующим образом:

<?php $name = 'jeff'; $y2k = mktime(0,0,0,1,1,2000); setcookie('name', $name, $y2k); ?>

Следующие два параметра функции setcookie() позволяют Вам задать путь и имя домена того, кто может прочитать значение Вашего cookie. По умолчанию только страницы, расположенные в том же каталоге или ниже в структуре подкаталогов того сервера, который установил cookie, могут прочитать его (ее??) значение. Это делается из соображений безопасности. Однако, если у Вашего сервера два доменных имени: "www.domain.com" и "other.domain.com", и Ваш экаунт позволяет Вам обслуживать страницы из каталога ~/myhome, Вы должны вызывать функцию setcookie() следующим образом:

<?php setcookie('name', 'jeff', $y2k, '~/myhome', '.domain.com'); ?>

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

Удалить cookie тоже очень просто, достаточно передать функции setcookie() имя cookie и PHP сделает все остальное:

<?php setcookie('name'); ?>

В заключение нужно сделать еще одно замечание, касающееся использования cookie. В силу того, как организована обработка cookies в протоколе HTTP, необходимо установить значения всех cookie до вывода какого-либо текста. Если сделать наоборот, PHP выдаст Вам предупреждение и значение cookie не будет послано. Вот так правильно:

<?php setcookie('name', 'jeff'); echo "Hello Everyone!"; ?>

А так - нет:

<?php echo "Hello Everyone!"; setcookie('name', 'jeff'); ?>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]