PHP обработчик html формы
В этой статье вы научитесь делать обработчик html формы на языке программирования php. Итак, для начала создадим саму форму на html:
Введите что-нибудь:
Теперь разъяснения этого кода. Думаю на счет таких тегов как
else // Если данные не переданы < echo "Данные не переданы!"; //Выводим сообщение об ошибке >?>
- Вывод пустой формы или заполненной
- Отсылка заполненной
- Проверка-валидация данных
- Если не прошли валидацию, то выводим форму с уже введёнными данными и показываем где ошибка, форма не должна разваливаться из-за текста («>tets)
- Если всё верно — сохраняем данные, при необходимости обрабатывая, дабы не было инъекций и прочей гадости при выводе данных
- Делаем редирект, дабы на f5 данные не посылались заново.
Набросаем класс формы. Он должен уметь:
- Работать в своём нэймспэйсе, пространстве имён, чтобы на одной странице можно было разместить несколько форм. Например блок логина и контактную форму. Для этого будем передавать в конструктор имя, а название полей будут в виде массива имя_формы[имя_поля]
- Заполнять поле значением по умолчанию или брать значения из переменной $_POST[имя_формы][имя_поля] . Для ручной установки значения используем хак и будем это значение совать в суперглобальную переменную $_POST. Это не совсем хорошо, но очень удобно. Получаем методы getValue и setValue .
- Проверка данных. Для этого будут методы setInvalid в который передаются имя поля и текст ошибки, isInvalid для проверки прошли ли проверку (с именем — для конкретного поля, без имени для всей формы).
- Ну и последние, но очень важные функции для проверки страница открыта просто по ссылке или же была отправлена форма — метод isPost. А для проверки какая форма была отправлена будет метод isSubmit, который проверяет наличие нашего нэмспэйса в $_POST .
Вот что у меня получилось:
name = $value; > public function getName() < return $this->name; > public function getValue($field, $default = '') < return isset($_POST[$this->getName()][$field]) ? htmlspecialchars($_POST[$this->getName()][$field], ENT_QUOTES, 'utf-8') : $default; > public function setValue($field, $value) < $_POST[$this->getName()][$field] = $value; > public function isInvalid($filed = null) < if ($filed) < return isset($this->validate[$filed]) ? ' ' . $this->validate[$filed] . '' : false; > else < return !empty($this->validate); > > public function setInvalid($field, $text = '') < $this->validate[$field] = $text; > public function isPost() < return $_SERVER['REQUEST_METHOD'] == 'POST'; >public function isSubmit() < return isset($_POST[$this->getName()]); > > ?>
Теперь необходимо соорудить непосредственно обработчик:
header('Conten-type: text/html; charset=utf-8'); require_once './lib/form.php'; $form = new Form('form'); if ($form->isSubmit()) < if (!$form->getValue('text2')) $form->setInvalid('text2', 'Заполните поле'); if (!$form->isInvalid()) < header('Location: thank.php'); >> else < $form->setValue('text', 'значение по умолчанию'); > include 'form.tpl.php';
Сперва отправили заголовок, чтобы не было проблем с кодировкой, затем подключили класс. Внимание это делается с помощью require_once , постфикс _once говорит, что подключаем файл только один раз, а require гарантирует, что в случае ошибки код не продолжится выполняться и не вылезет ещё десяток ошибок, как при include. Далее создали объект формы с именем form, проверили была ли отправлена данная форма. Если нет, то устанавливаем значение по умолчанию и выводим шаблон формы (include, так как не влечёт за собой других ошибок).
Если же форма была отправлена, то делаем проверку на заполнение поля, выставляем текст ошибки. если же не было ошибок !$form->isInvalid() , то сохраняем или что там и редиректим на thank.php .
Теперь рассмотрим сам шаблон
У формы метод post, get-ом я никогда не пользуюсь, action пуст, он отправит нас на ту же страницу, что нам и нужно, т.к. за вывод и обработку отвечает один скрипт. Имя формы берём из объекта формы. Имя полей тоже по принципу имя_формы[имя_поля], а value опять же из объекта, при этом у нас используется экранирование. После поля выводим сообщение об ошибке, если оно есть isInvalid(‘text2’)?> . И всё, легко и просто, а главное — эффективно.
Работа с формами
Одно из главнейших достоинств PHP — то, как он работает с формами HTML. Здесь основным является то, что каждый элемент формы автоматически становится доступным вашим программам на PHP. Для подробной информации об использовании форм в PHP читайте раздел Переменные из внешних источников. Вот пример формы HTML:
Пример #1 Простейшая форма HTML
В этой форме нет ничего особенного. Это обычная форма HTML без каких-либо специальных тегов. Когда пользователь заполнит форму и нажмёт кнопку отправки, будет вызвана страница action.php . В этом файле может быть что-то вроде:
Пример #2 Выводим данные формы
Пример вывода данной программы:
Здравствуйте, Сергей. Вам 30 лет.
Если не принимать во внимание куски кода с htmlspecialchars() и (int) , принцип работы данного кода должен быть прост и понятен. htmlspecialchars() обеспечивает правильную кодировку «особых» HTML-символов так, чтобы вредоносный HTML или Javascript не был вставлен на вашу страницу. Поле age, о котором нам известно, что оно должно быть число, мы можем просто преобразовать в int , что автоматически избавит нас от нежелательных символов. PHP также может сделать это автоматически с помощью модуля filter. Переменные $_POST[‘name’] и $_POST[‘age’] автоматически установлены для вас средствами PHP. Ранее мы использовали суперглобальную переменную $_SERVER , здесь же мы точно так же используем суперглобальную переменную $_POST , которая содержит все POST-данные. Заметим, что метод отправки (method) нашей формы — POST. Если бы мы использовали метод GET, то информация нашей формы была бы в суперглобальной переменной $_GET . Кроме этого, можно использовать переменную $_REQUEST , если источник данных не имеет значения. Эта переменная содержит смесь данных GET, POST, COOKIE.
В PHP можно также работать и с XForms, хотя вы найдёте работу с обычными HTML-формами довольно комфортной уже через некоторое время. Несмотря на то, что работа с XForms не для новичков, они могут показаться вам интересными. В разделе возможностей PHP у нас также есть короткое введение в обработку данных из XForms.
User Contributed Notes 3 notes
According to the HTTP specification, you should use the POST method when you’re using the form to change the state of something on the server end. For example, if a page has a form to allow users to add their own comments, like this page here, the form should use POST. If you click «Reload» or «Refresh» on a page that you reached through a POST, it’s almost always an error — you shouldn’t be posting the same comment twice — which is why these pages aren’t bookmarked or cached.
You should use the GET method when your form is, well, getting something off the server and not actually changing anything. For example, the form for a search engine should use GET, since searching a Web site should not be changing anything that the client might care about, and bookmarking or caching the results of a search-engine query is just as useful as bookmarking or caching a static HTML page.
Also, don’t ever use GET method in a form that capture passwords and other things that are meant to be hidden.