Поля ввода PHP-форм: создание и обработка с примерами

Раздел: Веб-разработка на PHP -> Элементы форм

Поля ввода в формах PHP: обработка и валидация

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

Пример базовой обработки:

<?php
$errors = [];
$name = '';
$email = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
if (empty($name)) {
$errors[] = 'Имя обязательно';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'Некорректный email';
}
if (empty($errors)) {
// сохранение данных
}
}
?>

Php формы input (поля ввода в формах php)

Пояснение: в строках 1-3 инициализируются переменные. Строка 5 проверяет метод запроса. Строки 6-7 получают значения с оператором ?? для избежания предупреждений. Строки 9-14 выполняют валидацию. Если ошибок нет, выполняется сохранение.

Типичные проблемы:

Не проверять метод запроса - ошибки появляются при первом GET-запросе. Решение: следует проверять $_SERVER['REQUEST_METHOD']. Использование $_REQUEST вместо $_POST делает код уязвимым. Решение: явно указывать массив.

Как обрабатывать различные типы полей ввода в PHP?

Разные типы input (text, email, password, checkbox, radio, file) требуют индивидуального подхода.

Примеры обработки:

<?php
// text
$name = htmlspecialchars(trim($_POST['name'] ?? ''));
// email
$email = filter_var(trim($_POST['email'] ?? ''), FILTER_VALIDATE_EMAIL);
// password - не выводить обратно в HTML
$password = $_POST['password'] ?? '';
// checkbox
$agree = isset($_POST['agree']) ? 1 : 0;
// radio
$gender = $_POST['gender'] ?? '';
// file
if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
$tmp = $_FILES['avatar']['tmp_name'];
$name = basename($_FILES['avatar']['name']);
move_uploaded_file($tmp, 'uploads/' . $name);
}
?>

Ошибки:

Не проверять код ошибки файла - может быть пустой массив. Решение: следует проверять error. Для пароля никогда не выводить значение в value формы.

Как использовать встроенные фильтры PHP для проверки данных?

PHP предоставляет функции filter_var, filter_input, filter_var_array, которые упрощают валидацию и очистку.

<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
if ($email === false || $age === false) {
// обработка ошибки
}
?>

Фильтры возвращают false при невалидных данных, null если поле отсутствует, иначе отфильтрованное значение.

Проблема:

Путаница между false и нулевыми значениями. Решение: строгое сравнение === false.

Как сохранить введенные данные в полях после отправки?

При ошибках валидации необходимо отобразить ранее введённые значения, чтобы пользователь не вводил заново. Используется атрибут value с функцией htmlspecialchars.

<input type='text' name='name' value='<?= htmlspecialchars($name) ?>'>
<input type='checkbox' name='agree' value='1' <?= $agree ? 'checked' : '' ?>>

Для radio и select аналогично проверяется текущее значение.

Ошибка:

Отсутствие экранирования при выводе приводит к XSS. Решение: всегда использовать htmlspecialchars.

Как обработать несколько полей с одинаковыми именами?

Для checkbox с выбором нескольких вариантов или select multiple можно использовать имя с квадратными скобками, например name='hobbies[]'. В PHP это становится массивом.

<!-- HTML -->
<input type='checkbox' name='hobbies[]' value='books'> Книги
<input type='checkbox' name='hobbies[]' value='music'> Музыка
<?php
$hobbies = $_POST['hobbies'] ?? [];
if (is_array($hobbies)) {
foreach ($hobbies as $hobby) {
// валидация и фильтрация
}
}
?>

Проблема:

Подделка запроса может отправить строку, а не массив. Решение: проверять is_array($hobbies).

Фильтрация всех POST данных с помощью filter_var_array

Этот подход позволяет применить фильтры ко всем полям формы одной функцией, значительно сокращая код.

Пример
<?php
$filters = [
'name' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 150]],
'agree' => FILTER_VALIDATE_BOOLEAN
];
$data = filter_input_array(INPUT_POST, $filters);
// $data['email'] будет false, если email невалидный
// $data['age'] будет false, если не число или вне диапазона
// $data['agree'] будет true/false/null
?>

Результат: в переменной $data массив с отфильтрованными значениями.

Array
(
[name] => John
[email] => john@example.com
[age] => 30
[agree] => true
)

Загрузка нескольких файлов с проверкой типа и размера

Для загрузки нескольких файлов используется атрибут multiple в input. Ниже показан пример с проверкой MIME-типа и лимитом размера.

Пример
<!-- HTML -->
<form method='post' enctype='multipart/form-data'>
<input type='file' name='photos[]' multiple accept='image/*'>
<button type='submit'>Загрузить</button>
</form>
Пример
<?php
$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];
$max_size = 5 * 1024 * 1024; // 5 MB
if (isset($_FILES['photos'])) {
foreach ($_FILES['photos']['error'] as $key => $error) {
if ($error === UPLOAD_ERR_OK) {
$tmp = $_FILES['photos']['tmp_name'][$key];
$name = basename($_FILES['photos']['name'][$key]);
$size = $_FILES['photos']['size'][$key];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $tmp);
finfo_close($finfo);
if (in_array($mime, $allowed_types) && $size <= $max_size) {
move_uploaded_file($tmp, 'uploads/' . $name);
} else {
$errors[] = "Файл $name не прошёл проверку";
}
}
}
}
?>

Результат: выбранные файлы загружаются в папку uploads после проверки.

Файлы: photo1.jpg, photo2.png успешно загружены.

Поля ввода в формах PHP - comments

En
Php формы input (php)