Contact Form

Руководство по валидации форм в PHP

Как мы узнали в предыдущем руководстве, процесс сбора и отображения отправленных данных формы довольно прост. В этом руководстве вы узнаете, как реализовать на своем веб-сайте простую контактную форму, которая позволяет пользователям отправлять свои комментарии и отзывы по электронной почте. Мы будем использовать ту же PHP-функцию mail() для отправки писем.

Мы также собираемся реализовать некоторые базовые функции безопасности, такие как санитизация и валидация полей, чтобы пользователь не мог вставлять потенциально опасные данные, которые ставят под угрозу безопасность веб-сайта или могут нарушить работу приложения.

Ниже приводится наш универсальный PHP-скрипт, который выполняет следующие функции:

  • Он попросит пользователя ввести свой комментарий о веб-сайте.
  • Тот же скрипт отображает контактную форму и обрабатывает отправленные данные формы.
  • Скрипт очищает и проверяет вводимые пользователем данные. Если какое-либо обязательное поле (отмеченное *) отсутствует или проверка не удалась из-за неправильных данных, скрипт повторно отображает форму с сообщением об ошибке для соответствующего поля формы.
  • Скрипт запоминает, какие поля пользователь уже заполнил, и предварительно заполняет эти поля, когда форма повторно отображается из-за ошибки проверки.
  • Если данные, представленные пользователем, приемлемы, и все идет хорошо, он отправит электронное письмо администратору веб-сайта и отобразит сообщение об успехе пользователю.

Введите следующий код в файл contact.php и сохраните его в корневом каталоге проекта:

array("regexp"=>"/^[a-zA-Z\s]+$/")))) < return $field; >else < return FALSE; >> function filterEmail($field) < // Санитизация e-mail $field = filter_var(trim($field), FILTER_SANITIZE_EMAIL); // Валидация e-mail if(filter_var($field, FILTER_VALIDATE_EMAIL))< return $field; >else < return FALSE; >> function filterString($field) < // Санитизация строки $field = filter_var(trim($field), FILTER_SANITIZE_STRING); if(!empty($field))< return $field; >else < return FALSE; >> // Определяем переменные и инициализирем с пустыми значениями $nameErr = $emailErr = $messageErr = ""; $name = $email = $subject = $message = ""; // Обрабатываем данные формы при отправке формы if($_SERVER["REQUEST_METHOD"] == "POST") < // Валидация имени пользователя if(empty($_POST["name"]))< $nameErr = "Пожалуйста, введите ваше имя."; >else < $name = filterName($_POST["name"]); if($name == FALSE)< $nameErr = "Пожалуйста, введите верное имя."; >> // Валидация e-mail if(empty($_POST["email"])) < $emailErr = "Пожалуйста, введите адрес вашей электронной почты."; >else < $email = filterEmail($_POST["email"]); if($email == FALSE)< $emailErr = "Пожалуйста, введите действительный адрес электронной почты."; >> // Валидация темы сообщения if(empty($_POST["subject"])) < $subject = ""; >else < $subject = filterString($_POST["subject"]); >// Валидация комментария пользователя if(empty($_POST["message"])) < $messageErr = "Пожалуйста, введите свой комментарий."; >else < $message = filterString($_POST["message"]); if($message == FALSE)< $messageErr = "Пожалуйста, введите правильный комментарий."; >> // Проверяем ошибки ввода перед отправкой электронной почты if(empty($nameErr) && empty($emailErr) && empty($messageErr))< // Электронный адрес получателя $to = 'webmaster@example.com'; // Создаем заголовки письма $headers = 'From: '. $email . "\r\n" . 'Reply-To: '. $email . "\r\n" . 'X-Mailer: PHP/' . phpversion(); // Отправляем электронную почту if(mail($to, $subject, $message, $headers))< echo '

Ваше сообщение было отправлено успешно!

'; > else< echo '

Невозможно отправить электронное письмо. Пожалуйста, попробуйте еще раз!

