p align="center">2. ПЕРЕДАЧА ДАННЫХ С ПОМОЩЬЮ ФОРМЫ Рассмотрим пример посылки сообщения из формы по электронной почте. Листинг e_mail.html. Посылка сообщения из формы по e-mail <html> <head> <title>Посылка формы по е-mail</title> </head> <body> <FORM action=mailto: myaddres@mail.ru enctype=”text/plain” method=”post”> Нажмите “Cброс” и заполните заказ.<BR> <INPUT type=reset value=C6poc><BR> <P> <TABLE border=0 cellspacing=O cellpadding=5> <TR> <TD>Ваше имя:</TD > <TD> <INPUT type=text size=33 name=name value=”Прохоров Виктор Сергеевич”> </TD> </TR> <TR> <TD>Ваш адрес:</TD> <TD> <INPUT type=text size=33 name=email value=prohwik@mail.ru > </TD> </TR> <TR> <TD>Прислать:</TD> <TD> <INPUT type=text size=33 name=obj value=”Методические указания”> </TD> </TR> </TABLE> <INPUT type=submit value=”Послать заказ”> </FORM> </body> </html> Если поместить этот код в HTML-программу, то на гипертекстовой старичке возникнет картинка: Пользователь нажимает кнопку «Сброс», и поля принимают значения, установленные по умолчанию. Форма заполняется пользователем, и по нажатию кнопки «Послать заказ» отправляется по адресу myaddres@mail.ru. Обычно браузер не сам отсылает форму, а поручает эту работу почтовой программе, установленной по умолчанию в операционной системе компьютера (например, Outlook). Письмо посылается в виде: subjct: Форма отправлена из Microsoft Internet Explorer name = Прохоров Виктор Сергеевич value=prohwik@mail.ru obj = «Методические указания» Письмо составляется из пар имя=значение, которые выбираются по порядку из полей формы. Можно написать простейший сценарий на РНР типа «Hello, world: сейчас 10 часов утра». Однако этим сценариям недостает одного -- интерактивного взаимодействия с пользователем. Поставим задачу написать сценарий, который принимает в параметрах две величины: зарегистрированное имя и пароль пользователя. Если зарегистрированное имя равно root, а пароль -- Z10N0101, следует напечатать: «Доступ открыт для пользователя <имя>» и заблокировать сервер (т. е. вывести стандартный экран Windows «Блокировка» с запросом пароля для разблокирования). Если же данные неверны, необходимо вывести сообщение «Доступ закрыт!». Сначала рассмотрим наиболее простой способ передачи параметров сценарию -- непосредственный набор их в URL после знака? -- например, в формате login=имя&password=napoль. Пусть на сервере в корневом каталоге есть сценарий на РНР под названием hello.php. Этот сценарий распознает 2 параметра: login и password. Поэтому, если задать в адресной строке браузера: http://localhost/heIlo.php?login=root&password=Z10N0101 то должны получить требуемый результат. Задача поставлена, можно приступать к ее решению. Но прежде полезно решить аналогичную, но более простую задачу. Как же нам в сценарии получить строку параметров, переданную после знака вопроса в URL при обращении к сценарию? Для этого можно проанализировать переменную окружения QUERY_STRING, которая в РНР доступна под именем $_SERVER[QUERY_STRING]. Напишем пример, чтобы это проиллюстрировать (листинг qs.php). Листинг qs.php. Вывод параметров командной строки. <?php echo «Данные из командной строки: $_SERVER[QUERY_STRING]»; ?> Если теперь запустить этот сценарий из браузера (перед этим сохранив его в файле test.php в корневом каталоге сервера) таким образом: http://localhost/qs.php?this+is+the+world/ то получим документ следующего содержания: Данные из командной строки: this+is+the+world Обратите внимание на то, что URL-декодирование символов не произошло: строка $_server [' query_string '], как и одноименная переменная окружения, всегда приходит в той же самой форме, в какой она была послана браузером. Так как РНР изначально создавался именно как язык для Web-программирования, то он дополнительно проводит некоторую работу с переменной query_string перед передачей управления сценарию. А именно, он разбивает ее по пробельным символам (в примере пробелов нет, их заменяют символы +, но эти символы РНР также понимает правильно) и помещает полученные кусочки в массив-список $argv, который впоследствии может быть проанализирован в программе. Массив $argv используется при программировании на РНР крайне редко, что связано с большими возможностями интерпретатора по разбору данных, поступивших от пользователя. Однако в некоторых (учебных) ситуациях его применение оправдано. 2.1. Форма для передачи данных Вернемся к поставленной задаче. Как сделать, чтобы пользователь мог в удобной форме ввести зарегистрированное имя и пароль? Очевидно, придется создать что-нибудь типа диалогового окна Windows, только в браузере. Для этого понадобится HTML-документ (например, form.html в корневом каталоге) с элементами этого диалога -- текстовыми полями -- и кнопкой. Листинг form.html. Страница с формой <html> <body> <form action=hello.php> Имя: <input type=text name=”login” value=””<br> Пароль: <input type=password name=”password” value=””<br> <input type=”submit” name=”go” vа1ue = “Передать “ ><br> <input type=”reset” vа1ue = “Очистить форму” ><br> </form> </body> </html> Загрузим документ в браузер. Теперь, если заполнить поля ввода и нажать кнопку, браузер обратится к сценарию hello.php и передаст через? все атрибуты, расположенные внутри тегов <input> в форме и разделенные символом & в строке параметров. Заметьте, что в атрибуте action тега <form> задан относительный путь, т. е. сценарий hello.php будет искаться браузером в том же самом каталоге, что и файл form.html. Все перекодирования и преобразования, которые нужны для URL-кодирования данных, осуществляются браузером автоматически. В частности, буквы кириллицы превратятся в %хх, где хх -- некоторое шестнадцатеричное число, обозначающее код символа. Использование форм позволяет не обременять пользователя такой информацией, как имя сценария, его параметры и т. д. Он всегда будет иметь дело только с полями, переключателями и кнопками формы: Осталось определиться, как можно извлечь $login и $password из строки параметров. Можно попытаться разобрать ее «вручную» при помощи стандартных функций работы со строками, которых в РНР множество. Однако прежде чем браться за какое-то дело, следует внимательно посмотреть и другие способы его выполнения. 2.2. Трансляция полей формы Мы не хотим заниматься прямым разбором переменной окружения query_string, в которой хранятся параметры сценария. И правильно -- интерпретатор перед запуском сценария делает все сам. Причем независимо от того, каким методом -- get или post -- воспользовался браузер. То есть, РНР сам определяет, какой метод был задействован (информация об этом доступна через переменную окружения request_method), и получает данные либо из query_string, либо из стандартного входного потока. Все данные из полей формы РНР помещает в глобальный массив $_REQUEST. В нашем случае значение поля login после начала работы программы будет храниться в $_REQUEST [' login '], а значение поля password -- в $_REQUEST ['password']. Кроме того, чтобы можно было как-то разделить GET-параметры от POST-данных, РНР также создает массивы $_GET и $_POST, заполняя их соответствующими значениями. Массив $_REQUEST представляет собой объединение этих двух массивов. Листинг hello.php. Сценарий извлечения текста из полей формы <?php if ($_REQUEST['login']==”root” && $_REQUEST['password']==”Z10N0101”) { echo «Доступ открыт для пользователя $_REQUEST[login]»; //Команда блокирования рабочей станции (работает в NT-системах) system(“rundll32.exe user32.dll,LockWorkStation”); } else { echo “Доступ закрыт!”; } ?> Если при вводе данных будет совершена ошибка, например, неправильно введено имя: то доступ будет закрыт: Здесь применена инструкция if-else (условное выполнение блока) и функция system() (запуск команды операционной системы). Инструкция if-else -- условный оператор. Его формат таков: if (логическое_выражение) инструкция_1; else инструкция_2; Действие инструкции следующее: если логическое_выражение истинно, то выполняется инструкция_1, а иначе -- инструкция_2. Как и в любом другом языке, конструкция else может опускаться, в этом случае при получении лолжного значения просто ничего не делается. Пример: if ($salary>=100 && $salary<=5000) echo «Вам еще расти и расти»; Else echo «Ну и правильно -- не в деньгах счастье.»; Если инструкция_1 или инструкция_2 должны состоять из нескольких команд, то они, как всегда, заключаются в фигурные скобки. Пример: if ($a > $b) { print “а больше b”; $c = $b; ) } elseif ($a = = $b) { print “а равно b”; $c = $a; ) } else { print “а меньше b”; $c = $a; } echo «<bг>Минимальное из чисел: $с»; Это не опечатка: elseif пишется слитно, вместо else if. Так тоже можно писать. Конструкция if-else имеет еще один альтернативный синтаксис: if (логическое-_выражение) : команды; elseif (другое_логическое_вьражение) : другие_команды; else: иначе_команды; endif Обратите внимание на расположение двоеточия (:). Если его пропустить, будет сгенерировано сообщение об ошибке. И еще, как обычно, блоки elseif и else можно опускать.
Страницы: 1, 2, 3, 4, 5, 6, 7
|