PHP обработчик html формы

Программирование Веб программирование PHP обработчик html формы

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 год, 6 мес. назад.

  • Автор
    Сообщения
  • #3678

    В этой статье вы научитесь делать обработчик html формы на языке программирования php. Итак, для начала создадим саму форму на html:

    <html>
    <title>Обработчик формы</title>
    <head>
    </head>
    <body>
    <form action="forma.php" method="POST">
    Введите что-нибудь: <br>
    <input type="text" name="myname">
    <input type="submit" value="Отправить данные">
    </form>
    </body>
    </html>

    Теперь разъяснения этого кода. Думаю на счет таких тегов как <title>, <body>, <head> и так все понятно, так что перейдем сразу к форме.

    Здесь мы пишем тег <form action="forma.php" method="POST"> , который указывает, что форма будет обрабатываться скриптом forma.php и передаваться данные будут методом POST (что такое POST и GET). Дальше мы создаем поле ввода текста и даем ей имя myname вот этой строкой:

    <input type="text" name="myname">

    Затем создаем кнопку, при нажатии на которую, данные из формы будут переданы скрипту forma.php.

    Теперь перейдем к скрипту обработчику forma.php. Здесь такой код:

    <?php
    if(isset($_POST['myname'])) //Если есть данные
    {
      $text=$_POST['myname']; // Записываем их в переменную $text
      echo $text; // Выводим переменную на экран
    }
    else // Если данные не переданы
    {
      echo "Данные не переданы!"; //Выводим сообщение об ошибке
    }
    ?>

    $_POST[‘myname’]
    – здесь хранится информация, которую мы ввели на странице html в поле ввода текста с именем myname.

    Вот и все, теперь вы можете делать html форму и писать к ней скрипты обработчики, которые будут оперировать с данными. К примеру, можно отправить сообщение на электронную почту, а если запустить цикл то и зафлудить.

    Дополнение (другими словами):

    Когда новички спрашивают что бы им написать посерьёзнее, обычно советуют гостевую книгу. Вариант хороший, в нём много разных путей реализации, можно повесить авторизацию, работу с деревьями, но самое главное — формы. Самое удивительное, что я встречал огромное количество (количество пишется с одним «л», когда уже избавлюсь от этой ошибки) «профессионалов», которые так и не научились делать удобные формы. Совет заказчикам при оценке партфолио всегда проверяйте форму обратной связи или регистрации-авторизации.

    Жизнь формы:

    • Вывод пустой формы или заполненной
    • Отсылка заполненной
    • Проверка-валидация данных
    • Если не прошли валидацию, то выводим форму с уже введёнными данными и показываем где ошибка, форма не должна разваливаться из-за текста («>tets)
    • Если всё верно — сохраняем данные, при необходимости обрабатывая, дабы не было инъекций и прочей гадости при выводе данных
    • Делаем редирект, дабы на f5 данные не посылались заново.

    Приступим.

    Набросаем класс формы. Он должен уметь:

    • Работать в своём нэймспэйсе, пространстве имён, чтобы на одной странице можно было разместить несколько форм. Например блок логина и контактную форму. Для этого будем передавать в конструктор имя, а название полей будут в виде массива имя_формы[имя_поля]
    • Заполнять поле значением по умолчанию или брать значения из переменной $_POST[имя_формы][имя_поля]. Для ручной установки значения используем хак и будем это значение совать в суперглобальную переменную $_POST. Это не совсем хорошо, но очень удобно. Получаем методы getValue и setValue.
    • Проверка данных. Для этого будут методы setInvalid в который передаются имя поля и текст ошибки, isInvalid для проверки прошли ли проверку (с именем — для конкретного поля, без имени для всей формы).
    • Ну и последние, но очень важные функции для проверки страница открыта просто по ссылке или же была отправлена форма — метод isPost. А для проверки какая форма была отправлена будет метод isSubmit, который проверяет наличие нашего нэмспэйса в $_POST.

    Вот что у меня получилось:

    <?php
    class Form {
        protected $name;
        protected $validate = array();
        public function __construct($value = 'form') {
            $this->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])
                    ? ' <span style="color: red;">' . $this->validate[$filed] . '</span>'
                    : 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.

    Теперь рассмотрим сам шаблон

    <form method="post" action="" name="<?=$form->getName()?>">
    <dl>
        <dt>Простое текстовое поле</dt>
        <dd><input type="text" name="<?=$form->getName()?>[text]" value="<?=$form->getValue('text')?>"></dd>
     
        <dt>Текстовое поле с проверкой</dt>
        <dd><input type="text" name="<?=$form->getName()?>[text2]" value="<?=$form->getValue('text2')?>"><?=$form->isInvalid('text2')?></dd>
     
        <dd><input type="submit" value="Сохранить"/></dd>
    </dl>
    </form>

    У формы метод post, get-ом я никогда не пользуюсь, action пуст, он отправит нас на ту же страницу, что нам и нужно, т.к. за вывод и обработку отвечает один скрипт. Имя формы берём из объекта формы. Имя полей тоже по принципу имя_формы[имя_поля], а value опять же из объекта, при этом у нас используется экранирование. После поля выводим сообщение об ошибке, если оно есть <?=$form->isInvalid(‘text2’)?>. И всё, легко и просто, а главное — эффективно.

Для ответа в этой теме необходимо авторизоваться.