Формы и данные запроса
Сайт получает данные от посетителя двумя путями: из адресной строки и из отправленных форм. PHP раскладывает эти данные по готовым массивам, так что разбирать запрос вручную не нужно.
Примерам этого урока нужен веб-сервер, поэтому запустить здесь можно только те, что не зависят от запроса.
Данные из адреса
Всё, что в адресе стоит после знака вопроса, попадает в массив $_GET. Для адреса /search.php?query=php&page=2 он будет таким:
<?php
var_dump($_GET);
// ['query' => 'php', 'page' => '2']Все значения приходят строками — даже число 2.
Чтение одного значения
Параметра в адресе может не быть, поэтому значение читают с оператором ?? и значением по умолчанию:
<?php
$query = $_GET['query'] ?? '';
$page = (int) ($_GET['page'] ?? 1);Форма
Форма отправляет данные на адрес из атрибута action. Атрибут name у поля задаёт ключ, под которым значение придёт в PHP:
<form action="/register.php" method="post">
<input name="email" type="email">
<input name="password" type="password">
<button>Зарегистрироваться</button>
</form>При method="post" данные передаются в теле запроса и попадают в массив $_POST. Так отправляют всё, что меняет данные на сервере, и всё секретное: в адресной строке пароль был бы виден.
Обработка формы
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
if ($email === '' || $password === '') {
echo 'Заполните все поля';
} else {
echo 'Форма принята';
}
}Сначала проверяем, что форму действительно отправили, затем читаем поля и убеждаемся, что они не пустые.
Проверка данных
Данным от пользователя доверять нельзя: в поле «email» может оказаться что угодно. Функция filter_var() проверяет значение по готовым правилам:
<?php
var_dump(filter_var('anna@example.com', FILTER_VALIDATE_EMAIL) !== false); // bool(true)
var_dump(filter_var('не почта', FILTER_VALIDATE_EMAIL) !== false); // bool(false)Проверка в браузере — атрибуты required и type="email" — удобна посетителю, но не заменяет проверку на сервере: запрос можно отправить и в обход формы.
Вывод данных на страницу
Если вывести текст пользователя как есть, браузер выполнит содержащиеся в нём теги и скрипты. Такая атака называется XSS. Функция htmlspecialchars() превращает опасные символы в безвредные:
<?php
$comment = '<script>alert(1)</script>';
echo htmlspecialchars($comment);Запустите пример: вместо тега получился обычный текст.
Частая ошибка
Самая опасная привычка — выводить данные из $_GET и $_POST напрямую: echo $_GET['name']. Всё, что пришло от пользователя и попадает на страницу, пропускайте через htmlspecialchars().