http://sulfurzona.ru/
News
Service
Magazine
Software (Battle City Game, Wallpaper manager, Superpad, VG-NOW, Puzzle Game, Netler Internet Browser, ..)
Wing-Thunder Game (fly simulator)
Dune Game (Dune III, Dune IV, Cheats, Forum, ..)
Games free
Turbo Pascal (Assembler, Docs, Sources, Debbugers, ..)
Books (Docs for developers)
Guest book
Компьютерная диагностика двигателя автомобиля (адаптер К-линии)Компьютерная диагностика двигателя автомобиля (адаптер К-линии)
 
 
Скачать игру Крыло-Гром (Wing-Thunder) бесплатно
 
 

PHP и WEB для новичков (часть 10):

 
Автор: Владислав Демьянишин
 

Формы, адресная строка, загрузка файлов

 
Автор: Владислав Демьянишин
 
PHP и WEB для новичков
До сих пор мы рассматривали скрипты, реализующие какой-то вывод или чтение-запись в файл или БД. Однако в большинстве случаев скрипт должен взаимодействовать с посетителем, просматривающим веб-страницу.
 
Это взаимодействие главным образом осуществляется через формы и параметры адресной строки (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.
 
Продолжение следует…
 
© Владислав Демьянишин
 
 
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на 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): Формы, адресная строка, загрузка файлов
 
 
 
 
 
 
На главную страницу На предыдущую страницу На начало страницы