Скачиваний:
39
Добавлен:
04.04.2013
Размер:
728.06 Кб
Скачать

Рнр и код, выполняемый на стороне клиента

В главе "Программирование в среде Web" рассматривались динамические технологии, работающие как на стороне сервера, так и на стороне клиента. Разница между этими двумя типами технологий заключается в том, что дополнительные инструкции, встраиваемые в HTML-страницу в первом случае интерпретируются сервером, а во втором – клиентской программой (броузер). PHP позволяет разработчику встраивать в обрабатываемую страницу блоки инструкций, интерпретируемых клиентом. Рассмотрим следующий пример.

<html>

<body>

<?

echo ("<script language="JavaScript"> alert('Hello!'); </script>");

?>

</body>

</html>

PHP-скрипт генерирует страницу, содержащую инструкцию языка JavaScript. Функция alert выводит на экран диалог, содержащее сообщение, переданное данной функции в качестве параметра.

Данная программа работает следующим образом. На первом этапе интерпретатор языка PHP анализирует текст страницы и встраивает в нее строку при помощи функции echo. Содержимое строки echo может иметь произвольное содержимое и не анализируется интерпретатором. На втором этапе сформированная страница высылается броузеру. Броузер начинает анализировать HTML-инструкции и находит в теле страницы блок инструкций JavaScript. Далее происходит запуск интерпретатора языка JavaScript (современные броузеры как правило имеют в своем составе интерпретатор данного языка). Интерпретатор JavaScript отображает диалог с сообщением "Hello!".

Таким образом средствами PHP была сформирована страница, содержащая элементы программы, исполняемой на стороне клиента.

Взаимодействие с пользователем

В предыдущих примерах были рассмотрены PHP-скрипты, генерирующие страницы в соответствии с данными, заложенными непосредственно в серверные программы. Однако одним из важнейших достоинств серверных программ является возможность создания страниц на основе информации, полученной от клиента. Самым простым способом передачи данных серверу является использование строки запроса с параметрами. Предположим, что нужно передать серверу некоторое число (например идентификатор группы товаров, по которому в дальнейшем будет осуществляться выборка из базы данных). Создадим скрипт info.php.

<html>

<body>

<a href="http://www.mysite.com/info.php?id=10">Нажмите здесь</a>

<br>

<?

//После двойного слеша в PHP-скриптах можно размещать комментарии

//Если переменная $id инициализирована, то вывести ее значение

if (isset($id)) echo $id;

?>

</body>

</html>

Данный скрипт работает следующим образом. При загрузке выводится гипертекстовая ссылка "Нажмите здесь". Если нажать на эту ссылку, то на экране под ссылкой появится число 10.

Скрипт состоит из двух блоков – HTML и PHP. PHP блок содержит в себе условную конструкцию, проверяющую, инициализирована ли переменная $id (подробнее о переменных и условных конструкциях будет рассказано в главе "Синтаксис языка PHP").

HTML-блок содержит ссылку на скрипт info.php с параметром id=10. Фактически скрипт ссылается сам на себя (это довольно распространенная практика при написании серверных скриптов). В принципе, можно было бы разнести HTML и PHP блоки на разные страницы (статическая HTML-страница содержала бы ссылку на PHP-скрипт), однако это привело бы к появлению дополнительной страницы. Впрочем, такой подход тоже имеет свои плюсы (появилась бы возможность разделить динамический и статический код), так что способ реализации определяется непосредственно разработчиком в зависимости от поставленной задачи.

При нажатии на ссылку происходит вызов скрипта info.php, при этом ему передается переменная $id со значением, равным 10. В случае, если бы нам нужно было передать на сервер несколько параметров, строка запроса выглядела бы следующим образом:

http://www.mysite.com/info.php?id=10&id2=20&text=hello&...&value=0

В общем виде строка запроса выглядит следующим образом:

адрес-скрипта?имя1=знач1&имя2=знач2&...имяN=значN

При получении такой строки переданные имена автоматически превращаются в переменные, которые инициализируются соответствующими значениями, переданными в этой же строке запроса. Следует заметить, что таким образом нельзя напрямую передавать специальные символы (например пробелы, знаки пунктуации) и символы кириллицы. Для этого их необходимо соответствующим образом закодировать. В PHP имеются специальные функции кодирования и декодирования строки запроса.

При первом запуске скрипт вызывается без параметров. Поскольку параметры не переданы, переменная $id не инициализирована и на экран выводится только ссылка. При нажатии на ссылку происходит повторный вызов скрипта с параметром $id=10. Сервер начинает формирование страницы со вставки в нее ссылки. Далее интерпретатор PHP проверяет, инициализирована ли переменная $id. Поскольку переменная $id инициализирована, интерпретатор добавляет в страницу строку, содержащую значение переменной, т.е. 10. В результате получается страница, на которой отображена гипертекстовая ссылка, а ниже число 10.

