|
| ||||||||||||||||||
PHP и WEB для новичков (часть 10):Автор: Владислав Демьянишин
Формы, адресная строка, загрузка файловАвтор: Владислав Демьянишин
До сих пор мы рассматривали скрипты, реализующие какой-то вывод или чтение-запись в файл или БД. Однако в большинстве случаев скрипт должен взаимодействовать с посетителем, просматривающим веб-страницу.
Это взаимодействие главным образом осуществляется через формы и параметры адресной строки (URL) – в скрипт передаются параметры из формы или из ссылки.
Передача данных через адресную строкуРассмотрим передачу параметров через строку адреса. Происходит это так: ссылка может содержать как просто адрес веб-страницы, так и некоторые параметры после нее. В результате чего их значения будут доступны внутри скрипта в виде одноименных переменных.
Например, если зайти по ссылке http://multimedia/test_url.php?a=10&b=5, то выполнится скрипт test_url.php, внутри которого будут определены две переменные $a со значением 10 и $b со значением 5. Обратите внимание, что в ссылке первая переменная отделяется от имени скрипта знаком вопроса, а все остальные знаком "&" (амперсанд).
Как же это работает? Сначала, чтобы обеспечить работоспособность этого механизма, необходимо в файле z:/home/multimedia/www/.htaccess (мы создавали его в самом начале курса), исправить строку
php_flag register_globals off
на
php_flag register_globals on
тогда скрипт test_url.php:
<?
echo "a: ".$a."<br/>n";
echo "b: ".$b."<br/>n";
?>
отобразит в браузере
a: 10
b: 5
а исходный HTML-код будет выглядеть
a: 10<br/>
b: 5<br/>
Попробуйте поэкспериментировать со значениями переменных в строке адреса. Можно заметить следующие особенности. Во-первых, все символы кириллицы, пробелы и д.р. при открытии заменяются на соответствующие ASCII-коды.
Например, литера "я" будет замещена строкой "%FF", но для скрипта эта замена будет прозрачной, и литера все равно будет воспринята как "я" и в таком виде запишется в переменную. Пробелы в URL заменяются на "%20" (думаю, вы уже замечали подобное в интернете), и так далее.
Во-вторых, если мы используем Денвер и не укажем в URL переменных a и b, то получим уведомления (Notice) от PHP-сервера, например, такое:
Notice: Undefined variable: a in z:/home/multimedia/www/test_url.php on line 3
[Денвер: показать возможную причину ошибки]a:
Notice: Undefined variable: b in z:/home/multimedia/www/test_url.php on line 4
b:
Это происходит потому, что мы пытаемся обращаться к переменной, о которой на данный момент ничего не известно скрипту, ведь значение ей не присвоено. В таком случае PHP считает, что переменная содержит пустую строку и выдает замечание про неинициализированную (неопределенную) переменную.
Этого можно избежать несколькими путями. Первый - это уже известный метод игнорирования предупреждений об ошибках - символ @. Его следует указывать перед именем проблемной переменной, приблизительно так:
<?
echo "a: ".@$a."<br/>n";
echo "b: ".@$b."<br/>n";
?>
Второй метод, который обычно используется - это настройка PHP таким образом, чтобы замечания Notice не выдавались вообще. На самом деле PHP может выдавать несколько уровней предупреждений об ошибках.
Notice (замечание) не являются серьезными ошибками и в большинстве случаев их можно игнорировать.
Warning (предупреждения) уже считаются более серьезным случаем и чаще всего означают некоторую ошибку в коде (но скрипт после такой ошибки может выполняться дальше).
Fatal Error (фатальная ошибка) приводит к остановке выполнения скрипта.
Настройка параметров PHP выполняется, например, при помощи файла настройки сервера Apache - .htaccess. Этот файл (имя с точкой в начале) следует создать в папке, где находятся скрипты, и вписать в него строки конфигурации (у нас он уже существует). Например, строка:
php_value error_reporting 7
приводит к тому, что будут выводиться предупреждения только типа Warning и Fatal Error, а замечания Notice нет. Если в скрипте появляется ошибка, которую трудно найти (например, неверное имя переменной), то можно временно включить показ Notice, изменив эту строку на
php_value error_reporting 8
Уровень 8 установлен в Денвере по умолчанию. Разумеется, можно вообще выключить как Warning, так и Fatal Error, установив этот параметр в нуль. Но в большинстве случаев так делать не рекомендуется.
На самом деле этот механизм прозрачного превращения параметров URL в переменные внутри скрипта не является обязательным. Он называется Register Globals (регистрация глобальных переменных) и иногда дает простор для взлома сайтов. Для более высокого уровня безопасности его обычно выключают в .htaccess так:
php_flag register_globals off
Некоторые конфигурации серверов, на которых работает PHP, имеют register_globals off с самого начала и это правильно. Если попробовать выполнить пример с таким значением register_globals, то в переменных $a и $b получим пустые строки.
В таком случае значения параметров URL получают другим путем. Об этой возможности я рассказал лишь для того, чтобы вы были в курсе и могли обезопасить свой сайт от взлома.
Глобальный массив $_GETСуществуют несколько глобальных массивов, содержащих параметры, преданные в скрипт. Для получения параметров адресной строки это массив $_GET. Пример для выключенного register_globals (разумеется, он будет работать и при включенном) имеет такой вид:
<?
echo "a = ".$_GET["a"]."<br />n";
echo "b = ".$_GET["b"]."<br />n";
?>
То есть $_GET - это ассоциативный массив, ключами которого являются имена переменных, а значениями их значения. Это весьма часто оказывается кстати, когда мы не знаем точно какие переменные должны передаваться через URL. В этом случае мы можем узнать их имена по ключам $_GET. Такой пример:
<?
echo "через URL в скрипт передано: ".
count($_GET)." переменных<br />n";
echo "эти переменные:<br />n";
foreach($_GET as $key => $value) echo "$key = '$value'<br />n";
?>
выведет все параметры URL с именами и значениями:
через URL в скрипт передано: 2 переменных
эти переменные:
a = '10'
b = '5'
Если необходимо просто проследить, что получено на входе скрипта, то рекомендую на случай отладки более компактный способ:
<?
echo "<pre>";
var_dump($_GET);
echo "</pre>";
?>
который выдаст
array(2) {
["a"]=>
string(2) "10"
["b"]=>
string(1) "5"
}
и еще один способ
<?
echo "<pre>";
print_r ($_GET);
echo "</pre>";
?>
и выдаст он
Array
(
[a] => 10
[b] => 5
)
ФормыЕсли это понятно, то давайте перейдем к передаче данных через URL при помощи форм. Напомню, что представляет собой HTML-форма. Это несколько полей ввода данных, находящихся между тегами <form>...</form>.
В теге <form> также указываются атрибуты action (путь к скрипту, который должен обработать данные формы после того, как она сработала), name (имя формы) и method (метод передачи значений полей формы в скрипт).
Поскольку пока что нам известно лишь о передаче значений через URL, метод формы будем указывать "get". Т.е. пример:
<html>
<body>
<form name="myform" action="test_get.php" method="get">
<input type="text" name="testfield" />
<input type="submit" value="Отправить" />
</form>
</body>
</html>
выглядит в браузере так (рис. 13):
Рис. 13
В случае нажатия на клавишу "Отправить" будет выполнена отправка данных из формы. Т.е. все значения ее полей будут переданы скрипту, заданному в action формы. В данном случае скрипт test_get.php, а поля формы - единственное поле testfield.
Если ввести в это поле текст "Hello" и нажать на кнопку "Отправить", то браузер просто откроет страницу с адресом http://multimedia/test_get.php?testfield=Hello.
С простыми формами, думаю, все понятно. Но не редко при веб-программировании приходится сталкиваться с передачей сложных данных, или структурированных. Допустим, наша форма имеет вид (рис. 14):
<form name="form1" action="test_get.php" method="get">
<INPUT TYPE="radio" NAME="answer" VALUE="Yes" CHECKED> Да
<INPUT TYPE="radio" NAME="answer" VALUE="No"> Нет
<INPUT TYPE="radio" NAME="answer" VALUE="Possible"> Возможно
<input type="submit" value="Ответить">
</form>
Рис. 14
тогда в результате отправки формы скрипт получит значения Yes, No или Possible и выглядеть это будет, например, так:
Array
(
[answer] => No
)
Предположим, что необходимо предоставить посетителю многовариантный выбор, и при этом, чтобы из списка можно было выбрать одновременно несколько вариантов и отослать.
В каком же виде, в таком случае, могут быть получены результаты выбора? Пускай наша форма выглядит следующим образом (рис. 15):
<form name="zakaz" action="test_get.php" method="get">
<INPUT TYPE="checkbox" NAME="comp[]" VALUE="CPU">Процессоры
<INPUT TYPE="checkbox" NAME="comp[]" VALUE="Video" CHECKED>Видеоадаптеры
<INPUT TYPE="checkbox" NAME="comp[]" VALUE="Scan"> Сканеры
<INPUT TYPE="checkbox" NAME="comp[]" VALUE="Modem" CHECKED>Модемы
<input type="submit" value="Выбрать">
</form>
Рис. 15
Прошу заметить, что атрибуту NAME всех checkbox'ов присваивается одно и то же имя, причем с квадратными скобками. Это указывает браузеру на то, что результат может иметь целый список значений.
Тогда, если посетитель выберет варианты: Видеоадаптеры, Сканеры и Модемы, то данные возвратятся в виде массива comp с тремя элементами:
Array
(
[comp] => Array
(
[0] => Video
[1] => Scan
[2] => Modem
)
)
а следующий PHP-скрипт обработки формы
<?
if (!count($_GET)) exit;
$acomp = @$_GET["comp"];
echo "comp: $acomp<BR>";
echo "count: ".count($acomp)."<BR>";
reset($acomp);
while (list ($key, $val) = each ($acomp))
echo "$key => $val<BR>";
?>
наглядно проиллюстрирует нам, в какой удобной форме поступают данные и как просто их обрабатывать. Скрипт выдаст следующее:
comp: Array
count: 3
0 => Video
1 => Scan
2 => Modem
Это свидетельствует о том, что в переменной $acomp был получен массив с тремя элементами, и если обращаться к массиву через ассоциативную схему, то все получается просто.
Аналогичным образом можно осуществить выбор нескольких пунктов в списке <SELECT>. При этом можно выбирать подряд несколько пунктов, удерживая левую клавишу мышки, либо удерживая клавишу CTRL кликать по нужным пунктам, разбросанным по списку. Тогда следующая форма (рис. 16):
<form name="variants" action="test_get.php" method="get"><SELECT multiple="multiple" size="16" name="topics[]">
<OPTION value="0" selected>Все варианты</OPTION>
<OPTION value="1">Вариант 1</OPTION>
<OPTION value="2">Вариант 2</OPTION>
<OPTION value="3">Вариант 3</OPTION>
…
</SELECT>
<input type="submit" value="Выбрать">
</form>
Рис. 16
позволит получить нам желаемое.
Передача параметров через URL имеет свои существенные преимущества, когда необходимо передать в скрипт одну или несколько переменных небольшой длины. Еще одним преимуществом является то, что при таком способе отправки параметров можно совершенно обойтись и без формы, просто формируя эквивалентную ссылку.
Тем не менее, такой подход имеет и недостатки, например, то, что длина URL ограничена приблизительно 1200 символами и не позволит передать достаточно большой текст.
Кроме того, такие адреса остаются в истории (журнале) браузера и, если логин, пароль или любая другая личная информация была передана таким открытым способом, то каждый любопытный сможет заполучить ее.
Глобальный массив $_POSTВ таких случаях применяют формы с другим методом передачи данных - post. При этом параметры так же передаются из формы в скрипт, но в URL они не попадают, а сразу поступают в массив $_POST внутри скрипта.
Разумеется, если включен register_globals, то эти параметры сразу же превращаются в одноименные переменные внутри скрипта. Но лучше не рассчитывать на register_globals, а обращаться к ним через массив $_POST.
Например, если в предыдущих четырех примерах заменить method="get" на method="post", а $_GET на $_POST, то скрипт будет работать точно так же, но в строке адреса передаваемые данные "светиться" не будут.
Глобальные массивы $HTTP_*_VARSДолжен упомянуть о глобальных массивах $HHTP_GET_VARS и $HHTP_POST_VARS, которые являются устаревшими аналогами массивов $_GET и $_POST.
В настройках PHP есть опция register_long_arrays, которая определяет, следует ли регистрировать устаревшие длинные предопределенные переменные типа $HTTP_*_VARS.
У некоторых хостинг-провайдеров ее значение по умолчанию "Off", так как сами разработчики PHP рекомендуют отключить эти длинные переменные из соображений производительности. Вместо них следует использовать суперглобальные массивы, например, $_GET и $_POST.
Если же необходимо все-таки использовать переменные вида $HTTP_*_VARS, то в этом случае можно создать (или отредактировать) в нужной директории файл .htaccess, содержащий такую строку:
php_flag register_long_arrays On
Переменная $_POST появилась в PHP 4.1.0. В более ранних версиях используется $HTTP_POST_VARS. Следить надо за совместимостью переменных и функций.
Переменная окружения $QUERY_STRINGЕще одним способом получения данных является системная переменная $QUERY_STRING, ее значение можно получить еще конструкцией getenv("QUERY_STRING"). Если выполнить скрипт http://multimedia/test_url.php?a=10&b=5 с кодом
<?
echo $QUERY_STRING;
?>
то получим строку
a=10&b=5
Это происходит потому, что $QUERY_STRING возвращает содержимое адреса странички, начиная с первого символа после знака вопроса.
ВАЖНО! Обычно на хостинге register_globals заблокировано в целях безопасности. Поэтому, чтобы механизм $QUERY_STRING работал, надо в каталоге создать файл php.ini со строкой:
register_globals = on
либо в уже упоминавшийся файл .htaccess вписать:
php_flag register_globals on
Команда extractХочу подсказать одну удобную команду, которая позволяет импортировать переменные из массива в текущую символьную таблицу. extract() возвращает количество переменных, успешно импортированных в символьную таблицу.
int extract ( array var_array [, int extract_type [, string prefix> )
Эта функция используется для импорта переменных из массива в текущую символьную таблицу. Она берет ассоциативный массив в качестве параметра var_array и трактует его ключи как имена переменных и значения как значения переменных.
Для каждой пары ключ-значение будет создана переменная в текущей символьной таблице, согласно параметрам extract_type и prefix. Что это означает?
Т.е. вызов конструкции, например, extract($_POST) создаст переменные, одноименные параметрам, переданным через форму. А это, в свою очередь, избавит от необходимости обращаться за каждым параметром к массиву $_POST.
Продолжение следует…
© Владислав Демьянишин
Вы находитесь на официальном сайте Владислава Демьянишина - разработчика игры Dune IV (Dune 4). На нашем сайте Вы можете бесплатно скачать игры Dune IV (Dune 4), Battle City (Танчики с Dendy/Nintendo), читы к играм и многое другое. Также Вы можете скачать бесплатно программы и полезные утилиты. Все программы чистые, т.е. не содержат вирусов и иного вредоносного ПО.
Среди доступных программ есть мобильная читалка книг, менеджер переноса файлов с фото- и видеокамер на компьютер, текстовый редактор, WYSIWYG редактор, 3D аниматор, GIF аниматор, AVI аниматор, пакетный конвертор изображений, редактор электрических схем, программа для скриншотов, диспетчер тем рабочего стола и другие.
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ.
Журнал > Программирование > PHP и WEB для новичков (HTML, JavaScript, PHP, MySQL) > PHP и WEB для новичков (часть 10): Формы, адресная строка, загрузка файлов
| |||||||||||||||||||
|
|||||||||||||||||||