web - tec / PHP 5 для начинающи
.pdfPHP, 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>