ProfiPHPProfiPHP
  1. Главная
  2. Полезное в PHP
  3. Правильная обработка HTML формы в PHP

Правильная обработка HTML формы в PHP

Кроме статической информации в сети интернет на страницах сайтах очень часто можно встретить формы для отправки данных: контакты, регистрация, авторизация и другие.

Разберем как правильно обработать HTML форму с помощью PHP. На сегодняшний день используют Jquery и другие фреймворки, с помощью которых возможно отправлять данные без перезагрузки страницы и моментально возвращать результат, но иногда необходимо выполнить все в чистом виде, что мы и сделаем.

Еще в далекие студенческие годы, где то 2010 год, мой друг продемонстрировал мне процесс отправки данных (еще и оригинальный лист сохранился):

После значительного усовершенствования можно выделить следующие преимущества данной логики реализации обработки HTML формы в PHP.

- После заполнения полей формы с ошибками пользователю будет выведена ошибка, но данные формы сохраняются для следующего исправления.

- После правильной оправки данных пользователю будет выведено сообщение об успешном завершении операции.

- Все данные проходят процедуру проверки и обработки, что позволяет обезопасить сайт от взлома.

- Механизм отправки использует сессии, а после отправки все данные из сессий удаляются.

Опишем логику скрипта:
<?php
// Стартуем сессию (данные находятся в переменных сесии)
session_start();

// Функция обработки входящих данных
function session_input() {
$arg_list = func_get_args();
foreach ($arg_list as $key) {
$_SESSION[$key] = htmlspecialchars(trim(strval(@$_POST[$key])), ENT_QUOTES);
}
}

// Успешная отправка данных:
if ( isset( $_SESSION['send'] ) && $_SESSION['send'] == 'success' ) {
echo 'Спасибо!';
// Удаляем данные сесии:
unset( $_SESSION['send'], $_SESSION['error'], $_SESSION['str'] );
}
else
{
// Если пользователь отправил данные:
if ( isset( $_POST['submit'] ) )
{
// Обробляем входящие данные:
session_input('str');
// Переменная, в которой сохраняется ошибка:
$_SESSION['error'] = '';
// Проверка входящих данных:
if (mb_strlen($_SESSION['str']) < 1 || mb_strlen($_SESSION['str']) > 5 ) {
$_SESSION['error'] .= 'Ошибка!';
}
// Если ошибок не обнаружено, перезагружаем страницу:
if ( ! empty( $_SESSION['error'] ) ) {
exit( header( 'Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] ) );
}
// Выполняем исполняемый код:
// ...

// Создаем переменную сесии с успешным результатом
// и перезагружаем страницу:
$_SESSION['send'] = 'success';
exit(header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']));
}
else {
// Иначе выводим форму отправки данных:
echo isset( $_SESSION['error'] ) ? '<div class="warning">'.$_SESSION['error'].'</div>' : '';
echo '
<form action="" method="post">
<input type="text" name="str" value="'.(isset($_SESSION['str']) ? $_SESSION['str'] : '').'" />
<input type="submit" name="submit" value="Отправить" />
</form>';
// Удаляем данные сесии:
unset( $_SESSION['send'], $_SESSION['error'], $_SESSION['str'] );
}
}
?>
Опишем принцип работы:

1. Стартуем сессию и объявляем функцию обработки входящих данных Session_input, которая преобразует специальные символы в HTML-сущности (Htmlspecialchars) и возвращает строковое значение переменной (Strval).

2. Проверяем переменную сессии $_SESSION['send'], если она существует - значит данные отправлены верно и необходимо вывести пользователю сообщение об этом. После вывода сообщения удаляем все переменные сессии.

3. Проверяем нажатия кнопки $_POST['submit'], которая отправляет данные серверу. Если данные отправлены, обрабатываем данные и выполняем необходимые проверки. Если обнаружена ошибка - перезагружаем страницу и выводим ее, иначе создаем переменную сессии $_SESSION['send'] и перезагружаем страницу.

4. Если пользователь ничего не делал - выводим форму отправки данных HTML.

Также следует заметить, что в примере используется одно поле с названием Str. Можно добавлять сколько угодно полей, но с каждым полем необходимо добавлять их в функции Unset и выполнять соответствующие проверки. Также все название полей необходимо добавлять в функцию обработки входящих данных:
session_input('name1', 'name2', 'name3');

Добавить комментарий

Имя:
Текст комментария: