Валидация полей формы на PHP

    2 комментария 930

Валидация формы на PHP

Привет, друг. Помимо того, что можно делать проверки полей формы на JavaScript, необходимо так же делать валидацию на стороне сервера и сейчас мы с вами рассмотрим пример валидации на PHP. Проверять будет такие поля, как номер телефона, email, IP адрес, адрес сайта и др. Всего полей будет 7.

Валидация полей формы на PHP

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

Демо

Форму я сделал на Bootstrap и выглядит она так:

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
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" class="col-md-5" method="post">< ?php echo $err['success'] ?>
     <div class="form-group">
     <label for="">Имя</label>
     <input type="text" class="form-control" name="name" value="<?php echo $_POST['name'] ?/>" placeholder="Имя не более 10-ти символов">
     < ?php echo $err['name'] ?>
   </div>
   <div class="form-group">
     <label for="">Возраст</label>
     <input type="text" class="form-control" name="num" value="<?php echo $_POST['num'] ?/>" placeholder="Двузначное число">
     < ?php echo $err['num'] ?>
    </div>
    <div class="form-group">
      <label for="">Телефон</label>
      <input type="text" class="form-control" name="phone" value="<?php echo $_POST['phone'] ?/>" placeholder="Номер телефона формата РФ">
      < ?php echo $err['phone'] ?>
     </div>
     <div class="form-group">
       <label for="">Email</label>
       <input type="text" class="form-control" name="email" value="<?php echo $_POST['email'] ?/>" placeholder="Emai адрес">
       < ?php echo $err['email'] ?>
      </div>
      <div class="form-group">
        <label for="">IP адрес</label>
        <input type="text" class="form-control" name="ip" value="<?php echo $_POST['ip'] ?/>" placeholder="IP адрес">
        < ?php echo $err['ip'] ?>
      </div>
      <div class="form-group">
        <label for="">Сайт</label>
        <input type="text" class="form-control" name="url" value="<?php echo $_POST['url'] ?/>" placeholder="Адрес сайта">
        < ?php echo $err['url'] ?>
      </div>
      <div class="form-group">
	<label for="">Сообщение</label>
	<textarea class="form-control" name="text" placeholder="Ваше сообщение">
        < ?php echo $_POST['text'] ?>
        </textarea>
        < ?php echo $err['text'] ?>
      </div>
      <button type="submit" class="btn btn-success" name="submit">Отправить</button>
</form>

Вывод PHP переменно $err в HTML коде означает вывод ошибок и мы их напишем непосредственно в PHP. Я предстаавлю на ваше обозрение весь код, и уже ниже прокомментирую его.

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
function clear_data($val){
    $val = trim($val);
    $val = stripslashes($val);
    $val = strip_tags($val);
    $val = htmlspecialchars($val);
    return $val;
}
 
$name = clear_data($_POST['name']);
$num = clear_data($_POST['num']);
$phone = clear_data($_POST['phone']);
$email = clear_data($_POST['email']);
$ip = clear_data($_POST['ip']);
$url = clear_data($_POST['url']);
$text = clear_data($_POST['text']);
 
$pattern_phone = '/^(\+7|7|8)?[\s\-]?\(?[489][0-9]{2}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$/';
 
$pattern_name = '/^[А-ЯЁ][а-яё]*$/';
$err = [];
$flag = 0;
 
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
    if (preg_match($pattern_name, $name)){
        $err['name'] = '<small class="text-danger">Здесь только русские буквы</small>';
        $flag = 1;
    }
    if (mb_strlen($name) > 10 || empty($name)){
        $err['name'] = '<small class="text-danger">Имя должно быть не больше 10 символов</small>';
        $flag = 1;
    }
    if (!filter_var($num, FILTER_VALIDATE_INT) || strlen($num) > 2){
        $err['num'] = '<small class="text-danger">Здесь должно быть только двузначное число</small>';
        $flag = 1;
    }
    if (empty($num)){
        $err['num'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (!preg_match($pattern_phone, $phone)){
        $err['phone'] = '<small class="text-danger">Формат телефона не верный!</small>';
        $flag = 1;
    }
    if (empty($phone)){
        $err['phone'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
        $err['email'] = '<small class="text-danger">Формат Email не верный!</small>';
        $flag = 1;
    }
    if (empty($email)){
        $err['email'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (!filter_var($ip, FILTER_VALIDATE_IP)){
        $err['ip'] = '<small class="text-danger">Формат ip не верный!</small>';
        $flag = 1;
    }
    if (empty($ip)){
        $err['ip'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (!filter_var($url, FILTER_VALIDATE_URL)){
        $err['url'] = '<small class="text-danger">Формат url не верный!</small>';
        $flag = 1;
    }
    if (empty($url)){
        $err['url'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if (empty($text)){
        $err['text'] = '<small class="text-danger">Поле не может быть пустым</small>';
        $flag = 1;
    }
    if ($flag == 0){
        Header("Location:". $_SERVER['HTTP_REFERER']."?mes=success");
    }
}
if ($_GET['mes'] == 'success'){
    $err['success'] = '<div class="alert alert-success">Сообщение успешно отправлено!</div>';
}

С 1 по 7 стр. Функция очистки данных
С 9 по 15 стр. Принимаем данные из формы прогоняя их через функцию
17 стр. Регулярное выражение для номера телефона в формате РФ
19 стр. Регулярное выражение для имени (только рус.)
20 стр. Определяем переменную, как массив ошибок
21 стр. Специальный флаг. Присвоим ему значение — 0
23 стр. Проверка, если данные пришли методом POST
С 24 по 27 стр. Проверка на соответствие регулярному выражению ($name)
С 28 по 31 стр. Если поле пустое или больше 10 символов — выводим ошибку
С 32 по 35 стр. Фильтр проверки данных на целое число и длину строки
36 стр. Проверка поля на пустоту (в коде повторяется)
С 40 по 43 стр. Проверка на соответствие регулярному выражению ($phone)
С 48 по 51 стр. Фильтр валидации Email
С 56 по 59 стр. Фильтр валидации IP
С 64 по 67 стр. Фильтр валидации URL
С 76 по 78 стр. Если валидация пройдена

Если валидация всех полей будет пройдена, об этом нам скажет специальный флаг, которому мы в начале установили ноль, то перезагрузим страницу с очисткой формы и добавим к адресу GET-параметр mes и присвоим ему значение success. То есть если 0 — валидация пройдена, если 1 — есть ошибки. И в самом конце с 80 по 82 стр. проверяем, если такой параметр существует, то выводим сообщение об успешной отправке данных. Это один из примеров валидации на PHP и он не единственный верный, но как рабочий вариант вполне пригоден для использования. Через JS и Ajax валидация будет немного по-другому реализована, но общий принцип останется таким же.

Надеюсь, что теперь у вас не возникнет трудностей с валидацией форм на PHP. Пишите ваши комментрии по данной теме.

Добавить страницу в закладки

2 комментария
  1. Димол:

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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *