Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

web - tec / PHP 5 для начинающи

.pdf
Скачиваний:
69
Добавлен:
12.06.2015
Размер:
26.79 Mб
Скачать

PHP, HTML и состояние сеанса 113

Атрибут action

Атрибут action указывает серверу, на какую страницу необходимо перейти, как только пользователь нажмет кнопку отправки данных в форме. Не имеет значения, является ли эта страница HTML+ или PHP+страницей, или в ней используется какая+ либо серверная технология, главное, чтобы такая страница существовала на Web+ сервере. Чтобы задать ссылку на какую+либо страницу, атрибут action используется так:

<form action="myprogram.php">

...

</form>

Когда в качестве значения атрибута action указана PHP+страница, информация, введенная в данную форму, фактически отправляется PHP+машине для обработки, та+ ким образом, PHP+приложение получает возможность работать с введенными пользо+ вателем данными. Атрибут action только указывает серверу, какую страницу необхо+ димо выдать следующей. Если сохранить предыдущую страницу как myprogram.html вместо myprogram.php и если PHP не сконфигурирован для обработки .html+ файлов, форма не будет отправлена PHP+машине и в браузере вообще ничего не ото+ бразится. Работа PHP+машины при получении формы будет показана позднее.

Атрибут method

Атрибут method управляет способом отправки информации серверу. Как уже от+ мечалось, существует два метода отправки GET и POST (их имена нечувствительны к регистру символов, но соглашение требует писать их прописными буквами). Метод GET используется по умолчанию. Значение атрибута method устанавливается с помо+ щью следующего кода:

<form action="myprogram.php" method="GET">

или

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

На самом деле данному атрибуту можно присвоить несколько значений: HEAD, PUT,

LINK, UNLINK, OPTIONS, DELETE, TRACE и CONNECT. Однако они используются нечас+ то, необходимость в них возникает крайне редко, поэтому в данной книге они не об+ суждаются. Вместо этого следует подробнее рассмотреть методы GET и POST.

Значение GET

Значение GET атрибута method заставляет браузер присоединять введенные поль+ зователем в форму значения к URL. Как и в случае строки запроса, присоединенной к URL в ссылке, при отправке формы браузер добавляет в конце URL знак вопроса, чтобы обозначить окончание URL и начало информации формы. В таком случае ин+ формация, введенная в форму, передается как пары имя/значение. Если значением атрибута method дескриптора <form> является GET, то браузер автоматически при+ соединяет данную информацию к URL при отправке запроса Web+серверу.

Так же, как и в строке запроса в ссылке, можно добавить к URL множество пар имя/значение, отделяя каждую пару амперсандом (&). С двумя парами имя/значение конец URL после отправки формы может выглядеть следующим образом:

http://www.nonexistentserver.com/test.php?furryanimal=cat&spikyanimal=porcupine

114 Глава 3

Чтобы обеспечить соответствие с XHTML+спецификацией, можно заменить ам+ персанд последовательностью символов &, которая является соответствующим XML+элементом для амперсанда. В таком случае URL и строка запроса будут выглядеть так:

http://www.nonexistentserver.com/test.php?furryanimal=cat&spikyanimal=porcupine

Как уже отмечалось, пары имя/значение очень похожи на переменные. Фактиче+ ски, как только они передаются Web+серверу для обработки, PHP делает доступными эти пары в виде переменных. Поэтому если форма отправлена Web+серверу и в ответ он выдал другую страницу, то пары имя/значение будут доступны в PHP+сценарии как переменные (как часть массива $_GET).

Иногда возникает необходимость передавать в строке запроса значения, содер+ жащие пробелы. Предположим, что существует форма, в которой имеется дескриптор <textarea>. Если пользователь ввел в это поле строку ‘‘I would like to see a dynamic menu in operation’’, то в строке запроса необходимо представить несколько пробелов. В таком случае пробелы будут заменены оператором сложения:

http://localhost/beginning_php5/ch03/form.php?TextArea= I+would+like+ to+see+a+dynamic+menu+in+operation

Однако что произойдет, если понадобится вставить знак ‘‘плюс’’ в текстовое поле (<textarea>)? Как он будет представлен в строке запроса? Данный символ или опе+ ратор необходимо заменить кодом, который соответствует определенному символу. Такая замена называется URL+кодированием.

URL-кодирование

Многие символы невозможно использовать ни в URL, ни, следовательно, в строке запроса, поэтому URL с такими символами необходимо кодировать.

Процесс кодирования не требует каких+либо дополнительных действий от пользовате+ ля или разработчика. Web+браузер принимает опасный символ, будь то скобка или знак ‘‘плюс’’, и заменяет его кодовым значением (при отправке серверу). И наоборот, браузер принимает кодированный URL и заменяет в нем значения соответствующими символами (во время отображения страницы на экране). URL+кодированные значения всегда одина+ ковы (например, пробел всегда представляется значением %20). В приведенной ниже таблице перечислены наиболее распространенные символы и их кодовые значения.

Символ

URL-кодированное значение

 

 

Знак табуляции

%09

Пробел

%20

!

%21

%22

#

%23

%

%25

&

%26

(

%28

)

%29

+

%2B

,

%2C

 

 

PHP, HTML и состояние сеанса 115

Окончание таблицы

Символ

URL-кодированное значение

 

 

.

%2E

/

%2F

:

%3A

;

%3B

<

%3C

>

%3E

=

%3D

?

%3F

@

%40

\

%5C

 

 

Некоторые из этих символов должны быть закодированы, иначе в строке запроса они примут другое значение (как было показано выше, оператор сложения используется для обозначения пробела в строке запроса, а знак вопроса означает начало строки запроса).

Предыдущая строка запроса с URL+кодированным значением для пробела вместо знака ‘‘плюс’’ выглядела бы следующим образом:

http://localhost/beginning_php5/ch03/form.php?TextArea=I%20would%20like%20to%20 see%20a%20dynamic%20menu%20in%20operation

Пример значения GET в действии будет показан позднее, а пока следует рассмот+ реть значение POST.

Значение POST

Одним из недостатков передачи данных в строках запроса является них общедос+ тупная природа такой передачи. Если появление передаваемой информации в URL нежелательно, то вместо метода GET следует использовать метод POST. Данный метод работает почти идентично методу GET; различие заключается в том, что информация формы передается не в URL, а в теле HTTP+запроса. Это означает, что информация не+ видима, поскольку она не присоединяется к URL. Метод POST также позволяет пере+ давать большее количество данных. Существует физический предел количества дан+ ных, которые можно переслать как часть URL.

Какой метод использовать: GET или POST?

Мнения по этому поводу расходятся. Одни разработчики утверждают, что метод GET почти никогда не следует использовать, поскольку он небезопасен и имеет ограничения по размеру передаваемых данных. Другие придерживаются той точки зрения, что метод GET можно использовать для получения информации, а POST следует применять всякий раз, когда требуется модифицировать данные на Web+сервере. Однако строгих и четких правил не существует, а эти мнения представляют собой только основные принципы.

Одним из недостатков метода POST является то, что страницы, загруженные с его помощью, невозможно записать в закладки браузера, тогда как страницы, загружен+ ные с помощью метода GET, непосредственно в URL содержат всю необходимую для воспроизведения запроса информацию. Во многих случаях можно создать закладку на результат обработки какой+либо формы (например, результаты поиска в Alta Vista),

116 Глава 3

использующей метод GET. Именно поэтому большинство поисковых машин использу+ ет метод GET. Другой недостаток POST заключается в том, что данный метод сам по себе небезопасен ++++++ несмотря на то, что информация, помещенная в тело HTTP+ запроса, невидима для рядовых пользователей, она не шифруется, и хакеры легко мо+ гут получить к ней доступ. Для того чтобы гарантировать безопасность информации, необходимо использовать защищенное соединение с безопасным сервером.

Решение о том, какой метод использовать в форме, зависит от задач, решаемых с помощью данной формы. Используя GET, следует помнить о недостатках этого ме+ тода и о его открытой природе. В то же время страницы, работающие с помощью мето+ да POST, не могут быть проиндексированы поисковыми машинами, а, кроме того, не+ видимая передача данных вовсе не означает, что данный метод более безопасен.

PHP и поля (элементы управления) HTML-форм

Изучив процесс работы HTML+форм, теперь более подробно рассмотрим самые распространенные элементы управления, которые можно использовать для сбора пользовательской информации, а затем и способы использования PHP для получения этих данных. Термины поле формы (form field), элемент управления (control) и элемент фор* мы (form element) являются взаимозаменяемыми; все они означают одно и то же.

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

Первая страница вообще не должна содержать какого+либо PHP+кода. На практике во многих сайтах Web+страницы, содержащие формы, написаны исключительно на HTML и имеют расширение .htm или .html. Именно так реализованы все после+ дующие примеры (хотя по мере увеличения сложности приложений разработчики, как правило, отклоняются от этого формата). Очевидно, что нет необходимости от+ правлять какую+либо информацию PHP+машине, так как если файл не содержит PHP+ кода, это только увеличит издержки (продолжительность времени, необходимого на обработку и генерацию Web+страницы, возвращаемой браузеру, увеличится).

