
В предыдущей статье, размещенной по ссылке, мы создали html-файл c формой подписки на рассылку и организовали передачу данных из html-формы в php-скрипт, который размещает в таблице «subscribe» введенные пользователем данные (имя и email-адрес). Функцию подключения к базе данных мы вынесли в отдельный файл. В итоге у нас получилось 3 файла:
- «subscribe.html» содержит форму подписки на рассылку;
- «config.php» устанавливает соединение с базой данных;
- «subscribe.php» принимает данные из html-формы и после соединения с БД вносит полученные данные в таблицу «subscribe»
Потерянным звеном этой цепочки оказалась проверка введенных пользователем данных. Восполним этот пробел и напишем функцию валидации email и имени пользователя. При проверке будем руководствоваться следующими критериями соответствия:
Имя пользователя:
- Содержит от 2 до 50 символов.
- Может состоять из букв русского и латинского алфавита, чисел, символа подчеркивания и пробела.
Email пользователя:
- Содержит от 3 до 50 символов.
- Соответствует структуре логин@доменное-имя.доменная-зона. При этом логин, доменное имя и доменная зона содержат только цифры и буквы латинского алфавита.
Руководствуясь перечисленными критериями соответствия дополним файл «subscribe.php» двумя функциями:
1. Функция валидации имени пользователя:
function validate_name($data) {
$err=""; /* присваиваем переменной $err пустую строку */
if(strlen($data)<2 || strlen($data)>50) /* если длина переменной $data меньше 2 или больше 50 символов*/
$err = "Длина имени должна быть от 2 до 50 символов";
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$data)) /* если в имени содержатся недопустимые символы */
$err = $err . "<p>В написании имени допустимы только буквы латинского и русского алфавита,цифры, символ подчеркивания и пробел</p>";
if(!empty($err))
return($err);
else
return 0;
}
Переменная $err, презентованная в начале функции, предназначена для хранения текста ошибок. Для проверки количества символов используется функция strlen($data). Корректно ли введенное пользователем имя мы проверяем с помощью регулярного выражения.
2. Функция валидации email-адреса пользователя:
function validate_email($data){
$err ="";
if(strlen($data)<3 || strlen($data)>50) /* если длина email меньше 3 и больше 50 */
$err = "Email должен быть от 3 до 50 символов"; /*записываем в переменную $err сообщение об ошибке */
if(!preg_match('#^([\w]+\.?)+(?<!\.)@(?!\.)[a-zа-я0-9ё\.-]+\.?[a-zа-яё]{2,}$#ui', $data)) /* если введенный адрес недопустимого формата */
$err = $err . "<p>Недопустимый формат email-адреса</p>"; /*записываем в переменную $err сообщение об ошибке */
if(!empty($err))
return($err);
else
return 0;
}
По аналогии с предыдущей функцией, в переменной $err мы будем хранить текст ошибок, количество символов проверим с помощью функции strlen($data), а в корректности email-адреса убедимся посредством регулярного выражения.
Если вы знакомы с функцией filter_var(), у вас может возникнуть вопрос: зачем городить регулярку, если можно решить вопрос простой функцией? Дело в том, что функция filter_var() «дискредитирует» email-адреса, содержащие кириллические символы. Приходится выбирать между дополнительным числом подписчиков в базе данных и компактной функцией с небольшим изъяном.
Функция валидации инпутов из формы подписки на рассылку
А теперь неплохо было бы объединить описанные выше функции в единую функцию валидации полученных из формы данных validate_inputs():
function validate_inputs($data_name,$data_email){
$err="";
$err_name = validate_name($data_name); /* вызываем функцию валидации имени пользователя */
$error_email = validate_email($data_email); /* вызываем функцию валидации email-адреса пользователя */
if(!empty($err_name))
$err = $err_name;
if(!empty($error_email))
$err = $err . $error_email;
return $err;
}
В данной функции поочередно выполняется валидация имени и email адреса, и возвращается текст ошибок или пустую строку.
Функция валидации готова! Осталось произвести вызов этой функции в php-скрипте сразу после получения переменных:
...
if(isset($_POST['submit_form']))
{
$name=$_POST["user_name"];
$email=$_POST["email"];
$error_form = validate_inputs($name, $email); /* вызываем функцию валидации формы*/
if(!empty($error_form)) { /* если найдена ошибка */
echo $error_form; /* выводим сообщение об ошибке */
}
else { /* иначе - вызываем подготовленный запрос */
$name=$_POST["user_name"]; /* извлекаем имя пользователя из массива $_POST в переменную $name */
$email=$_POST["email"]; /* извлекаем email пользователя из массива $_POST в переменную $email */
$prepared = $mysqli->prepare("insert into subscribe values('',?,?)"); /* формируем запрос, в котором вместо параметров записаны символы вопросительного знака */
$prepared->bind_param("ss",$name, $email); /* привязываем переменные имени и emaila параметрам запроса */
if($prepared->execute()) /* если запрос выполнен, сообщаем об успехе */
echo "Поздравляем! Подписка успешно оформлена! ";
else /*иначе - сообщаем об ошибке*/
echo "Ошибка запроса";
$prepared->close();
}
}
?>
Таким образом, размещение новой строки в таблице БД происходит только в том случае, если введенные пользователем данные удовлетворяют прописанным в функции validate_inputs() условиям.
Проверяем, содержится ли уже в таблице subscribe введенный пользователем email-адрес.
Чтобы не плодить в таблице записи с одинаковыми email-адресами, предлагаю после вызова функции validate_inputs() выполнить подготавливаемый mysqli-запрос на поиск в таблице «subscribe» строк с введенным пользователем email-адресом в ячейке email. Запрос будет выглядеть следующим образом:
$prepared = $mysqli->prepare("select id, name, email from subscribe where email = ?"); /* подготавливаем запрос - выбрать из таблицы строки с введенным пользователем email-адресом */
$prepared->bind_param("s", $email); /* привязываем переменную emaila к параметру запроса */
$prepared->execute(); /* выполняем запрос */
$prepared->store_result(); /* сохраняем результат запроса */
if($prepared->num_rows === 0) { /* если не найдена ни одна строка с таким email-адресом */
/* здесь будет находиться запрос для добавления пользовательских данных в
таблицу БД */
}
Таким образом, файл subscribe.php после внесенных изменений будет выглядеть следующим образом: скопировать файл с пояснениями
Скачать архив файлов с кодом подписки на рассылку можно по ссылке: subscribe_form2.zip. Не забудьте файле «config.php» поменять значения переменных на корректные для вашей базы данных!
не хватает функционал отписаться от рассылки, в идеале рядом кнопку отписаться и заполнять в данном случае только поле email