49508 (597449), страница 3
Текст из файла (страница 3)
Скромное название "Personal Home Page" уже не очень-то соответствовало реальности, и название было изменено на (в лучших Unix-традициях) рекурсивное: PHP: Hypertext Preprocessor.
"Движок" PHP 4, названный Zend Engine, разрабатывался усилиями уже сформировавшегося и с тех пор непрерывно разрастающегося PHP community, и в 2000-м году вышла 4-я версия PHP, ставшая менее чем через полгода стандартом для web - программирования под Unix (и не только): каждый уважающий себя хостер предоставлял поддержку PHP. Сейчас разработан PHP5, основанный на новом Zend Engine 2...
2.1. Что такое PHP?
PHP – это скрипт-язык (scripting language), встраиваемый в HTML - код, который интерпретируется и выполняется на web - сервере. Проще всего это показать на примере:
Листинг prim_1
Вас приветствует PHP
<body>
php
echo "Привет Виктор Сергеевич! Учи меня!";
?>
После выполнения этого скрипта получают страничку, в которой будет написано:
Основное отличие от CGI-скриптов, написанных на других языках, типа Perl или C – это то, что в CGI-программах Вы сами пишете выводимый HTML-код, а, используя PHP – вы встраиваете свою программу в готовую HTML-страницу, используя открывающий и закрывающий теги (в примере и ?>).
Отличие PHP от JavaScript, состоит в том, что PHP-скрипт выполняется на сервере, а клиенту передается результат работы, тогда как в JavaScript-код полностью передается на клиентскую машину и выполняется только там.
Любители Internet Information Server найдут, что PHP очень похож на Active Server Pages (ASP), а энтузиасты Java скажут, что PHP похож на Java Server Pages (JSP). Все три языка позволяют размещать код, выполняемый на Web-сервере, внутри HTML страниц.
2.2. Возможности PHP
На PHP можно делать все, что можно делать с помощью CGI–программ: обрабатывать данные из форм, генерировать динамические страницы, получать и посылать куки (cookies). Кроме этого в PHP включена поддержка многих баз данных (databases), что делает написание web-приложений с использованием БД до невозможности простым.
Вот неполный перечень поддерживаемых БД:
Adabas D | InterBase | Solid |
dBase | mSQL | Sybase |
Empress | MySQL | Velocis |
FilePro | Oracle | Unix dbm |
Informix | PostgreSQL |
|
Вдобавок ко всему PHP понимает протоколы IMAP, SNMP, NNTP, POP3 и даже HTTP, а также имеет возможность работать с сокетами (sockets) и общаться по другим протоколам.
2.3. Почему нужно выбирать PHP
Разработчикам web-приложений нет необходимости говорить, что web-страницы - это не только картинки и текст. Достойный внимания сайт должен поддерживать достаточно высокий уровень интерактивности с пользователем: поиск информации, продажа продуктов, конференции и т.п.
Традиционно все это реализовалось CGI-скриптами, написанными на Perl. Но CGI- скрипты очень плохо масштабируемы. Каждый новый вызов CGI, требует от ядра порождения нового процесса, а это занимает процессорное время и тратит оперативную память.
PHP предлагает другой вариант – он работает как часть web-сервера, и этим самым похож на ASP от Microsoft.
Синтаксис PHP очень похож на синтаксис C или Perl. Люди, знакомые с программированием, очень быстро начинают писать программы на PHP. В этом языке нет строгой типизации данных и нет необходимости в действиях по выделению/освобождению памяти.
Программы, написанные на PHP, легко читаемы. PHP – код легко зрительно прочитать и понять, в отличие от Perl-программ.
2.4. Недостатки PHP
PHP является интерпретируемым языком, и как следствие этого, не может сравниться по скорости с компилируемым С. Однако при написании небольших программ, что и присуще проектам на PHP, когда весь проект состоит из многих небольших страниц с кодом, вступают в силу накладные расходы на загрузку в память и вызов CGI-программы, написанной на С.
Не такая большая база готовых модулей, как, например, СPAN у Perl. С этим ничего нельзя поделать – это дело времени. В PHP 4 разработчики предусмотрели специальный репозиторий PEAR, аналогичный CPAN, и, конечно, очень скоро будет написано достаточное количество модулей для его наполнения.
2.5. Встраивание PHP в HTML - форму
Сначала изменим HTML-форму из предыдущего раздела. Для этого внесем некоторые изменения в файл form_1.html:
Вас приветствует PHP
Введите Ваше имя:
PHP – код разместим в файле form_handler.php:
echo "Привет, " . $_POST['name'] . "!";
?>
PHP – скрипт заключен в специальные тэги и ?>, внутри которых использован для вывода текста оператор echo.
Переменные GET-запроса попадают в массив $_GET, переменные POST-запроса - в массив $_POST, серверные переменные (типа IP-адреса, имени скрипта и т.д.) - в массив $_SERVER, оператор "точка" (.) - объединение строк... Причем все служебные операции (чтение stdin и переменных среды, Url-декодирование) уже произвел сам PHP. Удобно, не так ли?
Далее. Зачем нам два файла - HTML с формой и PHP-скрипт? Вполне достаточно одного скрипта:
Листинг form_2.html
Вас приветствует PHP
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo "Привет, " . $_POST['name'] ."! Учите меня!
";
}
?>
Введите Ваше имя:
Из тэга form убрали атрибут action - это значит, что форма отправляется "сама на себя", т.е. на текущий URL. Это называют "postback form". С помощью оператора if проверяется, использован ли для загрузки документа метод POST, и - если это так - в следующей строке выводится приветствие. В окне браузера можно увидеть:
2.6. HTML-формы. Массивы $_GET и $_POST
Формы являются основным способом обмена данными между web-сервером и браузером (пользователем). Формы выполняют главную функцию web – программирования: обеспечивают взаимодействие с пользователем.
2.6.1. Особенности метода отправки формы POST
Возьмем уже знакомый по первой главе пример form_2.php и внесем в него некоторые изменения:
Листинг form_3.php
Вас приветствует PHP
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo '<h1>Привет, <b>' . $_POST['name'] . '!';
}
?>
Введите Ваше имя:
Форма, приведенная в строках 8-12 (выделено цветом), содержит два атрибута: name и okbutton:
-
атрибут method указывает метод отправки формы POST;
-
атрибут action, указывающий URL, на который отправляется форма, заполняется значением серверной переменной PHP_SELF - адресом выполняемого в данный момент скрипта.
- сокращенная форма записи для echo: .
Если в поле форма name ввести, например, значение Вася, и нажать кнопку OK, то Браузер отправит после этого на сервер POST-запрос. Тело запроса имеет вид: name=Вася&okbutton=OK. PHP при этом автоматически заполнит массив $_POST:
$_POST['name'] = 'Вася'
$_POST['okbutton'] = 'OK'
В действительности, значение "Вася" отправляется браузером в urlencode-виде; для кодировки windows-1251 это значение выглядит как %C2%E0%F1%FF. Но, поскольку PHP автоматически осуществляет необходимое декодирование, мы можем "забыть" об этой особенности - пока не придется работать с HTTP-запросами вручную.
Так как в теле запроса указываются только имена и значения, но не типы элементов форм, PHP понятия не имеет, соответствует $_POST['name'] строке ввода, кнопке, или списку. Но эта информация нам, в общем-то, совершенно не нужна.
Поскольку знать, что написано на кнопке submit, нам необязательно, в строке можно удалить атрибут name, сократив описание кнопки до (листинг form_4.php). В этом случае, браузер отправит POST-запрос name=Вася.
Листинг form_4.php
Вас приветствует PHP
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo 'Привет, ' . $_POST['name'] . '!
';
}
?>
Введите Ваше имя:
2.6.2. Особенности метода отправки формы GET
А теперь подобные рассуждения проделаем для метода отправки формы GET:
Листинг form_5.php
Вас приветствует PHP
if (isset($_GET['name'])) {
echo 'Привет, ' . $_GET['name'] . '!
';
}
?>
Введите Ваше имя:
if (isset($_GET['name'])) {
echo 'Привет, ' . $_GET['name'] . '
!';
}
?>
Введите Ваше имя:
В строке 11 можно было бы написать . Но GET - метод по умолчанию.
Браузер отправляет GET-запрос, который равносилен вводу в адресной строке адреса: http://адрес-сайта/имя-скрипта.php?name=Вася:
PHP с GET-формами поступает точно так же, как и с POST-формами, с тем отличием, что заполняет массив $_GET.
Кардинальное же отличие - в строке 7. Поскольку простой ввод адреса в строке браузера является GET-запросом, проверка if ($_SERVER['REQUEST_METHOD'] == 'GET') бессмысленна: все, что в этом случае можно выяснить, что кто-то не отправил на скрипт POST-форму. Поэтому прибегают к конструкции isset(), которая возвращает true, если переменная определена (т.е. ей было присвоено значение), и false - если переменная не определена. Если форма была заполнена - как Вы уже поняли, PHP автоматически присваивает $_GET['name'] соответствующее значение.
Способ проверки с помощью isset() - универсальный, его можно было бы использовать и для POST-формы. Более того, он предпочтительнее, так как позволяет выяснить, какие именно поля формы заполнены.
Во многих старых книгах и статьях утверждается, что:
1. Данные как из GET, так и из POST-форм попадают непосредственно в переменные (в нашем случае - $name), причем POST-данные приоритетнее, т.е. "затирают" GET-данные;
2. Данные GET и POST-форм хранятся соответственно в массивах $HTTP_GET_VARS и $HTTP_POST_VARS.
Эта информация устарела. Запомните этот момент, чтобы не попасть впросак со старыми скриптами или книгами.
Немного более сложный пример.
Листинг form_6.php
if (isset($_POST['name'], $_POST['year'])) {