name = Прохоров Виктор Сергеевич
value = prohwik @ mail . ru
obj = «Методические указания»
Письмо составляется из пар имя=значение, которые выбираются по порядку из полей формы.
Можно написать простейший сценарий на РНР типа «Hello, world: сейчас 10 часов утра».
Однако этим сценариям недостает одного — интерактивного взаимодействия с пользователем.
Поставим задачу написать сценарий, который принимает в параметрах две величины: зарегистрированное имя и пароль пользователя. Если зарегистрированное имя равно root, а пароль — Z10N0101, следует напечатать: «Доступ открыт для пользователя <имя>» и заблокировать сервер (т. е. вывести стандартный экран Windows «Блокировка» с запросом пароля для разблокирования). Если же данные неверны, необходимо вывести сообщение «Доступ закрыт!».
Сначала рассмотрим наиболее простой способ передачи параметров сценарию — непосредственный набор их в URL после знака? — например, в формате l ogin=имя&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 используется при программировании на РНР крайне редко, что связано с большими возможностями интерпретатора по разбору данных, поступивших от пользователя. Однако в некоторых (учебных) ситуациях его применение оправдано.
Форма для передачи данных
Вернемся к поставленной задаче. Как сделать, чтобы пользователь мог в удобной форме ввести зарегистрированное имя и пароль? Очевидно, придется создать что-нибудь типа диалогового окна 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-кодирования данных, осуществляются браузером автоматически. В частности, буквы кириллицы превратятся в %хх, где хх — некоторое шестнадцатеричное число, обозначающее код символа.
Использование форм позволяет не обременять пользователя такой информацией, как имя сценария, его параметры и т. д. Он всегда будет иметь дело только с полями, переключателями и кнопками формы:
Осталось определиться, как можно извлечь $ l ogin и $password из строки параметров.
Можно попытаться разобрать ее «вручную» при помощи стандартных функций работы со строками, которых в РНР множество. Однако прежде чем браться за какое-то дело, следует внимательно посмотреть и другие способы его выполнения.
Трансляция полей формы
Мы не хотим заниматься прямым разбором переменной окружения query_string, в которой хранятся параметры сценария. И правильно — интерпретатор перед запуском сценария делает все сам. Причем независимо от того, каким методом — get или post — воспользовался браузер. То есть, РНР сам определяет, какой метод был задействован (информация об этом доступна через переменную окружения request_method), и получает данные либо из query_string, либо из стандартного входного потока.
Все данные из полей формы РНР помещает в глобальный массив $_ REQUEST.
В нашем случае значение поля login после начала работы программы будет храниться в $_ REQUEST [' login '], а значение поля p assword — в $_ 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-e l se имеет еще один альтернативный синтаксис:
if (логическое-_выражение) :
команды ;
elseif (другое_логическое_вьражение) :
другие_команды ;
else:
иначе_команды ;
Endif
Обратите внимание на расположение двоеточия (:). Если его пропустить, будет сгенерировано сообщение об ошибке. И еще, как обычно, блоки elseif и else можно опускать.
Для вставки HTML-кода в тело сценария достаточно закрыть скобку ?>, написать этот код, а затем снова открыть ее при помощи <?, и продолжать программу.
Чаще нужно делать не вставки HTML внутрь программы, а вставки кода внутрь HTML. Целесообразно отделять HTML-код от программы, например, поместить его в отдельный файл, который затем подключается к программе при помощи инструкции include.
Вот, например, как будет выглядеть сценарий, который приветствует пользователя по имени, с применением альтернативного синтаксиса if-eise.
Листинг ifelse. php . Сценарий, который приветствует пользователя по имени
<! - - Альтернативный синтаксис if-else. - ->
<?
if (isset($_REQUEST[’go’])):?>
Привет , <?=$_REQUEST[’name’]?>!
<?else:?>
<form action=”<?=$_SERVER[’REQUEST_URL’]?>” method=post>
Ваше имя : <input type=text name=name><br>
<input type=submit name=go v а 1u е =”0 тослать !”>
<?endif?>
В окне браузера форма выглядит следующим образом:
Теперь усовершенствуем скрипт — сделаем так, чтобы при запуске без параметров сценарий выдавал документ с формой, а при нажатии кнопки — выводил нужный текст. Самый простой способ определить, был ли сценарий запущен без параметров — проверить, существует ли переменная с именем, совпадающим с именем кнопки отправки. Если такая переменная существует, то пользователь запустил программу, нажав кнопку (листинг 4).
Листинг lock.php. Усовершенствованный скрипт блокировки сервера
<?
if ( !isset($_REQUEST[’doGo’] ) )
{
?>
<form action=”<?=$_SERVER[’SCRIPT_NAME’]?>”>
Имя: <input type = text name=”login” value=””><br>
Пароль: <input type = password narae=”password” value=””><br>
<input type=submit name=”doGo” value=”Haжмитe кнопку!”>
</form>
<?
}
Else
{
if ($_REQUEST[’login’]==”root” && $_REQUEST[’password’]==”Zl0N0101”)
{
echo «Доступ открыт для пользователя $_ REQUEST [ login ]»;
//Команда блокирования рабочей станции (работает в NT -системах)
system(“rundll32.exe user32.dll,LockWorkStation”);
}
Else
{
echo “Доступ закрыт!”;
}
}
?>
В окне браузера форма выглядит следующим образом:
Из этого примера можно почерпнуть несколько полезных приемов:
● Конструкция <?=выражение?> является более коротким обозначением для <?echo выражение?>, и предназначена для того, чтобы вставлять величины прямо в HTML-страницу.
● В параметре action тега <form> не задано явно имя файла сценария, а извлекли его из переменной окружения script_name (которая, как и все такие переменные, хранится в массиве $_server). Это позволило не «привязываться» к имени файла, т. е. теперь можно его в любой момент переименовать без потери функциональности.
В старых версиях РНР 4 переменная $script_name могла содержать неправильное значение. Например, если воспользоваться способом инсталляции, когда устанавливают РНР как внешнюю программу, а не модуль Apache, в РНР версии 4.1 и младше переменная $script_name будет содержать строку /_php/php.exe, что, конечно же, нам не подходит. «Правильное» значение в этом случае можно найти в переменной окружения redirect_url или в переменной РНР $redirect_url. Однако учтите, что в Unix, наоборот, redirect_url работать не будет! РНР 5 всех этих недостатков лишен.
● Исчезла необходимость в промежуточном файле form.html: его код встроен в сам сценарий.
Дата: 2019-04-23, просмотров: 253.