PHP-сценарий обработки на сервере заказа
СЕРВЕРНОЕ
ПРОГРАММИРОВАНИЕ
Учебное пособие
ПРЕДИСЛОВИЕ
Web-программирование является все более широко используе- мой областью в программировании. Оно берет начало со времени создания «всемирной паутины» — WWW и постоянно развивается и расширяется. Для создания современного сайта требуется использовать все разновидности Web-программирования: HTML- разметку, каскадные таблицы стилей, Web-программирование клиентское и серверное.
Серверное Web-программирование — это технология, позво- ляющая запускать на web-сервере программы, имеющие возмож- ность получать данные от посетителей сайтов, поддерживаемых этим Web-сервером, и в свою очередь выдавать им обработанные данные в виде Web-страниц или других файлов. Таким образом, серверное Web-программирование — это создание программ, ра- ботающих на сервере, а не на клиентской машине.
1. ВВЕДЕНИЕ В СЕРВЕРНОЕ WEB-ПРОГРАММИРОВАНИЕ
Web-программирование — это разработка любых программ- ных продуктов, предназначенных для работы на сайтах World Wide Web. Имеются следующие разновидности Web-программи- рования:
1. Разработка Web-страниц на чистом HTML.Является Web-программированием, потому что при просмотре страницы браузер фактически исполняет код HTML, форматируя текст со- гласно инструкциям этого языка. На профессиональных сайтах, как правило, для оформления используются каскадные таблицы стилей CSS (cascading style sheets). Поэтому их использование также следует отнести к Web-программированию.
2. Клиентское Web-программирование. Это использование на Web-страницах технологий JavaScript и VBScript для динами- ческого изменения внешнего вида Web-страницы при ее просмот- ре и выполнение обработки информации, введенной пользовате- лем в формы.
3. Серверное Web-программирование.Это создание CGI-при- ложений. CGI (сокращение от Common Gateway Interface) — тех- нология, позволяющая запускать на Web-сервере программы, имеющие возможность получать данные от посетителей сайтов, поддерживаемых этим Web-сервером, и в свою очередь выдавать им обработанные данные в виде Web-страниц или других файлов. Прежде чем перейти к детальному описанию особенностей
Web-приложений, вспомним принципы работы Web-сервера.
1.1. Пассивные и активные серверы Web
Web-сервер— это программа, устанавливаемая на узле сети Интернет и выдающая посетителям этого узла Web-страницы по запросам. Также Web-сервером часто называется узел, на котором эта программа запущена, или даже компьютер, являющийся та- ким узлом. В Интернете наиболее часто используются серверы Apache (67,2%) и MS IIS (21,02%) [8].
Различают пассивные и активные серверы Web. Если страни- цы сервера содержат только статическую текстовую и мультиме- дийную информацию, а также гипертекстовые ссылки на другие страницы, то сервер называется пассивным. Такой сервер спосо- бен только выдавать Web-страницы по запросам пользователей.
В отличие от пассивных, активные серверы могут:
· вступать в диалог с пользователем, например, запрашивая и принимая от него информацию;
· динамически создавать (не просто извлекать из своей памя- ти имеющиеся там Web-страницы) Web-страницы для предъявле- ния клиентам;
· при формировании динамических страниц обращаться к ба- зам данных сервера, извлекать оттуда информацию и включать ее в формируемую Web-страницу.
Очевидно, что Web-страницы активного сервера кроме стати- ческой текстовой и мультимедийной информации, а также гипер- текстовых ссылок должны содержать другие элементы для реали- зации перечисленных возможностей.
Имеется два варианта реализации активных Web-серверов. Первый из них предполагает применение специальных про- граммных расширений Web-сервера, таких как CGI и ISAPI.
Второй связан с использованием серверных сценариев и тех- нологии активных страниц Active Server Pages (ASP).
Активные серверы могут отличаться друг от друга функцио- нальностью и специфическими ограничениями. Например, Perl присутствует, а PHP нет; PHP есть, но разрешается создавать только одну базу данных.
1.2. Программы CGI, схема их работы
Для того чтобы сервер Web мог вести диалог с пользователем, был разработан механизм программных расширений сервера, на- зываемый стандартным шлюзовым интерфейсом Common Gate- way Interface (CGI). Это часть Web-сервера, которая может взаи- модействовать с другими программами, выполняющимися на этом Web-узле. И в этом смысле CGI является шлюзом для пере- дачи данных, полученных от клиента.
Общая схема работы CGI состоит из следующих этапов:
· получение (через протокол HTTP) информации с клиент- ских машин (от пользователя);
· обработка полученной информации. В некоторых случаях CGI-программа не может обработать информацию (ответить на запрос) самостоятельно. Например, запрос может потребовать обращения к некоторой базе данных, которую CGI-программа читать не умеет. В этом случае CGI-программа на основании по- лученной информации формирует запрос к компетентной про- грамме, выполняющейся на том же Web-сервере;
· отправка обработанной информации обратно в виде нового документа HTML.
При этом для ввода информации со стороны пользователя в документ HTML встраиваются формы, содержащие такие органы управления, как текстовые поля, списки, переключатели, кнопки и т.д.
Обычно одна из кнопок (типа Submit) предназначена для за- вершения ввода данных в форму. Когда пользователь заполнит всю форму, он нажимает эту кнопку, и данные из полей формы передаются программе CGI. Обработав данные, программа CGI динамически формирует новый документ HTML с результатами обработки и отправляет его обратно пользователю. При необхо- димости программа CGI может обращаться к СУБД.
Этот процесс проиллюстрирован на рис. 1.1.
Рис. 1.1. Взаимодействие браузера и сервера Web
Таким образом, программы CGI позволяют Web-серверу вести диалог с пользователем.
Что представляет собой программа CGI?
Это обычное консольное приложение, работающее в среде операционной системы сервера Web и осуществляющее обмен данными через стандартные потоки ввода и вывода.
Такое приложение загружается в оперативную память сервера и запускается только по явному запросу пользователя, когда к не- му выполняется обращение из документа HTML (с помощью тега типа <form action=“obrabotka.php” method = “post”>). Здесь CGI- программа — это “obrabotka.php”. Окончив обработку запроса пользователя, программа CGI завершает свою работу и выгружа- ется из памяти сервера.
Программа CGI работает на сервере как отдельный процесс. В рамках этого процесса она способна, в частности, обращаться к базам данных для выборки или обновления информации.
1.3. Язык создания CGI-сценариев — PHP
Для использования технологии CGI программа Web-сервер должна удовлетворять определенным критериям — «поддерживать CGI». CGI-программы, запускаемые на Web-сервере, представлены не двоичным кодом (т.е. скомпилированным файлом), а текстовым. Поэтому для их выполнения требуется программа-интерпретатор того языка, на котором написана эта программа. Такой интерпрета- тор включается в состав Web-сервера и вызывается им при необхо- димости заняться выполнением программного кода.
CGI-сценарий (CGI-скрипт) — программа (в текстовом виде), предназначенная для исполнения на Web-сервере. Для создания CGI-скриптов можно использовать любой язык программирова- ния — важно лишь, чтобы на том Web-сервере, где предполагает- ся эту программу запускать, имелся интерпретатор этого языка.
Препроцессор — программа (интерпретатор), работающая со- вместно с Web-сервером, которая просматривает все или некото- рые файлы, выдаваемые Web-сервером посетителям, и выполняет над ними определенные действия в зависимости от содержащихся в этих файлах инструкций. Примером препроцессора является РНР (первоначальная расшифровка была Personal Home Page).
От других CGI-языков РНР отличается в лучшую сторону прежде всего своей простотой.
При создании программы на РНР нет необходимости учиты- вать все те многочисленные мелочи, которые усложняют жизнь программистам на Perl или C++ [9]. Синтаксис языка РНР допус- кает его легкое освоение как начинающим программистом, так и тем, кто уже использовал ранее какой-либо язык программирова- ния. Можно целиком и полностью сосредоточиться на решаемой задаче и не думать о мелочах.
Именно это и делает РНР наиболее подходящим вариантом для Web-дизайнера.
Одним из достоинств РНР является возможность без особых затруднений работать с серверами баз данных. Благодаря РНР использование базы данных на сайте стало едва ли не элементар- ным. Для работы с подавляющим большинством типов баз дан- ных в РНР есть встроенные функции, поэтому теперь достаточно лишь установить на Web-сервере программу работы с базой дан- ных (наиболее часто используется бесплатная MySQL — http://www.mysql.com) и включить в текст PHP-сценария команды работы с нею.
Контрольные вопросы
1. Назовите и опишите разновидности Web-программирования.
2. Сформулируйте определение Web-сервера.
3. Покажите различия между пассивными и активными Web- серверами.
4. Назовите способы реализации активных Web-серверов.
5. Расшифруйте аббревиатуру CGI и объясните его природу.
6. Опишите схему работы CGI.
7. Что такое препроцессор?
8. Перечислите преимущества языка PHP перед другими CGI- языками.
2. ОБРАБОТКА НА СЕРВЕРЕ ЗАПРОСОВ С КЛИЕНТСКОЙ МАШИНЫ
Рис. 2.1. Форма для ввода заказа
Форма должна будет храниться на сервере в папке сайта в файле под именем index.htm. В форме для ввода количества зака- зываемых товаров используются текстовые поля. Для отправки заполненной формы на сервер служит кнопка Отправить заказ.
Для обработки заказа и вывода на экран клиента результатов обработки на сервере в папке сайта должна быть программа об- работки заказа, написанная на языке PHP. Назовем ее obrabotka.php.
Код формы (в файле index.htm) будет следующий.
Листинг 2.1
<html>
<body>
<h1>Запчасти от Занифа</h1>
<h2>Форма заказа</h2>
<form action="obrabotka.php" method="post">
<table border=2>
<tr bgcolor=#cccccc>
<td width=150>Товар</td>
<td width=100>Количество</td>
</tr>
<tr>
<td>Шины</td>
<td align="center"><input type="text" name="tireqty" size=3 maxlength=3> </td>
</tr>
<tr>
<td> Масло</td>
<td align="center"> <input type="text" name="oilqty" size=3 maxlength=3></td>
</tr>
<tr>
<td>Свечи зажигания</td>
<td align=center> <input type="text" name="sparkqty" size=3 maxlength=3></td>
</tr>
<tr>
<td colspan=2 align=center> <input type="submit" value="Отправить заказ"></td>
</tr>
</table>
</form>
</body>
</html>
Комментарии к коду формы
Для ввода количества заказываемых товаров используются текстовые поля. Для обеспечения хорошего дизайна они помеще- ны в ячейки таблицы. Таблица несколько усложняет восприятие HTML-кода, но улучшает интерфейс.
Для отправки заполненной формы на сервер служит кнопка Submit.
В теге :
<form action="obrabotka.php" method="post">
указаны:
· метод передачи данных на сервер — method="post"
· имя серверной PHP-программы для обработки заказа — obrabotka.php
Заполнив заказ, отправляем его на сервер, нажав кнопку Submit.
Необходимо, конечно, понимать метод передачи данных с формы на сервер — post. Этим мы займемся позже.
Пока примем на веру то, что имена текстовых полей для ввода количества заказываемых изделий в коде формы (tireqty, oilqty, sparkqty) должны использоваться и в программе obrabotka.php, обрабатывающей заказ и формирующей Web-страницу для от- правки клиенту.
Как только программа obrabotka.php получит значения полей tireqty, oilqty, sparkqty, она начнет работать и, для наших введен- ных в форму данных, результат обработки вернет на клиентскую машину в виде следующей Web-страницы.
Рис. 2.2. Web-страница с результатом обработки заказа
В случае пустых полей ввода должно быть выдано сообщение: Вы ничего не заказали на предыдущей странице! Цвет текста должен быть красный.
Серверная PHP-программа для такой обработки заказа — obrabotka.php будет иметь следующий код.
Листинг 2.2
<html>
<head>
<title>автозапчасти от Занифа</title>
</head>
<body>
<h1 align="center"> Автозапчасти от Занифа</h1>
<h2 align="center"> Результаты заказа</h2>
<?
echo "Заказ обработан в "; echo date ("H:i.d.m.Y")."<br>";
$totalqty=$tireqty+$oilqty+$sparkqty; if ($totalqty==0)
{
echo "<font color=red>";
echo "Вы ничего не заказали на предыдущей странице"; echo "</font>";
exit();
}
echo "Ваш заказ следующий:<br>"; echo $tireqty." шины <br>";
echo $oilqty." масло <br>"; echo $sparkqty." свечи <br>";
echo "<br>Заказано всего: ".$totalqty."<br>"; define ("TIREPRICE",1000);
define ("OILPRICE",300); define ("SPARKPRICE",100);
$totalamount=TIREPRICE*$tireqty+OILPRICE*$oilqty+
SPARKPRICE*$sparkqty;
$totalamountf=number_format($totalamount,2);
echo "<br> Стоимость заказа без налога:".$totalamountf;
$taxrate=0.1;
$totalamount=$totalamount*(1+$taxrate);
$totalamountf=number_format($totalamount,2);
echo "<br> Стоимость заказа с налогом:".$totalamountf;
?>
</body>
2.2. Особенности синтаксиса языка PHP
Систематическое и достаточно полное для решения наших за- дач изложение материала по языку PHP дано в разделе 4 этого пособия. Для получения детальной и исчерпывающей информа- ции, естественно, надо обращаться к специальной литературе, перечень которой приведен в списке литературы.
Чтобы понять эту программу контингенту, для которого пред- назначено данное пособие, достаточно ознакомиться с особенно- стями синтаксиса языка PHP и несколькими операторами. Они представлены в следующей таблице.
Таблица 2.1
Действие | Пример и описание |
Внедрение PHP-скриптов в HTML-код | Простейший способ такой: <? PHP-скрипт ?> |
Комментарий однострочный | // Вывод даты в формате: 23:15, 08.05.2009 или # Однострочный комментарий |
Комментарий многостроч- ный | /* Многострочный комментарий*/ |
Оператор программы завер- шается символом «;». Сим- вол «;» ставится даже перед «else» | $totalqty=$tireqty+$oilqty+$sparkqty; |
Правила конструирования идентификаторов | Первым символом в идентификаторах переменных должен быть символ $. Ос- тальные требования к идентификаторам как в Паскале. Но идентификаторы регистрозависимые (однако, имена встроенных функций и служебные слова не регистрозависимые) |
Строковые значения заклю- чаются в кавычки | $name=”Расмус Лердоф”; |
Задание констант | define("OILPRICE", 300); |
Вывод данных на экран | Оператор echo |
Перевод курсора в начало следующей строки | echo "<br>"; |
Тег <P> перед выводимой строкой вставляет пустую строку | echo "<p>Ваш заказ следующий"; |
Вывод строкового значения | echo "Заказ обработан в "; |
Вывод значения арифмети- ческого выражения | echo (20+12); или Echo 20+12; |
Вывод значения переменной | echo $name; |
Вывод значения константы | echo CONST; //здесь CONST имя констан- ты |
Вывод смешанного значения | echo "$oilqty бутылки масла <br>"; |
Конкатенация | echo $oilqty. " бутылки масла <br>"; |
Конкатенация и вычисление значения функции | Echo “В массиве ”. count($arr). “элемен- тов” |
Вывод имен переменных без интерпретации в виде по- следовательности символов | Echo ‘$name Расмус Лердоф’; (выведет строку «$name Расмус Лердоф») |
Вывод значения функции | echo date ("H:i, d. m. y."); |
Форматирование для вывода числа с двумя десятичными знаками | $totalamountf=number_format ($totalamount,2); |
Условный оператор | If (условие) {ветвь 1}; else {ветвь 2}; |
Обратите внимание на то, что имена текстовых полей для вво- да количества заказываемых изделий в коде формы (tireqty, oilqty, sparkqty) с очень небольшим изменением используются и в про- грамме obrabotka.php, обрабатывающей заказ и формирующей Web-страницу для отправки клиенту. Изменение имен полей сво- дится к добавлению в начало идентификатора символа $.
Возникает вопрос: как программа обработки получает значе- ния этих переменных, введенных в форму пользователем. Ответ на этот вопрос дается в следующем подразделе.
2.3. Методы передачи информации в серверную PHP-программу
В серверном Web-программировании достаточно распростра- ненной задачей является передача данных (параметров) PHP-про- грамме извне (из другой программы, из адресной строки браузера).
В подразделе 2.1 потребовалась передача данных, введенных в форму, и имен этих данных обрабатывающей PHP-программе. Там для этого был использован метод POST.
2.3.1. Метод POST
Работает следующим образом. Данные, необходимые обраба- тывающей программе, вводятся пользователем в соответствую- щие поля HTML-формы (рис. 2.1). В нашей задаче это поля типа Text.
При нажатии кнопки типа Submit (у нас это кнопка Отпра- вить заказ) имена полей ввода и введенные в них значения от- правляются на сервер блоком данных и там могут быть использо- ваны указанной в теге <FORM> программой (у нас это программа из файла obrabotka.php).
Чтобы обеспечить такую совместимость, в обрабатывающей программе для обозначения получаемых с формы данных надо использовать имена, получаемые путем добавления к именам по- лей формы символа $ (в нашем примере — $tireqty, $oilqty,
$sparkqty).
На некоторых серверах в обрабатывающей программе эти имена и значения переменных можно использовать без всяких подготовительных операций (как в нашей программе):
echo $tireqty. " шины <br>";
echo $oilqty. " бутылки масла <br>"; echo $sparkqty. " свечи зажигания <br>";
Но эта возможность определяется состоянием директивы regis- ter_globals в разделе Data Handling конфигурационного файла php.ini (он находится по адресу c:\webservers\usr\local\php5\php.ini). Если она выключена (по умолчанию это так), т.е. register_globals= Off, такое прямое использование будет запрещено.
Тогда приходится пользоваться так называемым суперглобаль- ным массивом $_POST. Этот ассоциативный массив формируется на сервере из данных, поступающих с формы. В нашем случае он будет иметь вид:
$_POST= array (“tireqty” =>2, “oilqty” => 1, “sparkqty” =>4)
Здесь показан один из способов формирования ассоциативного массива в PHP.
Имея некоторые знания по работе с обычными одномерными массивами, можно догадаться, что ассоциативный массив отлича- ется от обычного тем, что в нем вместо числовых индексов ис- пользуются словесные, «смысловые» индексы. Значения элемен- тов массива взяты из нашего примера, из заполненной формы.
Для такого сервера нашу обрабатывающую программу при- шлось бы изменить. А именно, значения требуемых переменных пришлось бы брать из суперглобального массива таким образом:
$tireqty =$_POST [“tireqty”];
$oilqty =$_POST [“toilqty”];
$sparkqty =$_POST [“sparkqty”];
2.3.2. Метод GET
При отправке данных с формы на сервер по методу GET со- держимое формы добавляется в адресной строке браузера к URL программы, принимающей эти данные, в следующем виде:
http://action.php?name1=value1&name2=value2&name3=value3. Здесь action.php— это URL-адрес программы, которая долж-
на обрабатывать форму. Обычно это программа, заданная в атри- буте actionтега form. Имена name1, name2, name3 соответст- вуют именам элементов формы, а value1, value2, value3 — значениям этих элементов.
В нашем примере после ввода данных в форму и нажатия кла- виши Отправить заказв адресную строку браузера занесется следующее значение:
http://autoparts/obrabotka.php?tireqty=2&oilqty=1&sparqqty=4. Таким образом, передача данных серверной программе по ме-
тоду GET происходит совсем не так, как при методе POST. А именно, передаваемые данные «проходят» через адресную строку браузера, и они видны пользователю (рис. 2.3).
В принципе, для передачи данных методом GET вводить дан- ные в поля HTML-формы не обязательно. Можно просто доба- вить в строку URL нужные переменные и их значения.
Это будет выглядеть, как представлено на рис. 2.4. И данные будут переданы в серверную программу, хотя в поля формы дан- ные не введены.
Рис. 2.3. Передача данных с формой по методу GET
Рис. 2.4. Передача данных с формой без заполнения формы
Итак, из рассмотренного примера понятно, что для полей вво- да текста (это элементы inputс атрибутом type=text) переда- ваемым значением будет то, что введет пользователь. Это же справедливо и для поля ввода пароля (тег inputс атрибутом type=password). Если пользователь ничего не вводит в такое поле, то в строке адреса будет присутствовать элемент name= (без значения), где name соответствует имени этого элемен- та формы.
Доступ к переданным данным в серверной программе проис- ходит по той же схеме, что и в методе POST. Если директива register_globals в конфигурационном файле php.ini включена, пе- реданные из формы значения можно использовать напрямую.
В противном случае данные придется извлекать из супергло- бального массива $_GET:
$tireqty =$_GET [“tireqty”];
$oilqty =$_GET [“oilqty”];
$sparkqty =$_GET [“sparkqty”];
После рассмотрения обоих методов передачи данных в сер- верную программу возникает вопрос: «А нельзя ли обходиться только методом POST?» В основном так и делается. Но использо- вать метод GET удобно при отладке скриптов (тогда можно ви- деть имена и значения передаваемых данных) [7].
2.4. Варианты передачи данных серверной программе с разных элементов формы
На практике для передачи данных серверной программе с по- мощью формы используются не только рассмотренные выше по- ля типов text и password. Бывает потребность брать данные с по- лей типов: Radio, CheckBox, Select, Textarea.
Работу с полями этих типов рассмотрим на примере обработки анкетных данных (рис. 2.5).
Рис. 2.5. Форма для заполнения анкеты
Такая Web-страница создается следующим HTML-кодом.
Листинг 2.3
<h3 align="center">Анкета </h3>
<form action="obrabotka.php" method="post"> Введите фамилию и инициалы:
<input type="text" name="fio" size=30><br>
E-mail: <input type="text" name="email" size=30><p>
Укажите, к какой группе пользователей вы себя относите:<br>
<input type="radio" name="group" value="предприниматель">предприниматель<br>
<input type="radio" name="group" value="студент">студент<br>
<input type="radio" name="group" value="преподаватель">преподаватель<p>
Какие из сервисов Интернета вы используете наиболее часто:
<br>
<input type="checkbox" name="service[]" value="www"> WWW
<br>
<input type="checkbox" name="service[]" value="e-mail"> e-mail
<br>
<input type="checkbox" name="service[]" value="ftp">FTP<p> Каким браузером вы пользуетесь :<br>
<select name="browser[]" multiple>
<option value="Internet Explorer" selected> Internet Explorer
<option value="Netscape Navigator"> Netscape Navigator
<option value="Opera"> Opera
<option value="Mozilla Firefox"> Mozilla Firefox
</select> <p>
Какую еще информацию вы хотели бы видеть на нашем сайте?
<br>
<textarea name="pojelanie" rows=4 cols=30></textarea><p>
<input type="submit" value="Отправить">
<input type="reset" value="Очистить">
Чтобы понять работу скрипта, обрабатывающего анкету, сле- дует уяснить следующее.
Имена радиокнопок одинаковые (group), но кнопки отличают- ся значениями атрибута value.
Имена независимых переключателей (флажков) тоже одинако- вые (service). Они тоже отличаются значениями атрибута value. Но в отличие от радиокнопок, в этом случае может быть выбрано любое количество флажков (от 0 до 3 в нашем примере). Поэтому значение атрибута name наших флажков задается в виде массива: name="service[]". А PHP-скрипт можно разработать такой, чтобы, обработав массив, можно было разобраться, что выбрал пользова- тель. Заметим также, что в материалах по языку HTML возмож- ность задания имени группы флажков в виде массива обычно не упоминается.
Для раскрывающегося списка тоже имеется возможность вы- бора нескольких опций из списка. Для этого в нашем примере в теге select значение атрибута name задается в виде массива:
<select name="browsers[]">.
Надо заметить, что в обоих случаях, если значение атрибута name не задавать в виде массива, выбирать можно будет только одну кнопку (checkbox) и одну опцию (select). Обрабатывать эти поля надо не как массив, а как обычную переменную.
После обработки нашей анкеты пользователь должен получить результат в виде следующей Web-страницы.
Рис. 2.6. Результат обработки анкеты
Такую обработку анкеты может выполнить следующий скрипт.
<body>
<?
$fio=$_POST["'fio'];
$email=$_POST["email"];
//if (isset($_POST['group']))
$selected_radio = $_POST['group'];
echo "Уважаемый $fio !<br>";
echo "Вы ". $selected_radio." <br>";
echo "Из сервисов Интернета Вы используете наиболее часто:
<br>";
foreach ($_POST["service"] as $index=>$value)
{echo "$value<br>";}
echo "Вы пользуетесь браузером: <br>"; foreach ($_POST["browser"]
as $index=>$value)
{echo "$value<br>";}
$pojelanie = $_POST["pojelanie"];
echo "Ваше пожелание следующее:<br>"; echo $pojelanie;
?>
</body>
</html>
Разбор скрипта начнем с 6-й строки: $selected_radio =
$_POST['group'].
Так как выбранной может быть только одна радиокнопка, при обработке группы из трех радиокнопок в суперглобальный мас- сив попадает значение атрибута value той радиокнопки, которая была выбрана пользователем. В нашем примере это радиокнопка со значением “студент”. Переменной $selected_radio присваивает- ся именно это значение.
Строки 9—12 обрабатывают группу из трех флажков, соответ- ствующих трем сервисам Интернета.
echo "Из сервисов Интернета Вы используете наиболее часто:
<br>";
foreach ($_POST["service"] as $index=>$value)
{echo "$value<br>";}
В отличие от радиокнопок, в этом случае может быть выбрано любое количество флажков, и их значения помещаются в супер- глобальный массив $_POST["service"]. Для выборки значений из этого массива используется функция foreach. Она по очереди про- сматривает элементы массива, а оператор echo выводит значения элементов на экран.
Строки 13—16 обрабатывают раскрывающееся меню, содер- жащее 4 значения.
echo "Вы пользуетесь браузером: <br>"; foreach ($_POST["browser"]
as $index=>$value)
{echo "$value<br>";}
Хотя в нашей анкете элемент формы select позволяет одновре- менно выбрать только одну опцию из списка, есть возможность превратить его в элемент с множественным выбором. Для этого в тег select надо было бы добавить атрибут multiple таким образом:
<select name="browser[]" multiple>.
В таком случае может быть выбрано любое количество флаж- ков, и их значения помещаются в суперглобальный массив
$_POST["service"]. Для выборки значений из этого массива, как и в предыдущем фрагменте, используется функция foreach. Она по очереди просматривает элементы массива, а оператор echo выво- дит значения элементов на экран.
Строки 17—19 обрабатывают многострочное текстовое поле с именем pojelanie.
$pojelanie = $_POST["pojelanie"];
echo "Ваше пожелание следующее:<br>"; echo $pojelanie;
Как видим, многострочное текстовое поле (textarea) обрабаты- вается точно так же, как и простое текстовое поле (text).
Теперь, после рассмотрения вариантов передачи данных со всех типов элементов ввода в форму, можно вернуться к рассмот- рению структуры суперглобального массива $_POST. Для нашей анкеты после его заполнения этот массив будет содержать сле- дующие элементы с их индексами:
· $_POST["fio"] = Скриптов С.С;
· $_POST["email"] =scr12@ mail.ru;
· $_POST["group"] = студент;
· $_POST["service"[0]] = WWW;
· $_POST["service"[1]] = email;
· $_POST["browser"[0]] = Mozilla Firefox;
· $_POST["pojelanie"] = Материалы по Web-программированию. Еще раз обратим внимание на то, что два элемента суперглобаль- ного массива, а именно $_POST["service"[]] и $_POST["browsers"[0]] сами являются массивами. Причем размерность их зависит от того,
сколько значений выбрал пользователь.
2.5. Проверка данных, введенных в форму
При передаче данных из формы в серверную программу необ- ходимо бывает организовать контроль:
· полноты введенных данных (все ли поля заполнены);
· корректности введенных данных (например, по типу — бу- квы или числа);
· корректности введенных данных (например, вхождение зна- чений данных в заданный диапазон).
С этой целью рассмотрим еще один пример.
Составим серверное Web-приложение, выполняющее следую- щие функции.
1. Вывод формы с запросом на ввод сторон треугольника.
2. После завершения ввода и нажатия кнопки типа Submit проверка на полноту ввода.
3. Проверка того, что в поля ввода введены только числа.
4. Проверка на корректность введенных значений сторон тре- угольника (должны соблюдаться известные из геометрии соотно- шения между длинами сторон треугольника).
5. Обеспечение в любом из предыдущих трех случаев непра- вильного ввода повторного ввода данных в форму.
6. Вычисление площади треугольника по формуле Герона.
Форма для решения задачи может иметь следующий вид (рис. 2.7).
Рис. 2.7. Форма для ввода исходных данных для решения задачи
Для ее реализации потребуется такой HTML-код:
Листинг 2.4
<html><title>Вычисление площади треугольника</title>
<body>
<form action="obrabotka.php" method="POST"> Введите стороны треугольника:
<br>a = <input type="text" name="a">
<br>b = <input type="text" name="b">
<br>c = <input type="text" name="c">
<p><input type="submit" value="Вычислить">
</form></body></html>
PHP-скрипт для решения нашей задачи будет такой:
Листинг 2.5
<html><title>Вычисление площади треугольника</title><body>
<?php
$a=$_POST["a"];
$b=$_POST["b"];
$c=$_POST["c"]; if(!is_numeric($a)||!is_numeric($b)||!is_numeric($c))
{echo "Ошибка! Введены не числа или заполнены не все поля. "; echo"<a href='index.htm'>На повторный ввод</a>";
exit();}
if($a+$b<=$c||$a+$c<=$b||$b+$b<=$a)
{echo "Ошибка! Эти значения не могут быть сторонами тре- угольника. ";
echo"<a href='index.htm'>На повторный ввод</a>"; exit();}
$pp=($a+$b+$c)/2;
$s_tr=sqrt($pp*($pp-$a)*($pp-$b)*($pp-$c)); echo "Площадь треугольника = ".$s_tr;
?>
</body></html>
Разбор скрипта следует начать с 6-й строки. Она содержит ус- ловие проверки ввода числовых значений во все поля формы. Функция is_numeric($a) возвращает значение true только в том случае, если переменная $a содержит данные, и эти данные явля- ются числом. В остальных случаях (поле не заполнено или в него введены не цифры) результатом выполнения этой функции будет значение false.
Если условие в строке 6 будет выполнено, значит пользователь ввел неверные данные или что-то не ввел. Об этом ему сообщит строка 7: «Ошибка! Введены не числа или заполнены не все поля». Строка 8 выведет гиперссылку На повторный ввод. Щелчок по этой ссылке снова вызовет на экран форму для ввода исходных данных.
Вызов функции exit() в строках 9 и 13 нужен для завершения выполнения скрипта после вывода формы для повторного ввода данных.
Строка 10 содержит условие проверки корректности введен- ных длин сторон треугольника. При некорректности введенных значений строка 11 выводит сообщение: «Ошибка! Эти значения не могут быть сторонами треугольника».
Строка 12 выведет гиперссылку На повторный ввод. Щелчок по этой ссылке снова вызовет на экран форму для ввода исходных данных.
Строки 14—16 выполняются, когда во все поля формы будут введены правильные значения. Здесь вычисляется площадь тре- угольника по форме Герона и выводится результат.
2.6. Разработка и отладка локального сайта с помощью локального сервера
Написать код формы и код PHP-скрипта можно на локальном компьютере в редакторе Блокнот. Если бы сайт был статический, его можно было бы отладить на локальном компьютере с помо- щью браузера. Но в случае интерактивного сайта его сначала надо установить (опубликовать) на сервере какого-нибудь провайдера (получить хостинг, бесплатный или платный). Получить хостинг в наше время тоже не проблема. Проблемой становится отладка сайта. Как мы уже знаем по собственному опыту, чтобы сайт за- работал, придется устранить немало ошибок.
В случае дистанционного (настоящего) хостинга это означает, что после устранения каждой ошибки надо будет исправленный файл закачивать на удаленный сервер, а это — деньги, время, лишняя работа.
Выходом из этой ситуации является установка виртуального сервера на своей локальной машине. Установив такой сервер, ин- терактивный сайт можно создать и отладить на своей машине. Далее отлаженный сайт можно выставить в Интернет.
2.6.1. Система Денвер
Есть прекрасные варианты решения этой проблемы. Наиболее известное решение — это использование «джентльменского на- бора» сайтостроителя — бесплатного пакета Денвер.
Денвер - локальный сервер. Скачать Денвер, установить WAMP сервер для localhost (PHP 5.3.13, MySQL 5.1, PostgreSQL 8.4 etc.)
Джентльменский набор Web-разработчика («Д.н.w.р», читается «Денвер») — проект Дмитрия Котерова, локальный сервер (Apache, PHP, MySQL, Perl и т.д.) и программная оболочка, используемые Web-разработчиками для разработки сайтов на «домашней» (локальной) Windows-машине без необходимости выхода в Интернет. Главная особенность Денвера — удобство при удаленной работе сразу над несколькими независимыми проектами и возможность размещения на Flash-накопителе.
· графический интерфейс СУБД MySQL — программа phpMyAdmin 3.2.3.
Этот пакет отработан очень хорошо. Установка происходит легко, быстро и без ошибок.
2.6.2. Установка Web-сервера на локальном компьютере
1. Запускаем инсталлятор.
2. В процессе инсталляции Денвера нам придется ответить на задаваемые вопросы следующим образом:
· Название папки для установки: например WebServer;
· В качестве буквы будущего виртуального диска примем предложенную букву Z;
· Выберем предложенный режим 1;
· Принимаем предложение Создать ярлыки на рабочем столе (Start servers, ReStart servers, Stop servers).
Более подробное описание установки можно посмотреть в интернете, например на ресурсе http://codeacademy.ru/blog/66/nastroika-instrumentariya-dlya-raboty-s-php-denver.
2.6.3. Структура папок локального Web-сервера
При установке Denver в папку Webservers создаются сле- дующие папки (рис. 2.8—2.14).
Рис. 2.8. Содержание папки WebServers
Рис. 2.9. Содержание папки WebServers3\denver
Рис. 2.10. Содержание папки WebServers\tmp
Рис. 2.11. Содержание папки WebServers\usr
В папке usr\local при дальнейшем погружении можно увидеть:
· Сервер Apache
· СУБД MySQL
· Интерпретатор PHP
Довольно подробное описание системы Денвер дано в файле Readme.txt в папке websrevers.
HTML-документы должны находиться в директориях
/home/localhost /www. Содержимое директории home показано на следующем рисунке.
Рис. 2.12. Содержание папки WebServers\home
При инсталляции Денвера сконфигурированы 3 виртуальных хоста: custom, localhost и test1.ru (cgi_glob не сайт, там хранятся cgi-скрипты).
В директории третьего хоста