Итак, рассмотрим наиболее распространенные элементы управления HTML+форм.

Текстовые поля (текстовые окна)

Текстовые поля (text fields), или текстовые окна (text boxes), являются одними из наиболее известных элементов управления, которые встречаются практически в лю+ бой форме. Они создаются с помощью дескриптора <input>, в котором атрибуту type присваивается значение text.

<input type="Text" name="TextBox1">

Преимущество текстовых полей заключается в том, что они могут принимать от пользователя целые текстовые предложения. Это позволяет использовать их, напри+ мер, для ответов на вопросы, допускающие многочисленные и непредсказуемые воз+ можные ответы.

Следующий пример представляет собой код Web+страницы, которая принимает имя любимого автора и возвращает его на следующей странице.

PHP, HTML и состояние сеанса 117

Практика Использование текстового поля

1. Откройте текстовый редактор и введите следующий HTML+код:

<html>

<head><title></title></head>

<body>

<form method="GET" action="text.php">

Кто Ваш любимый автор?

<input name="Author" type="text"> <br>

<br>

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

</body>

</html>

2.Сохраните данный файл под именем text.html.

3.Создайте новый файл и введите следующий код:

<html>

<head><title></title></head>

<body>

Ваш любимый автор: <?php

echo $_GET['Author']; ?>

</body>

</html>

4.Сохраните этот файл как text.php.

5.Откройте text.html в браузере и введите в текстовое поле имя (рис. 3.3).

Рис. 3.3.

6. Нажмите кнопку Отправить и в браузере отобразится введенное имя (рис. 3.4).

118 Глава 3

Рис. 3.4.

Как это работает

Прежде всего следует обратить внимание на URL вверху экрана на рис. 3.4. К кон+ цу URL страницы text.php была добавлена строка запроса. Строка запроса была до+ бавлена Web+браузером согласно соответствующей инструкции в файле text.html:

<html>

<head><title></title></head>

<body>

<form method="GET" action="text.php">

Кто Ваш любимый автор?

...

Присвоение атрибуту method значения GET вынуждает браузер отправлять ин+ формацию формы в виде строки запроса, а не скрывать ее в теле HTTP+запроса. Рас+ смотрим строку запроса вверху страницы на рис. 3.4:

?Author=Juan+Rulfo

Вы уже знаете, что строки запроса составляются из пар имя/значение. В данном случае значением является имя автора Juan Rulfo. Имя данной пары (Author) попада+ ет в строку запроса согласно следующей выделенной строке в коде text.html:

Кто Ваш любимый автор?

<input name="Author" type="text"> <br>

Атрибут name тега <input> устанавливает имя для данного текстового поля ++++++ Author. Значение добавляется, когда пользователь вводит в текстовое поле имя автора.

Вторая программа, text.php, фактически состоит из одной строки PHP+кода:

Ваш любимый автор:

<?php echo $_GET['Author']; ?>

Строка PHP+кода отображает содержимое переменной $_GET["Author"]. Данная переменная физически не создается в коде. Она автоматически создается как часть массива $_GET. В HTML+файле было создано текстовое поле с именем Author. Когда

PHP, HTML и состояние сеанса 119

форма передается Web+серверу и PHP+машине, PHP+машина создает массив $_GET с элементом Author. Если бы текстовое окно было названо Name, то переменная име+ ла бы имя $_GET['Name']. Это все, что выполняет данная программа.

Почему этот пример может не работать

Если строка запроса передается, но имя автора не возвращается (см. рис. 3.5) или возвращается с предупреждением, то, скорее всего, в PHP+коде не соблюдается ре+ гистр символов в имени переменной.

Рис. 3.5.

Предположим, что в файле text.html имеется следующая строка (author в ниж+ нем регистре):

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

тогда как в файле text.php используется переменная $_GET['Author'] (первая бу+ ква прописная):

echo $_GET['Author'];

Программа будет работать неправильно, так как имена переменных в PHP чувст+ вительны к регистру символов. Хотя HTML нечувствителен к регистру, PHP прини+ мает имя переменной таким, каким оно задано для текстового поля в HTML+коде, по+ этому создается PHP+переменная $_GET['author'], а не $_GET['Author']. Необходимо убедиться, что имя текстового поля в HTML и имя, используемое в PHP+ сценарии, абсолютно идентичны.

Текстовая область

