Обработка форм в php
PHP позволяет обрабатывать данные, которые пользователь ввел в поля формы. После активации кнопки submit данные отправляются на страницу – обработчик, указанную в поле action элемента <form>. На странице – обработчике располагается PHP скрипт, который выполняет определенные операции над полученными данными, например формирует и отсылает письмо по указанным пользователем реквизитам.
Данные из формы передаются на сервер как последовательность пар имя/значение. Это значит, что имя каждого элемента формы (появляющееся в атрибуте NAME тега) связывается со значением этого элемента (введеным или выбранным пользователем). Формат имя/значение, используемый для передачи, имеет вид имя=значение.
Данные, передаваемые из формы в программу–обработчик располагаются в следующих суперглобальных массивах: $_GET, $_POST, и $_REQUEST.
$_GET[] — содержит все значения, передаваемые методом GET.
$_POST[] – содержит все значения, передаваемые методом POST.
$_REQUEST[] – содержит все значения, передаваемые методами POST и GET.
Также существуют следующие суперглобальные массивы:
$_SERVER – a hash of variables set specifically by the web server, and relevant to the execution of the program
$_ENV – a hash of variables related to the host machine and it’s configuration
$_SESSION – a hash of variables that are meant to be persisted between page views or separate application executions
$_COOKIE – a hash of variables that are to be stored with the client
$_FILES – a special type of request hash that holds input data related to an uploaded set of files
Далее создадим небольшую форму, которая потребуется нам для работы с обработчиком, который мы создадим поздне:
<form action="process.php" method="post">
Имя :
<input type="text" name="FName"/>
Фамилия:
<input type="text" name="LName"/>
Город :
<input type="text" name="City"/>
Сообщение:
<textarea name="Message" cols="30" rows="5">
</textarea>
<input type="submit" name="submit" value="Отправить"/>
</form>
После нажатия на кнопку submit данной формы все данные передаются обработчику process.php. Так как в этой форме используется метод POST, то все переменные будут расположенны внутри массива $_POST.
Теперь создадим обработчик: process.php
<?php
echo "Имя: <font color="green"> " . $_POST["FName"] . "</font><br/>";
echo "Фамилия: <strong> " . $_POST["LName"] . "</strong><br/>";
echo "Город: <em> " . $_POST["City"] . "</em><br/>";
echo "<br/>";
echo "Ваше сообщение : " . $_POST["Message"];
?>
Расположим этот файл внутри директории со страницей формы. Теперь при использовании формы данные передадутся обработчику, который выведет на экран сообщение, содержащее пользовательские данные.
Загрузка файла на сервер
Страница для загрузки файлов может быть реализована при помощи специальной формы, которая выглядит примерно так:
<!-- Тип кодирования данных, enctype, ДОЛЖЕН БЫТЬ указан ИМЕННО так -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
<!-- Поле MAX_FILE_SIZE должно быть указано до поля загрузки файла -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<!-- Название элемента input определяет имя в массиве $_FILES -->
Отправить этот файл: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
В приведенном выше примере __URL__ необходимо заменить ссылкой на PHP-скрипт.
Скрытое поле MAX_FILE_SIZE (значение необходимо указывать в байтах) должно предшествовать полю для выбора файла, и его значение является максимально допустимым размером принимаемого файла в PHP. Рекомендуется всегда использовать эту переменную, так как она предотвращает тревожное ожидание пользователей при передаче огромных файлов, только для того, чтобы узнать, что файл слишком большой и передача фактически не состоялась. Помните, обойти это ограничение на стороне браузера достаточно просто, следовательно, вы не должны полагаться на то, что все файлы большего размера будут блокированы при помощи этой возможности. Это по большей части удобная возможность для пользователей клиентской части вашего приложения. Тем не менее, настройки PHP (на сервере) касательно максимального размера обойти невозможно.
Замечание: Также следует убедиться, что в атрибутах формы вы указали enctype="multipart/form-data", в противном случае загрузка файлов на сервер выполняться не будет.
Суперглобальный массив $_FILES доступен начиная с PHP 4.1.0 (В более ранних версиях используйте вместо него $HTTP_POST_FILES). Эти массивы будут содержать всю информацию о загруженных файлах.
Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что здесь предполагается использование имени userfile для поля выбора файла, как и в приведенном выше примере. На самом деле имя поля может быть любым.
$_FILES['userfile']['name']
Оригинальное имя файла на компьютере клиента.
$_FILES['userfile']['type']
Mime-тип файла, в случае, если браузер предоставил такую информацию. Пример: "image/gif". Этот mime-тип не проверяется в PHP, так что не полагайтесь на его значение без проверки.
$_FILES['userfile']['size']
Размер в байтах принятого файла.
$_FILES['userfile']['tmp_name']
Временное имя, с которым принятый файл был сохранен на сервере.
$_FILES['userfile']['error']
Код ошибки, которая может возникнуть при загрузке файла. Этот элемент был добавлен в PHP 4.2.0
По умолчанию принятые файлы сохраняются на сервере в стандартной временной папке до тех пор, пока не будет задана другая директория при помощи директивы upload_tmp_dir конфигурационного файла php.ini. Директорию сервера по умолчанию можно сменить, установив переменную TMPDIR для окружения, в котором выполняется PHP. Установка этой переменной при помощи функции putenv() внутри PHP-скрипта работать не будет. Эта переменная окружения также может использоваться для того, чтобы удостовериться, что другие операции также работают с принятыми файлами.
Следующий пример принимает и обрабатывает загруженный при помощи формы файл:
<?php
// В PHP 4.1.0 и более ранних версиях следует использовать $HTTP_POST_FILES
// вместо $_FILES.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "Файл корректен и был успешно загружен.\n";
} else {
echo "Возможная атака с помощью файловой загрузки!\n";
}
echo 'Некоторая отладочная информация:';
print_r($_FILES);
print "</pre>";
?>
PHP-скрипт, принимающий загруженный файл, должен реализовывать логику, необходимую для определения дальнейших действий над принятым файлом. Например, вы можете проверить переменную $_FILES['userfile']['size'], чтобы отсечь слишком большие или слишком маленькие файлы. Также вы можете использовать переменную $_FILES['userfile']['type'] для исключения файлов, которые не удовлетворяют критерию касательно типа файла, однако, принимайте во внимание, что это поле полностью контролируется клиентом, используйте его только в качестве первой из серии проверок. Начиная с PHP 4.2.0, вы можете использовать $_FILES['userfile']['error'] и коды ошибок при реализации вашей логики. Независимо от того, какую модель поведения вы выбрали, вы должны удалить файл из временной папки или переместить его в другую директорию.
В случае, если при отправке формы файл выбран не был, PHP установит переменную $_FILES['userfile']['size'] значением 0, а переменную $_FILES['userfile']['tmp_name'] - пустой строкой. none.
По окончанию работы скрипта, в случае, если принятый файл не был переименован или перемещен, он будет автоматически удален из временной папки.
PHP поддерживает возможность передачи массива из HTML в том числе и с файлами.
<form action="" method="post" enctype="multipart/form-data">
<p>Изображения:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Отправить" />
</p>
</form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
