Форми - це частина мови HTML. Форми потрібні для передачі даних від клієнта на сервер. Найчастіше форми використовуються для реєстрації користувачів, заповнення анкет, оформлення замовлення в інтернет магазині тощо.
Через форми можна відправляти як просту текстову інформацію, так і файли.
Більшу частину часу програмування на PHP ви будете так чи інакше працювати з формами і даними з них.
HTML описує те, з яких елементів складається форма, і як вона виглядає. Але без приймаючої сторони, тобто сервера, який приймає ці дані й обробляє їх потрібним чином, створювати форми немає жодного сенсу.
PHP містить безліч засобів для роботи з формами. Це дає змогу дуже просто розв'язувати типові завдання, які часто виникають у веб-програмуванні:
Реєстрація та аутентифікація користувача
Відправлення коментарів на форумах і соціальних мережах
Оформлення замовлень.
Практично будь-який сучасний сайт містить щонайменше кілька різних HTML-форм.
Розглянемо один типовий приклад - форма зворотного зв'язку. Для зв'язку користувачів з авторами сайту зазвичай використовують форми зворотного зв'язку, де людина вказує ім'я, пошту для зворотного зв'язку і текст свого повідомлення.
Така форма в HTML може мати такий вигляд:
<form name="feedback" method="POST" action="form.php">
<label>Ваше ім'я: <input type="text" name="name"></label>
<label>Ваш email: <input type="text" name="email"></label>
<label>Повідомлення: <textarea name="message"></textarea></label>
<input type="submit" name="send" value="Надіслати">
</form>
Це дуже проста форма, що складається з трьох полів і однієї кнопки відправлення.
Майже весь наведений код описує зовнішній вигляд і зміст форми, але слід звернути увагу на два атрибути тега <form>, які потрібні для вказівки на спосіб обробки даних:
method — цей атрибут використовується для визначення методу HTTP, який буде використаний для передачі даних на сервер. Ви вже знайомі з HTTP-методом GET, який наказує серверу просто повернути певний документ.
Метод POST повідомляє про намір передати на сервер деяку інформацію, що, втім, не скасовує подальше отримання контенту.
action — містить адресу PHP-скрипта, який має обробити цю форму.
Після натискання на кнопку "надіслати", браузер виконує POST-запит із введеними даними на адресу, вказану в атрибуті action.
Після відправлення форми управління передається PHP-скрипту, який має отримати передані дані, виконати з ними будь-які дії (наприклад, зберегти в базі даних) і показати результат.
Результатом може бути якесь повідомлення про успішне завершення операції, наприклад, "ваші дані успішно відправлено".
Тому потрібно насамперед навчитися отримувати дані з форми в сценарії.
У PHP це робиться легко - всі дані з форми знаходяться в глобальному асоціативному масиві $_POST. Цей масив завжди буде неявно присутній у сценарії, якщо він був завантажений за методом POST.
Кожне поле з форми буде знаходитися в масиві, де ключем буде значення атрибута name, а значенням вміст поля. Наприклад, щоб вивести з форми всю інформацію на екран, можна написати такий сценарій:
<?php
if (isset($_POST)) {
print("Им'я: " . $_POST['name']);
print("<br>Email: " . $_POST['email']);
print("<br>Повідомлення: " . $_POST['message']);
}
Функція isset служить для визначення, чи існує передана їй змінна. Так ми перевіряємо, що сценарій завантажено методом POST, тобто було надіслано форму.
Як правило, після обробки форми в PHP, сценарій має переадресувати користувача на іншу сторінку. Це пов'язано з тим, що якщо форма була надіслана через метод POST, то після оновлення сторінки дані будуть надіслані ще раз, а це, в більшості випадків, небажана поведінка.
Крім текстової інформації, існує можливість надсилати на сервер файли будь-яких типів. Приклад форми для завантаження файлу:
<form name="file_upload" method="POST" action="form.php" enctype="multipart/form-data">
<label>Ваш аватар: <input type="file" name="avatar"></label>
<input type="submit" name="send" value="Надіслати файл">
</form>
Тут є дві важливі відмінності від першого прикладу:
Додався новий атрибут enctype, який завжди повинен мати значення multipart/form-data. Якщо його не буде, то файл не відправиться.
Сам файл завантажується за допомогою поля з типом file.
У PHP завантажений файл буде доступний в іншому спеціальному масиві - $_FILES.
<?php
if (isset($_FILES['avatar'])) {
$file = $_FILES['avatar'];
print("Завантажено файл з іменем " . $file['name'] . " і розміром " . $file['size'] . " байт");
}
PHP автоматично зберігає всі завантажені файли в тимчасову папку на сервері. Але зберігати там файли не можна, тому що ця директорія періодично очищається, і посилання на такий файл не можна дати на сайті. Рішення тут тільки одне - перемістити завантажений файл в іншу папку. Переміщення файлу завжди виконують одразу після завантаження.
Для початку потрібно переконатися, що в робочій директорії проєкту існує папка для зберігання завантажених файлів. Нехай вона називається uploads.
Для переміщення файлу потрібно знати, де він перебуває зараз, і адресу папки, в яку він буде переноситися.
З поточною адресою все вкрай просто - вона вже знаходиться в масиві $_FILES. Нова адреса файлу, своєю чергою, складається зі шляху до папки та імені файлу. Оскільки папка uploads розташована там же, де і поточний сценарій, отримати шлях до неї можна так: dirname(__FILE__).
Код для переміщення файлу в нову папку:
<?php
$current_path = $_FILES['avatar']['tmp_name'];
$filename = $_FILES['avatar']['name'];
$new_path = dirname(__FILE__) . '/' . $filename;
move_uploaded_file($current_path, $new_path);
Функція move_uploaded_file() виконує дві дії:
Перевіряє, що файл дійсно завантажений через форму.
Переміщує завантажений файл за новою адресою.
Валідація форми - це перевірка вмісту її полів. Завдання такої перевірки - переконатися, що необхідні поля заповнені, а значення в них відповідають очікуваному формату.
Так, наприклад, під час реєстрації користувача на сайті, він має заповнити поля з адресою електронної пошти та придумати собі пароль. Обидва поля обов'язкові до заповнення, але значення з поля email також має бути коректною email-адресою.
Крім текстових значень форми, можна перевіряти формат і розмір завантажуваних файлів.
Під час виконання валідації будь-якої форми порядок дій буде завжди одним:
Сформувати масив з іменами полів, обов'язкових до заповнення.
Сформувати масив із правилами для валідації формату полів.
Отримати значення всіх полів.