Работа с формами
Для передачи данных от пользователя Web-страницы на сервер используются HTML-формы. Для работы с формами в PHP предусмотрен ряд специальных средств.
Предварительно определенные переменные
В PHP существует ряд предварительно определенных переменных, которые не меняются при выполнении всех приложений в конкретной среде. Их также называют переменными окружения или переменными среды. Они отражают установки среды Web-сервера Apache, а также информацию о запросе данного браузера. Есть возможность получить значения URL, строки запроса и других элементов HTTP-запроса.
Все предварительно определенные переменные содержатся в ассоциативном массиве $GLOBALS. Кроме переменных окружения этот массив содержит также глобальные переменные, определенные в программе.
Пример 1
<html>
<head>
<title>Просмотр массива $GLOBALS</title>
</head>
<body>
<?php
$a = "Hello!";
foreach ( $GLOBALS as $key=>$value )
echo "\$GLOBALS[\"$key\"] == $value<br>";
?>
</body>
</html>
В результате на экране появится список всех глобальных переменных, включая переменные окружения. Наиболее часто используемые из них:
Переменная | Описание | Cодержание |
---|---|---|
$_SERVER['HTTP_USER_AGENT'] | Название и версия клиента | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 |
$_SERVER['REMOTE_ADDR'] | IP-адрес | 31.173.241.82 |
getenv('HTTP_X_FORWARDED_FOR') | Внутренний IP-адрес клиента | |
$_SERVER['REQUEST_METHOD'] | Метод запроса (GET или POST) | GET |
$_SERVER['QUERY_STRING'] | При запросе GET закодированные данные, передаваемые вместе с URL | |
$_SERVER['REQUEST_URL'] | Полный адрес клиента, включая строку запроса | |
$_SERVER['HTTP_REFERER'] | Адрес страницы, с которой был сделан запрос | https://htmlweb.ru/php/php6.php |
$_SERVER['PHP_SELF'] | Путь к выполняемой программе | /index.php |
$_SERVER['SERVER_NAME'] | Домен | htmlweb.ru |
$_SERVER['REQUEST_URI'] | Путь | /php/php_form.php |
Обработка ввода пользователя
PHP-программу обработки ввода можно отделить от HTML-текста, содержащего формы ввода, а можно расположить на одной странице.
Пример 2
<?php
if ( ! isset( $cardnumber ) )
$m = "Введите номер карточки";
elseif ( $cardnumber == "" )
$m = "Ваш номер пуст!";
else
$m = "Ваш номер: $cardnumber";
?>
<html>
<head>
<title>Пример обработки ввода</title>
</head>
<body>
<h1><?php echo $m?></h1>
<form name="form1" action="<?=$_SERVER['PHP_SELF']?>" method="post">
<p>Номер карточки:
<input name="cardnumber" type="text" size="20">
</form>
</body>
</html>
Здесь отсутствует кнопка передачи данных, т.к. форма, состоящая из одного поля, передается автоматически при нажатии клавиши <Enter>.
При обработки элемента с многозначным выбором для доступа ко всем выбранным значениям нужно к имени элемента добавить пару квадратных скобок. Для выбора нескольких эллементов следует удерживать клавишу Ctrl.
Пример 3.1
Файл ex.htm
<html>
<head>
<title>Список</title>
</head>
<body>
<form name="form1" action="ex1.php" method="post">
<select name="Item[]" size=5 multiple>
<option>Чай
<option>Кофе
<option>Молоко
<option>Ветчина
<option>Сыр
</select>
<input type="submit" value="ВВОД">
</form>
</body>
</html>
Пример 3.2
Файл ex.php
<html>
<head>
<title>Обработка списка из файла ex1.htm</title>
</head>
<body>
<?php
echo "Ваш заказ: <p><ul>";
foreach ( $Item as $value ) echo "<li>$value";
echo "</ul>";
?>
</body>
</html>
Пример 4. Прием значений от checkbox-флажков
<?php
if (@$_REQUEST['doGo']) {
foreach (@$_REQUEST['known'] as $k=>$v) {
if($v) echo "Вы знаете язык программирования $k!<br>";
else echo "Вы не знаете языка программирования $k. <br>";
}
}
?>
<form action="<?=$_SERVER['SCRIPT_NAME']?>" method="post">
Какие языки программирования вы знаете?<br>
<input type=hidden name="known[PHP]" value="0">
<input type=checkbox name="known[PHP]" value="1"> PHP<br>
<input type=hidden name="known[Perl]" value="0">
<input type=checkbox name="known[Perl]" value="1"> Perl<br>
<input type=submit name="doGo" value="Go!">
</form>
Пример 5
<?php // Модель скрипта, принимающего текст от пользователя.
if (@$_REQUEST['text'])
echo htmlspecialchars($_REQUEST['text'])."<hr>";
?>
<form action="<?=$_SERVER['SCRIPT_NAME']?>" method="post">
<textarea name="text" cols="60" rows="10">
< ?=@htmlspecialchars($_REQUEST['text'])?>
</textarea><br>
<input type="submit">
</form>
Можно обрабатывать формы, не заботясь о фактических именах полей.
Для этого можно использовать (в зависимости от метода передачи) ассоциативный массив $HTTP_GET_VARS или $HTTP_POST_VARS. Эти массивы содержат пары имя/значение для каждого элемента переданной формы. Если Вам все равно, Вы можете использовать ассоциативный массив $_REQUEST.
Пример 6
<html>
<head>
<title>Обработка произвольного ввода
независимо от метода передачи</title>
</head>
<body>
<?php
$params = ( $_SERVER['REQUEST_METHOD'] == "GET" )
? $HTTP_GET_VARS : $HTTP_POST_VARS;
foreach ( $params as $key=>$value )
echo "$key == $value<br>";
?>
</body>
</html>
Пример 7. Обработка нажатия на кнопку с использованием оператора '@'.
<?php
if (@$_REQUEST['submit']) echo "Кнопка нажата!"
?>
<form action="<?=$_SERVER['SCRIPT_NAME']?>">
<input type="submit" name="submit" value="Go!">
</form>
С помощью функции header(), послав браузеру заголовок "Location", можно перенаправить пользователя на новую страницу.
Например:
<? header("Location: ex2.php"); ?>
Передача файла на сервер. UpLoad
PHP позволяет передавать на сервер файлы. HTML-форма, предназначенная для передачи файла, должна содержать аргумент enctype="multipart/form-data".
Кроме того в форме перед полем для копирования файла должно находиться скрытое поле с именем max_file_size. В это скрытое поле должен быть записан максимальный размер передаваемого файла (обычно не больше 2 Мбайт).
Само поле для передачи файла - обычный элемент INPUT с аргументом type="file".
Например:
<form enctype="multipart/form-data"
action="<?echo $_SERVER['PHP_SELF']?>" method="post">
<input type="hidden" name="max_file_size" value="51200">
<input type="file" name="myfile"><br>
<input type="submit" value="ВВОД">
</form>
После того, как файл передан на сервер, он получает уникальное имя и сохраняется в каталоге для временных файлов. Полный путь к файлу записывается в глобальную переменную, имя которой совпадает с именем поля для передачи этого файла. Кроме этого PHP сохраняет еще некоторую дополнительную информацию о переданном файле в других глобальных переменных:
Переменная | Описание |
---|---|
$_FILES['userfile']['name'] | оригинальное имя файла, такое, каким его видел пользователь, выбирая файл |
$_FILES['userfile']['type'] | mime/type файла, к примеру, может быть image/gif; это поле полезно сохранить, если Вы хотите предоставлять интерфейс для скачивания загруженных файлов |
$_FILES['userfile']['size'] | размер загруженного файла |
$_FILES['userfile']['tmp_name'] | полный путь к временному файлу на диске |
$_FILES['userfile']['error'] | код ошибки, который равен 0, если операция прошла успешно |
Пример 8
<html>
<head>
<title>Обработка переданного файла</title>
</head>
<?php
if ( isset( $_FILES['userfile']['tmp_name'] ) )
{
echo "путь: ".$_FILES['userfile']['tmp_name']."<br>";
echo "имя: ".$_FILES['userfile']['name']."<br>";
echo "размер: ".$_FILES['userfile']['size']."<br>";
echo "тип: ".$_FILES['userfile']['type']."<br>";
}
?>
<body>
<form enctype="multipart/form-data"
action="<?echo $_SERVER['PHP_SELF']?>" method="post">
<input type="hidden" name="max_file_size" value="51200">
<input type="file" name="userfile"><br>
<input type="submit" value="ВВОД">
</form>
</body>
</html>