Приведенный пример иллюстрирует передачу на сервер заранее определенных данных (например каждая ссылка может соответствовать пункту меню и соответственно передавать на сервер различные значения какой-либо переменной для последующей обработки). Однако возможны такие ситуации, когда данные для передачи на сервер заранее неизвестны. Например, необходимо передать на сервер имя пользователя. Для таких случаев предусмотрены HTML-формы. Форма – набор полей и флажков для ввода информации. Каждой форме ставится в соответствие серверный сценарий (например скрипт, написанный на языке PHP). Сценарий получает и обрабатывает данные, введенные пользователем в форму. Создадим скрипт info.php

<html>

<body>

<form action="info.php" method="POST">

Введите Ваше имя:

<input type="text" name="username">

<input type="submit" name="ok" value="Отправить">

</form>

<?

if (isset($username)) echo "Здравствуйте, $username";

?>

</body>

</html>

Скрипт состоит из формы для ввода имени и блока PHP-инструкций, обрабатывающих данные, введенные в форму. В этом примере скрипт является обработчиком собственной формы. Данный подход является оправданным потому, что значительно упрощает процесс обработки данных, введенных в форму. Например, в обработчике можно организовать проверку данных на корректность, и в случае, если полученные данные не удовлетворяют условиям проверки, попросить пользователя повторить ввод. В варианте с разделением формы и обработчика на две страницы организовать повторный ввод данных значительно сложнее. Тем не менее, подход, связанный с разделением статического и динамического кода может быть в некоторых случаях оправдан. Выбор способа реализации зависит исключительно от разработчика.

Рассмотрим, как работает данный скрипт. Первая часть программы отображает на экране форму для ввода имени пользователя. Рассмотрим, из каких компонентов состоит форма.

Тэг <form> обозначает начало формы и имеет два параметра: action и method. Параметр action указывает имя сценария, обрабатывающего данные формы. Параметр method указывает способ, которым данные будут передаваться на сервер. Для передачи данных можно использовать два метода (способа): GET и POST.

При подаче запроса методом GET все введенные в форму данные дописываются к стро­ке запроса. Данные дописываются в виде пар имя=значение (как в предыдущем примере с передачей данных через ссылку). GET используется в качестве метода по умолчанию для всех запросов. Когда пользователь делает простой запрос страницы, броузер подает зап­рос как запрос GET. Запрос GET упаковывает все данные формы в строке запроса. При помощи метода GET не рекомендуется передавать большие объемы данных.

Запросы, использующие метод POST, тоже упаковывают данные формы в те­ле запроса, но несколько иным способом. Метод POST позволяет передать больше данных, нежели метод GET. В большинстве случаев выбор метода, используемого для передачи запроса на веб-сервер, не имеет принципиального значения.

Тэг <input type="text" name="username"> обозначает элемент формы, предназначенный для ввода текстовой строки (в данном случае – имени пользователя). После отправки данных на сервер в адресном пространстве скрипта (сценария обработки данных формы) появится переменная $username, в качестве значения которой будет фигурировать та строка (имя пользователя), которая была введена при заполнении формы.

Следующий тэг <input type="submit" name="ok" value="Отправить"> отображает кнопку с надписью "Отправить". При нажатии этой кнопки данные, введенные в форму будут упакованы и отправлены на сервер. Для обработки данных на сервере будет запущен скрипт info.php

Блок PHP-инструкций во многом аналогичен предыдущему примеру. Осуществляется проверка, инициализирована ли переменная $username, и если инициализирована – в тело страницы добавляется строка, содержащая слова "Здравствуйте, " и значение переменной $username. Обратите внимание на то, каким образом осуществляется добавление строки в тело страницы:

echo "Здравствуйте, $username";

Поскольку строка заключена в двойные кавычки, то интерпретатор подставляет вместо имени переменной ее значение. Например, если переменная $username имеет значение "Иванов", в тело страницы будет добавлена строка "Здравствуйте, Иванов".

Если заключить строку в одинарные кавычки

echo ’Здравствуйте, $username’;

то в тело страницы будет добавлена строка "Здравствуйте, $username", т.е. интерпретатор не будет анализировать строку на предмет вхождения в нее переменных и оставит текст без изменений. Возможен еще один вариант формирования строки:

echo ’Здравствуйте, ’.$username;

В этом случае функция echo получает аргумент, являющийся слиянием двух строк - "Здравствуйте, " и значения переменной $username (оператор конкатенации строк "." будет рассмотрен в главе "Синтаксис языка PHP"). В результате будет образована строка "Здравствуйте, Иванов".

При отправке данных формы броузер автоматически кодирует специальные символы и символы кириллицы. При получении данных, PHP автоматически декодирует эти символы.