#4 php форма с методом GET: как форма собирает адрес с параметрами

В уроках про GET-параметры и сравнение чисел мы набирали параметры в адресе руками. Пришло время автоматизировать: HTML-форма с методом GET сама соберёт адрес за нас. Возьмём страницу сравнения чисел из прошлого урока и добавим к ней форму.

Немного теории

Формы в HTML подробно описаны в учебнике: создание web-форм (тег form, атрибуты action и method) и текстовые поля. Из нового здесь только одно: у формы будет method="get" — то есть данные поедут на сервер в адресе страницы, как в прошлых уроках.

Код страницы

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Сравнение чисел через форму</title>
</head>
<body>
  <h1>Сравнение чисел</h1>
  <form action="" method="get">
    <p>Число A: <input type="text" name="a"></p>
    <p>Число B: <input type="text" name="b"></p>
    <p><button type="submit">Сравнить</button></p>
  </form>
<?php
if (isset($_GET['a'], $_GET['b'])
    && $_GET['a'] !== '' && $_GET['b'] !== '') {
    $a = $_GET['a'];
    $b = $_GET['b'];
    if ($a > $b) {
        echo '<p>' . $a . ' больше ' . $b . '</p>';
    } elseif ($a < $b) {
        echo '<p>' . $a . ' меньше ' . $b . '</p>';
    } else {
        echo '<p>' . $a . ' равно ' . $b . '</p>';
    }
}
?>
</body>
</html>

Разберём форму построчно:

  • method="get" — данные формы браузер вложит в адрес (строкой запроса);
  • атрибут name поля — это имя будущего параметра: name="a" превратится в ?a=..., а значение придёт в $_GET['a'];
  • action="" — форма отправляет данные на ту же страницу (в action можно указать и отдельный файл-обработчик);
  • кнопка type="submit" выполняет отправку.

PHP-код ниже формы нам уже знаком по прошлому уроку. Новичком здесь выглядит только лишняя проверка: пустое поле тоже отправляется — как параметр с пустым значением (a=), и isset() его «видит». Поэтому добавлено условие !== '': пока оба поля не заполнены, comparisons не будет.

Отправляем и смотрим в адрес

Откройте http://localhost:19791/lessons/lesson04-form-get/, введите 5 и 7, нажмите «Сравнить». Страница ответит «5 меньше 7» — а главное, посмотрите в адресную строку: там появится ?a=5&b=7. Тот самый адрес, который мы раньше набирали руками, теперь собирает форма.

Что произошло на самом деле

Браузер взял имена и значения полей, собрал из них пары, приклеил их к адресу после знака вопроса и отправил обычный GET-запрос. Для сервера и PHP нет никакой разницы, набрали вы адрес вручную или его собрала форма: параметры точно так же попадают в $_GET. Форма — это просто удобный способ составить адрес с данными.

Попробуйте сами

  • отправьте форму с одним пустым полем — посмотрите, что покажет адресная строка и страница;
  • после отправки поправьте значения прямо в адресной строке и нажмите Enter — результат пересчитается без формы;
  • маленький шаг в HTML: замените у полей type="text" на type="number" — и браузер сам начнёт следить, чтобы вводились числа.

Итоги

  • форма с method="get" собирает адрес: каждое поле становится параметром ?имя=значение;
  • имя параметра задаётся атрибутом name поля;
  • сервер не отличает «ручной» адрес от отправленного формой — данные в любом случае приходят в $_GET;
  • пустое поле отправляется как параметр с пустым значением — не забывайте это проверять.

В следующем уроке переключим форму на метод POST — и увидим, куда «прячутся» данные, если их нельзя передавать в адресе.