Від автора: у попередньому уроці ми писали клієнтський скрипт, який перевіряє заповнення обов’язкових полів і відмітку чекбокса підтвердження. При цьому зазначалося, що перевірка на стороні клієнта жодним чином не позбавляє нас від перевірок на стороні сервера.
У поточному уроці ми напишемо серверний скрипт, який постараємося зробити настільки ж універсальним, як і клієнтський. Тобто можна буде у будь-який момент змінити у формі кількість обов’язкових до заповнення полів та внести при цьому правку всього в одну сходинку скрипта.
Отже, приступимо…
План уроку:
1. Написання серверного скрипта.
Деталі підручника
Тема: PHP
Складність: Середня
Урок: Відео версія (.mp4)
Час: 00:45:54
Розмір архіву: 90 Mb
Алгоритм роботи серверного скрипта буде багато в чому схожий на алгоритм клієнтського скрипта. Ми також створимо масив обов’язкових полів, також буде прапор заповнення обов’язковий полів і т. д.
Скрипт буде знаходитися на сторінці з формою, тому під масивом країн створимо масив обов’язкових полів:
$fields = array(“lastname” => “Прізвище”, “firstname” => “Ім’я”, “email” => “Email”, “comment” => “Відгук”);
Для зручності подальшого тестування роботи скрипта тимчасово закомментіруем підключення клієнтського скрипта, щоб безперешкодно відправлялися дані на сервер.
Тут ми маємо асоціативний масив, ключами якого є імена полів, а значеннями — опису полів. Навіщо потрібен саме асоціативний масив? Справа в тому, що передані дані форми ми отримуємо з глобального масиву POST. При цьому ключами елементів масиву будуть якраз імена полів, тому при перевірці отриманих даних досить подивитися є що перевіряється ключ елемента глобального масиву POST у масиві fields. Якщо такий ключ є, значить ми перевіряємо обов’язкове поле. Ну а значення масиву fields нам знадобляться при виведенні інформації про те, які саме з полів не були заповнені. Ось така ось у нас задумка. Почнемо її реалізовувати.
Для початку створимо умова, яке буде виконуватися при надходженні даних форми:
$error = false;
}
Тут ми відразу ж встановили прапор заповнення обов’язкових полів, присвоївши йому логічне значення FALSE. Як Ви вже могли здогадатися, в кінці скрипта ми перевіримо значення змінної $error, якщо воно залишиться FALSE — значить з даними все в порядку, інакше — якісь поля або чекбокс не були заповнені.
Тепер пройдемося в циклі по масиву POST. При цьому ми будемо перевіряти виконання двох умов для кожного з елементів масиву POST:
Присутній ключ перевіряється елемента в масиві fields?
Порожньо значення перевіряється елемента?
Якщо обидві умови виконуються, тобто якщо перевіряється елемент поле форми) є в списку обов’язкових і при цьому у нього пусте значення (поле не заповнено), значить, ми будемо змінювати значення прапора на логічне значення TRUE і запам’ятовувати повідомлення про незаповненості даного конкретного поля. Для запам’ятовування повідомлення ми скористаємося механізмом сесій, а тому відкриємо сесію на початку файлу, перед масивом країн:
session_start();
Ну і, власне, описаний вище цикл:
foreach ($_POST as $key => $value) {
$value = trim($value);
if(array_key_exists($key, $fields) && empty($value)){
$_SESSION[‘res’][‘error’] .= “Ви не заповнили поле {$fields[$key]}
“;
$error = true;
}
}
Таким чином, якщо користувач не заповнить будь-який з обов’язкових полів, то в сесійній масиві $_SESSION[‘res’] створюється елемент error з повідомленням, що не заповнено конкретне поле. Ось для цього нам потрібен був саме асоціативний масив fields, щоб за його ключу отримати значення. Ну а завдяки оператора конкатенації (знак точки перед знаком одно) ми дозаписываем значення $_SESSION[‘res’][‘error’], не стираючи колишнє. Також варто звернути увагу на використання функції trim(), яка обрізає кінцеві пробіли значення. Зроблено це для того, щоб приймати тільки значиму для нас інформацію, а не пробіли замість неї.
Тепер перевіримо, відзначений чи чекбокс:
if($_POST[‘confirm’] != ‘on’){
$_SESSION[‘res’][‘error’] .= “Ви не підтвердили згоду на публікацію!”;
$error = true;
}
Якщо чекбокс був відзначений, то в масиві POST значення відповідного елемента буде дорівнювати рядку «on». Якщо такого значення немає, значить чекбокс не відмічений, і ми в змінну $_SESSION[‘res’][‘error’] додамо відповідне повідомлення і змінимо значення прапора.
Залишилося тільки перевірити значення прапора. Якщо воно буде TRUE — то ми повинні припинити роботу з даними форми (тобто, наприклад, не відправляти їх на пошту, не класти в БД тощо). При цьому необхідно повідомити користувачеві про незаповненості полів і, до того ж, бажано зберегти інформацію всіх заповнених полів, щоб користувач не заповнював їх двічі.
Оскільки ми працюємо з сесіями, то зробити це не складе особливих труднощів. Ми знову пройдемося в циклі по масиву POST і в сесійній масиві $_SESSION[‘res’] створимо елементи з ключами, відповідними назвами полів форми.
Якщо ж значення прапора не змінилося, значить з даними все гаразд і можна продовжувати роботу (відправляти лист, класти в БД тощо). У нашому випадку ми обмежимося виведенням повідомлення користувачу про успішне надсилання відзиву — для цього створимо змінну $_SESSION[‘res’][‘ok’]:
if($error){
foreach ($_POST as $key => $value) {
$_SESSION[‘res’][$key] = trim($value);
}
}else{
$_SESSION[‘res’][‘ok’] = “Дякуємо, Ваш відгук прийнятий.”;
}
Ну і для вирішення проблеми F5 наприкінці скрипта організуємо редирект, зменшуючи, таким чином, POST-дані:
header(“Location: {$_SERVER[‘PHP_SELF’]}”);
exit;
Залишилося вивести всі сесійні змінні. Перш за все, давайте виведемо їх в якості можливих значень полів:
* Прізвище:
* Ім’я:
По батькові:
* Email:
Альтернативні Email:
Країна:
* Відгук:
* Не заперечую проти публікації мого відкликання на сайті в рекламних цілях
Тепер, якщо користувач не заповнить всі необхідні поля, йому не доведеться заповнювати двічі одне і те ж поле — все раніше заповнені поля залишаться заповненими.
Перед формою виведемо можливі повідомлення про успіх або помилка надсилання форми:
{$_SESSION[‘res’][‘error’]}