Для того чтобы создать текстовое поле, позволяющее вводить несколько строк, следует использовать другой HTML+дескриптор: <textarea>. Для изменения размера поля, количества строк и столбцов, а также других свойств используются атрибуты этого дескриптора. Например, код

<textarea name="WebSites" rows="30" cols="50">

создает текстовую область (text area) с именем WebSites размером 30 строк на 50 столб+ цов. Текстовые области предназначены для того, чтобы принимать от пользователя целые предложения. Их преимущество заключается в том, что можно задавать раз+

120 Глава 3

мер, а кроме того, они позволяют принимать несколько строк текста. Дескриптор <textarea> требует использования закрывающего тега, а между тегами можно по+ местить текст, который будет использоваться по умолчанию.

Рассмотрим использование текстовой области на примере.

Практика Использование текстовой области

1. Запустите редактор Web+страниц и введите следующий код:

<html>

<head><title></title></head>

<body>

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

Перечислите Ваши любимые Web-сайты

<textarea name="WebSites" cols="50" rows="5"> http://

http://

http://

http://

</textarea>

<br>

<br>

<br>

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

</body>

</html>

2.Сохраните данный файл как textarea.html и закройте его.

3.Создайте новый файл и введите следующий код:

<html>

<head><title></title></head>

<body>

Ваши любимые Web-сайты: <?php

echo $_POST['WebSites']; ?>

</body>

</html>

4.Сохраните этот файл под именем textarea.php.

5.Откройте файл textarea.html в браузере (рис. 3.6) и введите URL+адреса не+ скольких Web+сайтов.

6.По окончании ввода (вводить все четыре сайта необязательно) нажмите кнопку Отправить. На рис. 3.7 приведен примерный результат работы программы.

Как это работает

Вывод выглядит не настолько аккуратным и компактным, как в предыдущем при+ мере. Однако это не должно отвлекать внимание от одного важного момента, а имен+ но ++++++ URL:

http://localgost/beginning_php5/ch03/textarea.php

PHP, HTML и состояние сеанса 121

Рис. 3.6.

Рис. 3.7.

В данном случае строка запроса не присоединяется, потому что в первой програм+ ме задан метод POST.

<html>

<head><title></title></head>

<body>

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

Перечислите Ваши любимые Web-сайты

...

122 Глава 3

Это изменение необходимо для того, чтобы скрыть информацию формы. Однако данная страница имеет еще один интересный момент ++++++ дескриптор <textarea>:

<textarea name="WebSites" cols="50" rows="5"> http://

http://

http://

http://

</textarea>

Вданном случае создается текстовая область на пять строк по 50 символов в каждой.

Вотличие от обычного HTML текст внутри дескриптора <textarea> не требует явного указания разрывов строк (тега <br>); достаточно начать вводить текст с новой строки и тогда он будет отображаться на новой строке. Этому элементу управления присваива+ ется имя WebSites. Затем во второй программе (textarea.php) PHP+переменная по+ лучает имя $WebSites (регистр символов в обоих случаях должен быть одинаковым):

...Ваши любимые Web-сайты: <?php

echo $_POST['WebSites']; ?>

...

Все содержимое дескриптора <textarea> отображается на экране, но символы возврата каретки, разделяющие адреса сайтов в HTML+странице, автоматически уда+ ляются браузером наряду со всеми лишними пробелами, чтобы текст помещался в окно.

Флажки

Флажок (check box) ++++++ еще один элемент управления, который, как и текстовое поле, создается в HTML с помощью дескриптора <input>. Флажок представляет со+ бой небольшой квадрат с ‘‘галочкой’’ или без нее, в зависимости от выбора пользова+ теля, и не требует от пользователя ввода каких+либо данных кроме установки или сня+ тия ‘‘галочки’’. Поэтому этот элемент управления содержит данные, которые весьма отличаются от данных текстового поля. В HTML процесс создания флажка аналогичен созданию текстового поля; единственным отличием является значение атрибута type:

<input name="Choice" type="checkbox">

Флажки применимы в ситуациях, когда пользователю необходимо ответить на во+ прос, требующий строгого однозначного ответа да/нет. Флажки также имеют атри+ бут checked, который не принимает никакого значения. Если этот атрибут использу+ ется, то данный флажок будет отмечен по умолчанию:

<input name="Choice" type="checkbox" checked>

Кроме того, данный элемент управления имеет атрибут value; его значение по умолчанию ++++++ on.

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

Практика Использование флажков

1. Введите следующий код в редакторе Web+страниц:

<html>

<head><title></title></head>

Соседние файлы в папке web - tec