Обработка формы в PHP сводится к трем простым задачам: отобразить HTML-форму, прочитать введенные пользователем данные с помощью  $_GET  или  $_POST  и проверить значения перед их использованием. Используйте  GET, когда форма запрашивает информацию (например, строка поиска), так как эти значения передаются в URL. Используйте  POST, когда форма отправляет или изменяет информацию (например, форма обратной связи или страница входа), так как эти значения передаются скрытно в теле запроса. В этом руководстве вы шаг за шагом создадите полноценную форму обратной связи, считаете ее значения в PHP и добавите простую валидацию.

Что происходит при отправке формы пользователем? 

Когда посетитель заполняет форму и нажимает кнопку отправки, браузер собирает имя и значение каждого поля и отправляет их на страницу, указанную в атрибуте  action  формы. Атрибут  method  определяет способ передачи значений. При использовании GET браузер добавляет значения к URL, например  search.php?q=php+tutorial . При использовании POST браузер отправляет значения внутри запроса, поэтому они не отображаются в адресной строке.

На стороне PHP эти значения попадают в два специальных массива, называемых суперглобальными. В официальной документации PHP $_POST описывается как массив переменных, передаваемых скрипту через метод HTTP POST. Значения GET попадают в  $_GET  точно таким же образом. Атрибут  name  поля становится ключом, поэтому поле с именем  email  считывается как  $_POST['email'] .

GET против POST: В чем реальная разница? 

Оба метода отправляют данные на сервер, но они созданы для разных задач. В этой таблице показаны различия, которые действительно важны в повседневной работе:


Критерий GET POST
| Где передаются данные  | В URL, видны всем  | В теле запроса, не видны в URL
| Лучше всего подходит для  | Поиска, фильтров, номеров страниц, ссылок, которыми делятся  | Форм обратной связи, входа, регистрации, оформления заказа, загрузки файлов
| Можно ли добавить в закладки?  | Да, URL содержит значения  | Нет
| Ограничение по размеру  | Ограничено длиной URL (около 2000 символов)  | Гораздо больше, задается сервером
| Безопасно ли для паролей?  | Ни в коем случае — пароль останется в URL и истории браузера  | Да, это правильный выбор (всегда с HTTPS)
| Массив PHP  |  $_GET  |  $_POST 

Простое правило, которое всегда работает: если повторная отправка формы что-то создает или изменяет (сообщение, аккаунт, заказ) — используйте POST. Если форма лишь просит сервер что-то показать, GET подходит идеально и даже лучше, поскольку результирующую страницу можно добавить в закладки и поделиться ею.

Шаг 1: Создание HTML-формы 

Вот небольшая форма обратной связи с тремя полями. Обратите внимание, что каждый элемент input имеет атрибут  name  — без имени PHP ничего не получит для этого поля, что является самой частой ошибкой новичков при работе с формами.

 <form action="contact.php" method="post">
  <label>Your name</label>
  <input type="text" name="name">

  <label>Your email</label>
  <input type="email" name="email">

  <label>Your message</label>
  <textarea name="message" rows="4"></textarea>

  <button type="submit" name="send" value="1">Send message</button>
</form>
 

Часть  method="post"  имеет решающее значение: эта форма отправляет конфиденциальный текст, поэтому POST — правильный метод. Кнопка отправки также имеет имя  send , что позволяет PHP проверить, была ли форма действительно отправлена или страница была просто открыта.

Шаг 2: Чтение значений в PHP 

Теперь перейдем к PHP-части в том же файле  contact.php  или в отдельном. Сначала убедитесь, что форма была отправлена, а затем считайте каждое значение:

 <?php
if (isset($_POST['send'])) {
    $name    = $_POST['name'];
    $email   = $_POST['email'];
    $message = $_POST['message'];

    echo "Thank you, " . $name . ". We received your message.";
}
?>
 

Проверка  isset()  очень важна. Если кто-то откроет  contact.php  напрямую без отправки формы, переменная  $_POST  будет пустой, а чтение несуществующих ключей приведет к предупреждениям. Во многих реальных проектах данные формы считываются именно так — в нашем проекте системы регистрации и входа студентов на PHP используется тот же паттерн для сбора имени, email и пароля студента перед их сохранением.

jLD6lNJ6PBvctoAjL4AFqy3zcFx3bn0OYNX0JUbC.webp

Страница руководства PHP для $_POST. каждое значение, отправляемое вашей формой методом POST, попадает в этот единственный массив.

Шаг 3: Добавление простой валидации 

Никогда не доверяйте данным из форм. Посетитель может отправить пустые поля, поддельный email или слишком длинный текст, а бот — прислать то, о чем ваша форма вообще не просила. Валидация означает проверку каждого значения по простым правилам перед его использованием и вывод понятных ошибок при нарушении правила. Вот тот же скрипт с добавленной валидацией:

 <?php
