Обработка списка формы при помощи PHP. Теги select и option
В этой статье вы узнаете, как добавить в форму прокручиваемый список, как настроить возможность единичного, так и множественного выбора; как обрабатывать данные, полученные из списка; как проверять данные; как выполнять различные действия в зависимости от полученных данных.
Список. Один вариант выбора
Давайте рассмотрим новый термин «список» (select box), также известный, как «ниспадающий список» или «прокручиваемый список» (как его только не называют). Каждый пункт списка определяется при помощи тега option. Тег option
, как и другие элементы ввода, имеет атрибут value
, а также текст, заключенный внутри тегов option
. Это значит: когда пользователь выберет «Male»
, переменной «formGender»
($_POST['formGender']
) будет присвоено значение «M»
.
HTML
<p>
What is your Gender?
<select name="formGender">
<option value="">Select...</option>
<option value="M">Male</option>
<option value="F">Female</option>
</select>
</p>
Выбранное пользователем значение можно узнать при помощи стандартного массива $_POST
, также как обычное текстовое поле ввода.
PHP
<?php
if(isset($_POST['formSubmit']) )
{
$varMovie = $_POST['formMovie'];
$varName = $_POST['formName'];
$varGender = $_POST['formGender'];
$errorMessage = "";
// - - - и т.д. - - -
}
?>
Всегда хорошо делать первую строку в списке пустой. Это побуждает пользователя сделать выбор и позволяет определить, выбрал ли пользователь что-нибудь из списка. Конечно, потребуется проверка:
PHP
<?php
if(!isset($_POST['formGender']))
{
$errorMessage .= "<li>You forgot to select your Gender!</li>";
}
?>
Список. Выбираем несколько вариантов
Предположим, вы захотите создать список, которые предоставит пользователю возможность выбрать несколько вариантов.
Ниже представлена HTML разметка:
HTML
<label for='formCountries[]'>
Select the countries that you have visited:
</label><br>
<select multiple="multiple" name="formCountries[]">
<option value="US">United States</option>
<option value="UK">United Kingdom</option>
<option value="France">France</option>
<option value="Mexico">Mexico</option>
<option value="Russia">Russia</option>
<option value="Japan">Japan</option>
</select>
Отметьте схожесть с группой флажков. Для начала установите атрибут multiple=«multiple»
в теге select
. Во-вторых, поместите квадратные скобки в конец значения атрибута name
. Сейчас нет необходимости делать первый вариант выбора в списке пустым, так как мы просто проверим, выбрал ли пользователь что-нибудь или нет. Чтобы выбрать несколько значений, используйте при кликах клавиши shift
и ctrl
.
PHP код для обработки данного списка очень схож с php кодом для обработки группы флажков. $_POST['formCountries']
возвратит массив из выбранных пользователем значений.
PHP
<?php
if(isset($_POST['formSubmit']))
{
$aCountries = $_POST['formCountries'];
if(!isset($aCountries))
{
echo("<p>You didn't select any countries!</p>\n");
}
else
{
$nCountries = count($aCountries);
echo("<p>You selected $nCountries countries: ");
for($i=0; $i < $nCountries; $i++)
{
echo($aCountries[$i] . " ");
}
echo("</p>");
}
}
?>
Как обычно, используем isset
, чтобы убедиться в том, что пользователь выбрал хоть что-нибудь.
Используем конструкцию switch
Сейчас давайте опять вернемся к списку, в котором присутствует всего один вариант выбора. Наша задача сделать так, чтобы каждому варианту выбора соответствовало строго определенное действие. Конечно, можно использовать инструкцию if
, однако она в данном случае способна загрязнить код. Давайте рассмотрим два пути: динамические команды и инструкцию switch
.
PHP
<?php
if(isset($_POST['formSubmit']))
{
$varCountry = $_POST['formCountry'];
$errorMessage = "";
if(empty($varCountry))
{
$errorMessage = "<li>You forgot to select a country!</li>";
}
if($errorMessage != "")
{
echo("<p>There was an error with your form:</p>\n");
echo("<ul>" . $errorMessage . "</ul>\n");
}
else
{
// оба метода не мгут работать одновременно
// закомментируйте тот метод, который вам не требуется
// метод 1: switch
$redir = "US.html";
switch($varCountry)
{
case "US": $redir = "US.html"; break;
case "UK": $redir = "UK.html"; break;
case "France": $redir = "France.html"; break;
case "Mexico": $redir = "Mexico.html"; break;
case "Russia": $redir = "Russia.html"; break;
case "Japan": $redir = "Japan.html"; break;
default: echo("Error!"); exit(); break;
}
echo " redirecting to: $redir ";
// header("Location: $redir");
// окончание метода 1
// метод 2: динамический редирект (переадрессация)
//header("Location: " . $varCountry . ".html");
// окончание метода 2
exit();
}
}
?>
У каждого из этих двух подходов есть свои плюсы и минусы. Метод основанный на switch
'е в сущности есть ни что иное, как лаконичная запись ряда конструкций «if»
. После ключевого слова case перечисляются возможные варианты значений. В случае совпадения результата вычисления выражения (значение переменной $varCountry
) с каким-либо значением, произойдут действия, записанные далее, вплоть до конструкции break
. В нашем случае произойдет переадресация к соответствующей для каждой страны странице. Если ни одна страна найдена не будет, то выведется сообщение "Error"
, стоящее за ключевым словом default
.
Второй метод заключается в передаче выбранного значения функции header
, которая перенаправит пользователя к корректной странице.
Первый метод требует написания большего объема кода, но он и более безопасен, так как он позволяет посредством формы переадресовать пользователя к заранее запрограммированным вариантам, при отсутствии варианта выбора будет выведено сообщение об ошибке и выполнение сценария будет прекращено.
Второй метод более краткий (значительно), зато его безопасность сильно снижена. Так любой пользователь может делать с формой, что хочет, и вводить любое значение, какое пожелает. При использовании второго метода сначала желательно проверить выбранные страны, чтобы застраховать себя от переадресации к «вредной» странице.
По материалам. Надеюсь хоть кому-то поможет)
Комментарии к статье
Спасибо, помогло.
Неплохо было посмотреть пример кода формы по выбору даты с числом, месяцем и годом в отдельных диалоговых окнах, чтобы при выборе даты пользователем и нажатии кнопки Submit в окнах оставалась введенная дата при возвращении на страничку, а до нажатия кнопки стояла бы текущая дата по default.
Но все равно спасибо за полезную информацию в представленном контексте.
!!! Просто, доходчиво, подробно !!! СПАСИБО !!!
Почти, от Select к php понятно, вернуть селекту из базы значение и присвоить ему selected? :) ?
Спасибо! Помогло разобраться!