Валидация имени и email адреса. Подписка на рассылку PHP – часть2.

ПОДПИСКА НА РАССЫЛКУ СРЕДСТВАМИ PHP – часть2.

Валидация имени и email адреса пользователя.

Форма подписки на рассылку
Кликните на изображение, чтобы проверить работоспособность формы

В предыдущей статье, размещенной по ссылке, мы создали html-файл c формой подписки на рассылку и организовали передачу данных из html-формы в php-скрипт, который размещает в таблице «subscribe» введенные пользователем данные (имя и email-адрес). Функцию подключения к базе данных мы вынесли в отдельный файл. В итоге у нас получилось 3 файла:

  • «subscribe.html» содержит форму подписки на рассылку;
  • «config.php» устанавливает соединение с базой данных;
  • «subscribe.php» принимает данные из html-формы и после соединения с БД вносит полученные данные в таблицу «subscribe»

Потерянным звеном этой цепочки оказалась проверка введенных пользователем данных. Восполним этот пробел и напишем функцию валидации email и имени пользователя. При проверке будем руководствоваться следующими критериями соответствия:

Имя пользователя:

  1. Содержит от 2 до 50 символов.
  2. Может состоять из букв русского и латинского алфавита, чисел, символа подчеркивания и пробела.

Email пользователя:

  1. Содержит от 3 до 50 символов.
  2. Соответствует структуре логин@доменное-имя.доменная-зона. При этом логин, доменное имя и доменная зона содержат только цифры и буквы латинского алфавита.

Руководствуясь перечисленными критериями соответствия дополним файл «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 не будет опубликован. Обязательные поля помечены *