'; > > > ?>
     .error < color: red; >.success 

Связаться с нами

Заполните эту форму, чтобы связаться с нами.

Разберем этот код подробнее.

  • Функция filterName() (строка №-03) проверяет входное значение емени пользователя. Допустимое имя может содержать только буквы алфавита (a-z, A-Z).
  • Функция filterEmail() (строка №-14) проверяет входное значение адреса электронной почты.
  • Функция filterString() (строка № 25) только очищает входное значение, удаляя HTML-теги и специальные символы. Она не проверяет входящее значение.
  • Атрибут action=»contact.php» (строка № 111) внутри тега указывает, что тот же файл contact.php отображает форму, а также обрабатывает данные формы.
  • Код PHP внутри атрибута value и , например. отображает предварительно заполненное значение, когда форма повторно отображается при ошибке проверки.
  • Код PHP внутри класса .error , например. отображает ошибку для соответствующего поля.

Чтобы узнать больше о санитизации и валидации, ознакомьтесь со справочником по фильтрам PHP.

Вам необходимо настроить почтовый сервер на вашем компьютере, чтобы PHP-функция mail() работала. Если вы просто хотите реализовать проверку формы, вы можете заменить часть почты (строки с 81 по 94 ) своим собственным кодом.

smsc banner 480x320 beget banner 480x320 flexbe banner 480x320

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 5 / 5. Количество оценок: 2

Оценок пока нет. Поставьте оценку первым.

Похожие посты

Руководство по загрузке файлов на сервер в PHP

В этом руководстве мы узнаем, как загружать файлы на удаленный сервер с помощью простой HTML-формы и PHP. Вы можете загружать файлы любого типа, например изображения, видео, ZIP-файлы, документы Microsoft Office, PDF-файлы, а также исполняемые файлы и множество других типов файлов. Шаг 1. Создание HTML-формы для загрузки файла В следующем примере будет создана простая HTML-форма, которую…

Руководство по GET и POST запросам в PHP

Веб-браузер связывается с сервером, как правило, с помощью одного из двух HTTP-методов (протокола передачи гипертекста) — GET и POST. Оба метода передают информацию по-разному и имеют разные преимущества и недостатки, как описано ниже. PHP-метод GET В методе GET данные отправляются в виде параметров URL, которые обычно представляют собой строки пар имени и значения, разделенные амперсандами…

Список сообщений об ошибках в PHP

Обычно, когда движок PHP сталкивается с проблемой, препятствующей правильной работе скрипта, он генерирует сообщение об ошибке. Существует шестнадцать различных уровней ошибок, и каждый уровень представлен целым числом и связанной с ним константой. Вот список уровней ошибок: Название Значение Описание E_ERROR 1 Неустранимая ошибка времени выполнения от которой невозможно избавиться. Выполнение скрипта немедленно прекращается E_WARNING 2…

Разработка сайтов для бизнеса

Если у вас есть вопрос, на который вы не знаете ответ — напишите нам, мы поможем разобраться. Мы всегда рады интересным знакомствам и новым проектам.

Источник

Проверка заполнения полей

Проверка поля Name не работает — по идее нужно сдлать так чтобы если одно из полей не заполнено форма «ругалась» и возвращала, но увы. подскажите в каком направлении копать?

Проверка заполнения полей
Добрый день. Подскажите как вывести ошибку, если при вводе данных человек не заполнил одно из полей.

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

Проверка полей формы на правильность заполнения
В общем есть Landing Page, в нем есть обратные формы связи. В принципе они работают, но хотелось бы.

. if(empty($Name)){ echo "Заполните строку ФИО. "; } else . 

На пустые поля ругаться начало, но вот теперь не хочет проверять количество символов. Условие проверки длины прописываю вот так:

