Руководство по валидации форм в 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 ) своим собственным кодом.
Насколько публикация полезна?
Нажмите на звезду, чтобы оценить!
Средняя оценка 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 комментария
В целом можно, но лучше написать подсистему валидации, чтобы код говорил сам за себя, что он делает, а детали реализации были скрыты.
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 >>
1) нет смысла хэшить пароли для сравнения, тем более не нужно использовать hash для шифрования паролей, есть специальные функции для этого.
2) Для логина используются проверки регулярками, в соответствии с вашими условиями(длинна, символы, латиница, тире. ) + наличие такого логина в базе(на занятость)
3) нормальные сервисы требуют емэйл для подтверждения регистрации.
4) как верно заметил BD_ l3ftoverZ!, правильнее создать вначале пустой массив ошибок, а затем его в конце проверить, если он пуст — все ок, если есть ошибки — передать в представление и вывести в форму регистрации.