Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Формы и данные запроса

Сайт получает данные от посетителя двумя путями: из адресной строки и из отправленных форм. 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().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.