else{ $Name = trim($_POST['Name']); if(iconv_strlen($Name)2)}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
 $hostname = "localhost"; // название/путь сервера, с MySQL $username = "root"; // имя пользователя (в Denwer`е по умолчанию "root") $password = "123456"; // пароль пользователя (в Denwer`е по умолчанию пароль отсутствует, этот параметр можно оставить пустым) $dbName = "exp_b"; // название базы данных $table = "sotr"; $db = mysql_connect ("localhost","root","123456"); mysql_select_db("exp_b",$db); $Name = $_POST['Name']; $Department = $_POST['Department']; $Rank = $_POST['Rank']; $Lognomer = $_POST['Lognomer']; $Avtootvet = $_POST['Avtootvet']; $Avtootvet1 = $_POST['Avtootvet1']; if (empty($Name)) else{ $Name = trim($_POST['Name']); if(iconv_strlen($Name)2)} echo "ВНИМАНИЕ! Не заполнено одно или более полей формы! Поле ФИО_сотрудника не заполнено или введено некорректное значение!
"
; if (empty($Department)) echo "Укажите отдел!
"
; if (empty($Rank)) echo "Укажите должность!
"
; if (empty($Lognomer)) echo "Укажите Логномер!
"
; if (empty($Avtootvet)) echo "Укажите автоответ полностью!
"
; if (empty($Avtootvet1)) echo "Укажите автоответ полностью!
"
; else { $sql = 'INSERT INTO sotr(Name, Department, Rank, Lognomer, Avtootvet, Avtootvet1) VALUES ("'.$Name.'", "'.$Department.'", "'.$Rank.'", "'.$Lognomer.'", "'.$Avtootvet.'", "'.$Avtootvet1.'")'; } if(!mysql_query($sql)) {echo '

Запись не может быть произведена потому что нет доступа к базе данных или форма заполнено некорректно!

'
;} else {echo '

Готово


'
;} ?>

Проблема в том что если при таком условии запись тупо пишется в таблицу даже с пустым полем.

Источник

PHP, регистрация, проверка полей?

Знаю что нет проверки на длину и еще много чего но можно ли писать проверки так?

if($_POST['submit']) < $salt = 'Здесь будет 32 рандомных символа'; $login = $_POST['login']; $pass1 = hash('sha256', $_POST['password'].$salt); $pass2 = hash('sha256', $_POST['password2'].$salt); // Проверка заполненности и подобия паролей. if(!empty($pass1 AND $pass2) && $pass1==$pass2)< $passcheck = true; >else < $passcheck = false; $errors[] = "Ошибка! Пароли не совпадают или поля не заполнены!"; >// Проверка заполнен ли логин. if(!empty($login)) < $logincheck = true; >else < $logincheck = false; $errors[] = "Ошибка! Заполните поле Логин!"; >//Итоговая проверка корректности всех полей. if($passcheck == true && $logincheck == true) < echo "Процесс регистрации. "; >else< echo "Правильно заполните поля!" . "
"; // Выводим список ошибок из массива $errors[]. foreach($errors as $error)< echo $error . "
"; > > >

Простой 2 комментария

delphinpro

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

public function doLogin(Request $request, Response $response, $args) < $form = new Form($request); $form->addField(new Field('username')) ->assert(Assert::notEmpty('Это обязательное поле')); $form->addField(new Field('password')) ->assert(Assert::notEmpty('Это обязательное поле')); $form->validate(); if ($form->isValid()) < // OK >>

ThunderCat

1) нет смысла хэшить пароли для сравнения, тем более не нужно использовать hash для шифрования паролей, есть специальные функции для этого.
2) Для логина используются проверки регулярками, в соответствии с вашими условиями(длинна, символы, латиница, тире. ) + наличие такого логина в базе(на занятость)
3) нормальные сервисы требуют емэйл для подтверждения регистрации.
4) как верно заметил BD_ l3ftoverZ!, правильнее создать вначале пустой массив ошибок, а затем его в конце проверить, если он пуст — все ок, если есть ошибки — передать в представление и вывести в форму регистрации.

Источник

Читайте также:  :nth-last-of-type()
Оцените статью