$errors = [];

if (isset($_POST['send'])) {
    $name    = trim($_POST['name'] ?? '');
    $email   = trim($_POST['email'] ?? '');
    $message = trim($_POST['message'] ?? '');

    if ($name === '') {
        $errors[] = "Please enter your name.";
    }
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "Please enter a valid email address.";
    }
    if (strlen($message) < 10) {
        $errors[] = "Your message should be at least 10 characters long.";
    }

    if (empty($errors)) {
        echo "Thank you, " . htmlspecialchars($name) . ". Your message was received.";
        // Next step: save to database or send an email
    } else {
        foreach ($errors as $error) {
            echo "<p>" . $error . "</p>";
        }
    }
}
?>
 

Здесь основную работу выполняют три небольших инструмента.  trim()  удаляет пробелы с обоих концов, поэтому имя, состоящее только из пробелов, не пройдет проверку на пустоту.  filter_var()  с параметром  FILTER_VALIDATE_EMAIL  проверяет формат email — на странице filter_var() в руководстве PHP перечислены все доступные проверки, включая URL и числа. А  htmlspecialchars()  делает введенные пользователем данные безопасными для вывода, поэтому посетитель не сможет внедрить HTML или скрипты на вашу страницу через форму. Конструкция  ?? ''  возвращает пустую строку при отсутствии ключа, что избавляет код от предупреждений.

Шаг 4 (Необязательно): Сохранение сообщения в базу данных 

Как только значения прошли валидацию, следующим логичным шагом является их сохранение. Если вы уже умеете подключать PHP к базе данных MySQL, сохранение сообщения сводится к одному подготовленному выражению (prepared statement):

 $stmt = $conn->prepare("INSERT INTO messages (name, email, message) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $name, $email, $message);
$stmt->execute();
echo "Message saved successfully.";
 

Всегда используйте подготовленные выражения вместо того, чтобы подставлять значения напрямую в SQL-строку. Подготовленные выражения отделяют пользовательский ввод от запроса, защищая ваш сайт от SQL-инъекций.

Частые ошибки новичков 

 Забывают про атрибут name. Поле input без  name  выглядит нормально в браузере, но ничего не отправляет в PHP.

 Использование GET для формы входа. Пароль появится в URL, в истории браузера и в логах сервера. Формы входа и регистрации всегда должны использовать POST.

 Доверие только проверкам на стороне браузера. HTML-атрибуты вроде  required  и  type="email"  помогают честным пользователям, но любой может их обойти. Всегда выполняйте повторную валидацию в PHP.

 Вывод «сырых» данных. Вывод значений  $_POST  с помощью echo без  htmlspecialchars()  открывает путь к межсайтовому скриптингу (XSS). Всегда экранируйте выводимые данные.

Часто задаваемые вопросы 

Как узнать в PHP, была ли отправлена форма? 

Проверьте кнопку отправки или любое ожидаемое поле с помощью  isset() , например  if (isset($_POST['send'])) . Вы также можете проверить  $_SERVER['REQUEST_METHOD'] === 'POST' , что работает даже тогда, когда у кнопки нет имени.

Может ли одна и та же страница отображать форму и обрабатывать ее? 

Да. Поместите HTML-форму и код обработки PHP в один и тот же файл и установите  action  равным имени этого файла (или оставьте пустым). PHP-блок выполняется только тогда, когда форма отправлена, как показано в примерах выше.

Почему массив $_POST пуст после отправки формы? 

Почти всегда это происходит по одной из трех причин: у формы не задан метод  post , у какого-то поля ввода отсутствует атрибут  name  или  action  указывает на другую страницу, отличную от той, на которой выполняется ваш PHP-код. Проверьте эти три вещи в первую очередь.

Являются ли данные POST полностью безопасными и секретными? 

Нет. POST скрывает данные от URL, но сам по себе не шифрует их. Только HTTPS шифрует данные при передаче, поэтому любой сайт с формами должен использовать HTTPS, и вы все равно обязаны проверять каждое значение на сервере.

Заключение 

Обработка форм в PHP — это небольшой повторяющийся паттерн: создайте форму с именованными полями, выберите GET для запросов и POST для отправки, проверьте с помощью  isset() , что форма была отправлена, очистите значения с помощью  trim() , валидируйте их с помощью простых правил и  filter_var() , а также экранируйте все, что выводите, с помощью  htmlspecialchars() . Освоив этот единственный паттерн, вы сможете уверенно создавать формы обратной связи, поля поиска, формы входа и страницы регистрации — практически любой проект на PHP начинается именно отсюда.