Как вывести ошибки при заполнении html формы
Индекс материала |
---|
Как вывести ошибки при заполнении html формы |
Как вывести ошибки при заполнении html формы стр.2 |
Все страницы |
Когда возникает проблема с данными, введенными в html форму, генерируемую PHP скриптом необходимо вывести сообщения об ошибках причём желательно это сделать рядом с проблемными полями, вместо генерации сообщения об ошибке в начале формы. Также по-правильному нужно сохранить значения, которые пользователь напечатал в html форме. Иначе вы рискуете отбить охоту регистрироваться у вас на сайте, предлагая пользователю по десять раз вводить одно и тоже.
Один из вариантов это сделать сохранить сообщения в массиве $errors, индексируя их по именам полей.
if (!pc_validate_zipcode($_REQUEST['zipcode'])) { $errors['zipcode'] = 'This is is a bad ZIP Code. ZIP Codes must have 5 numbers and no letters.'; }
При повторном выводе html формы, если при вводе пользователь где то накосячил, можно показывать каждую ошибку с помощью поля, помещая в него исходное значение:
echo $errors['zipcode'];
$value = isset($_REQUEST['zipcode']) ? htmlentities($_REQUEST['zipcode']) : '';
echo "<input type=\"text\" name=\"zipcode\" value=\"$value\">";
Если пользователи сталкиваются с ошибками при заполнении длинной html формы, то можно повысить общее удобство и простоту использования html формы, четко выделяя место, где нужно исправить ошибки. Объединение всех ошибок в одном массиве дает много преимуществ.
Прежде всего, нетрудно определить, нашлись ли в результате проверки на достоверность информации какие-либо элементы, требующие исправления; просто используйте PHP функцию count($errors). Если она вернёт число отличное от нуля, то значит есть проблемы.
Использовать такой метод проще, чем следить за этим событием с помощью отдельной переменной, особенно, если поток или PHP скрипт сложный или реализуется с помощью множества функций. В примере ниже показана функция проверки на правильность pc_validate_form(), которая использует массив $errors.
function pc_validate_form() { if (! pc_validate_zipcode($_POST['zipcode'])) { $errors['zipcode'] = "ZIP Codes are 5 numbers"; } if (! pc_validate_email($_POST['email'])) { $errors['email'] = "Email addresses not correct!"; } return $errors; }
Это удобный код, поскольку все ошибки сохраняются в одной переменной. Переменную можно легко передать куда угодно, если вы не хотите, чтобы она находилась в глобальной области видимости. Использование имени переменной в качестве ключа сохраняет связи между полем, которое явилось причиной ошибки, и самим сообщением об ошибке. Эти связи также облегчают выполнение цикла по элементам при показе ошибок. Можно автоматизировать скучную задачу вывода html формы.
Функция pc_print_form() в примере ниже показывает, как это сделать.
function pc_print_form($errors) { $fields = array('name' => 'Name','rank' => 'Rank','serial' => 'Serial'); if (count($errors)) { echo 'Please correct the errors in the form below.'; } echo '<table>'; // выводим ошибки и переменные формы foreach ($fields as $field => $field_name) { // открываем строку echo '<tr><td>'; // печатаем ошибку if (!empty($errors[$field])) { echo $errors[$field]; } else { echo ' '; // чтобы не портить внешний вид таблиц } echo '</td><td>'; // печатаем имя и введенную информацию $value = isset($_REQUEST[$field]) ? htmlentities($_REQUEST[$field]) : ''; echo $field_name.':'; echo '<input type=\"text\" name=\"$field\" value=\"$value\" />'; echo '</td></tr>'; } echo '</table>'; }
Сложная часть функции pc_print_form() начинается с массива $fields. Ключ – это имя переменной; значением является подходящее для показа имя поля. Определив их в начале функции, можно создать цикл по значениям с помощью оператора PHP foreach; иначе понадобятся три отдельные строки с идентичным кодом. К этому добавляется использование имени переменной в качестве ключа в массиве $errors, поскольку можно найти сообщение об ошибке внутри цикла, просто проверяя элемент $errors[$field].
Если необходимо распространить этот пример на поля ввода, отличные от text, модифицируйте массив $fields, включив дополнительную метаинформацию о типах полей html формы:
$fields = array( 'name' => array('name' => 'Name', 'type' => 'text'), 'rank' => array('name' => 'Rank', 'type' => 'password'), 'serial' => array('name' => 'Serial', 'type' => 'hidden') );
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.