Основы языка PHP.
Приложение 6.
Работа с HTML-формами. Передача и получение данных

    В этом приложении приводятся сведения об обработке передаваемых данных.

Вплоть до версии РНР 4.2.0 при получении данных из HTML-формы не возникало никаких проблем. Например, сделаем содержание файла test.php таким, как показано в примере:

<html>
<head>
<title>Передача данных</title>
</head>
<body>
<?php
echo $txt;
?>
</body>
</html>
Как видите, в этом случае текст из поля HTML-формы не передается. Все дело в одной установке конфигурационного файла php.ini, название которой register_globals. До версии РНР 4.2.0 включительно ее значение по умолчанию было on. При такой установке в самом начале выполнения PHP-скрипта, запущенного из формы, инициализировались глобальные переменные. Однако разработчики в целях безопасности решили изменить значение по умолчанию на off - теперь передаваемые данные нужно доставать другим путем, немного сложнее прежнего или в файле php.ini переменной register_globals придать значение on.

    Сейчас разберем, как передаются параметры, если переменная register_globals равна on. Создадим HTML-документ с формой, использующей несколько типов полей. Затем напишем сценарий, который будет обрабатывать переданные параметры. Код HTML-документа будет выглядеть следующим образом:

<html>
<head>
<title>Форма данных</title>
</head>
<body>
<form action="form.php" method="GET">
Текстовое поле txt: <input type="text" name="txt"><br>
Поле ввода пароля pswd: <input type="password" name="pswd">
<br><br>
<input type="checkbox" name="var1" value="Вариант 1" checked> 
Вариант 1 (по умолчанию)
<input type="checkbox" name="var2" value="Вариант 2"> Вариант 2
<br><br>
Пол:<br>
<input type="radio" name="pol" value="male" checked> Мужчина
<input type="radio" name="pol" value="female"> Женщина
<br><br>
<textarea name="t_area" cols="20" rows="5" wrap="virtual">
Текст по умолчанию</textarea>
<br><br>
Список без возможности множественного выбора:<br>
<select name="month" size="1">
             <option value=01 selected>Январь</option>
             <option value=02>Февраль</option>
             <option value=03>Март</option>
             <option value=04>Апрель</option>
             <option value=05>Май</option>
             <option value=06>Июнь</option>
             <option value=07>Июль</option>
             <option value=08>Август</option>
             <option value=09>Сентябрь</option>
             <option value=10>Октябрь</option>
             <option value=11>Ноябрь</option>
             <option value=12>Декабрь</option>
</select>
<br>
Список с возможностью множественного выбора:<br>
<select name="month2[]" size="4" multiple="multiple">
             <option value=01 selected>Январь</option>
             <option value=02>Февраль</option>
             <option value=03>Март</option>
             <option value=04>Апрель</option>
             <option value=05>Май</option>
             <option value=06>Июнь</option>
             <option value=07>Июль</option>
             <option value=08>Август</option>
             <option value=09>Сентябрь</option>
             <option value=10>Октябрь</option>
             <option value=11>Ноябрь</option>
             <option value=12>Декабрь</option>
</select>
<br><br>
<input type="submit" name="go" value="Передать">
<input type="reset" value="Очистить"> 
</form>
</body>
</html>
Текст этой программы можно взять здесь.

    В окне браузера форма будет выглядеть следующим образом (см. рис. 1):


Рис.1. Форма в окне браузера

    Когда пользователь нажмет кнопку Передать, браузер передаст cценарию следующие параметры:

  1. txt - значение текстового поля;
  2. pswd - значения поля ввода пароля;
  3. параметры var1 и var2 будут переданы только, если соответствующие им переключатели активны (может быть передано одно из значений, оба значения или же ни одно из значений);
  4. pol - значение группы зависимых переключателей (будет передано одно из значений - male или female);
  5. t_area - содержимое текстовой области;
  6. month - значение обыкновенного списка;
  7. month2[] - значение множественного списка.

    Теперь нам нужно разобраться, как обработать все эти параметры. Параметры txt, pswd и t_area обрабатываются легко. Для каждого параметра создается переменная с соответствующим именем. То есть для параметра txt создается переменная $txt, для параметра pswd - $pswd и для t_area - $t_area. Например, для отображения значения параметра txt достаточно написать:

  echo "$txt";

    С параметрами var1 и var2 дело обстоит несколько сложнее. Если переключатели неактивны, то параметры вообще не будут переданы на сервер, как будто бы вообще их не было. Следовательно, не будет создана глобальная переменная и при попытке обращения к такой переменной, мы получим сообщение о том, что переменная не существует. Поэтому просто написать echo val1; мы не можем: нужно предварительно проверить существует ли переменная:

  if (isset($var1)) echo "var1: $var1";
  if (isset($var2)) echo "var2: $var2";

    Только после проверки существования можно начинать работу с переменной.

    Параметр pol, то есть наш зависимый переключатель, обрабатывается легко - браузер передает только одно из значений. Другими словами, параметр pol будет равен male или female. Поэтому можно просто вывести значение этого параметра:

  echo pol;.

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

    Сложнее всего обработать список с множественным выбором. Ведь в этом случае параметры передаются так:

  name=value1&name=value2&name=value3&...

    Если мы просто выведем переменную $name, то она будет содержать только последнее значение (valueN). Однако разработчики РНР позаботились об этом: множественный список можно представить в виде массива, а обработать его элементы можно с помощью цикла foreach. Нам даже не нужно знать количество переданных элементов списка. Предварительно лишь нужно сообщить РНР, что мы будем передавать массив:

  <select name="month2[]" size=4 multiple>

    Квадратные скобки - это признак массива. Обрабатывается массив так:

  foreach ($month2 as $key=>$value)
   {
   echo "$key=$value <br>";
   }

    Окончательный вид файла form.php будет выглядеть следующим образом:

<html>
<head>
<title>Обработка данных</title>
</head>
<body>
<?php
/* Проверяем, нажал ли пользователь кнопку "Поехали" (go)*/
if (!isset($go))
   {
   echo "Не указаны параметры \n";
   exit(1);
   }
else
   {
   // Начинаем обработку параметров
   echo "<b>Текстовые поля</b><br>";
   echo "txt: $txt"."<br>";
   echo "pswd: $pswd"."<br><br>";
   echo "<b>Checkbox</b><br>";
   if (isset($var1)) echo "var1: $var1";
   if (isset($var2)) echo "var2: $var2";
   echo "<br><br>";
   echo "<b>Radio</b><br>";
   echo "pol: $pol";
   echo "<br><br>";
   echo "<b>Область ввода текста</b><br>";
   echo "$t_area";
   echo "<br><br>";
   echo "<b>Список month: </b><br>";
   echo "$month";
   echo "<br><br>";
   echo "<b>Список month2: </b><br>";
   foreach ($month2 as $key=>$value)
      {
      echo "$key=$value <br>";
      }
   }
?>
</body>
</html>
Текст этой программы можно взять здесь.

    Предположим, что в текстовое поле txt мы ввели имя Денис, в поле пароля - мой_пароль, выбрали только вариант 2, установили параметр pol в значение male, заполнили текстовую область, в первом списке выбрали Январь, а во втором - первые три месяца. В результате мы получим такой вывод сценария (см. рис. 2):


Рис.2. Результат работы сценария

    Вывод сценария в особых комментариях не нуждается, кроме списков (month и month2). Как вы видите, в списке month передается не строка (Январь), а заданное значение value (01). В списке с множественным выбором выводится номер элемента (0, 1, 2) и значения элементов массива (01, 02, 03).