Этапысоздания веб-приложения. Основы РНР и MySQL
Лекция
План
ВВЕДЕНИЕ
1. Чтотакое веб-программирование. Основные технологии
1.1. Клиент-Сервер
1.2. HTML-формы. Методы отправки данных на сервер с помощьюформы
1.3. Технология CGI
2. PHP:Препроцессор Гипертекста
2.1. Что такое PHP?
2.2. Возможности PHP
2.3. Почему нужно выбирать PHP
2.4. Недостатки PHP
2.5. Встраивание PHP в HTML — форму
2.6. HTML-формы. Массивы $_GET и $_POST
2.6.1. Особенности метода отправки формы POST
2.6.2. Особенности метода отправки формы GET
2.7. Функция htmlspecialchars()
2.8. Применение функции phpinfo() для отладки
3. Чтотакое MySQL
3.1. Возможности MySQL.
3.2. Примеры использования PHP совместно с MySQL
3.2.1. Работа с формами
3.2.2. Сохранение данных в базе данных MySQL
3.2.3. Получение (извлечение) данных из базы данных MySQL
ВВЕДЕНИЕ
Основные технологиивеб-программирования. Методы отправки данных на сервер с помощью HTML-формы.PHP — Препроцессор Гипертекста. Сохранение данных в базе данных MySQL.Клиент-Сервер и технология CGI. Примеры использования PHP совместно с MySQL.
Рассмотрим основные этапысоздания web-приложения на языке PHP.
Предполагается, что Вызнаете основы языка разметки HTML и имеете небольшой опытпрограммирования.
Прежде, чем приступать ксозданию web-приложения, нужно выяснить, что понимаютпод web — программированием./>/>/>
1. Что такое веб-программирование.Основные технологии/>/>/> 1.1. Клиент-Сервер
Когда Вы программировали,например, на Delphi, Visual Basic, или Visual C++, то привыкли ктакой схеме работы программы: нажимаете кнопку на клавиатуре ►выполняется код ► выводится результат. Все это выполняется на одномкомпьютере.
В web -программировании все обстоитпо-другому.
Когда Вы вводите вадресной строке браузера URL (Universal Resource Location, или в просторечии — адрес) происходит следующее:
● Браузер открываетсоединение с сервером.
● Браузеротправляет серверу запрос на получение страницы.
● Сервер формируетответ (чаще всего — HTML-код) браузеру и закрывает соединение.
● Браузеробрабатывает HTML-код и отображает web -страницу, которую Вы видите на экране монитора.
Еще до того, как Выувидели на экране запрошенную страницу, соединение с сервером закрыто, и он о Васзабыл. И когда Вы введете другой (или тот же самый) адрес, или щелкните по ссылке,или нажмете на кнопку HTML-формы — та же схема повторится снова.
Такую схему работыназывают «клиент-сервер». Клиент в данном случае — браузер.
Соединение с web -сервером длится промежуток временимежду щелчком по ссылке (или другим способом запроса) и началом отображения web -страницы. Большинство браузеров вовремя соединения отображают индикатор, например, индикатор MS Internet Explorerотображает анимацию в правом верхнем углу.
Внимательный студент можетзаметить — а как же так, я уже читаю страницу, а индикатор все еще показываетпроцесс соединения? Дело в том, что тэг (загрузкаизображения) и некоторые другие теги HTML – кода — это еще один запрос ксерверу. Выполняется он точно так же, как и любой другой запрос — по той жесхеме.
Чтобы навсегда избавитьсяот восприятия HTTP как «черного ящика»,«притворимся» браузером с помощью telnet'а:
1. Запустим telnet www.php5.ru
80
2. Введем в окнетерминала следующее (если ввод не отображается — ничего страшного):
GET /HTTP/1.0 [здесьнажмемEnter]
Host: www.php5.ru
[здесь нажмем Enter дважды]
Нажатие Enterсоответствует, как правило, комбинации символов CR + LF, обозначаемыхкак \r\n. Далее будет использоваться именно это обозначение.
По экрану монитора пробежитHTML-код страницы www.php5.ru/.
HTML-код текущей страницыможно просмотреть практически в любом браузере, выбрав в меню «Вид|ПросмотрHTML-кода»:
/>
/>
Картинки, фреймы — этодополнительные запросы: при обработке (парсинге) HTML-кода, браузер, натыкаясьна тэг осуществляет дополнительныйзапрос к серверу — запрос картинки, и отображает ее на месте, где стоит тэг .
Введите:
telnetwww.php5.ru80
GET/php/php5ru.png HTTP/1.0\r\n
Host:www.php5.ru\r\n\r\n
По экрану пробежит то,что бы вы увидели, если б просмотрели этотpng-файл в текстовомредакторе./> 1.2. HTML-формы. Методы отправкиданных на сервер с помощью формы
Одно из наиболее распространенных приложений любого языкасоздания серверных сценариев – обработка HTML — форм.Web-программирование в большей части представляет собой обработку различныхданных, введенных пользователем.
РНРоблегчает задачу обработки и разбора форм, поступивших из браузера, так как вязык на самом нижнем уровне встроены все необходимые возможности. Поэтомупрограммисту не приходится даже и задумываться над особенностями протокола HTTPи размышлять, как же происходит отправка и прием роsт-форм или даже загрузка файлов.
С HTML-формами Выуже встречались при изучении языка разметки HTML.
Рассмотрим пример посылки сообщения из формы по электроннойпочте.
Листинг e_mail.html.Посылка сообщения из формы по e-mail
Посылка формы по е-mail
НажмитеCброси заполните заказ.BR>
TR>
TD>Ваше имя:TD>
Ваш адрес:
Прислать:
Еслиобработать этот HTML-код браузером, то отобразится web -страница, которую можно увидеть на экране монитора:
/>
Пользователь нажимает кнопку «Сброс», и поля принимаютзначения, установленные по умолчанию. Форма заполняется пользователем, и понажатию кнопки «Послать заказ» отправляется по адресу myaddres@mail.ru.Обычно браузер не сам отсылает форму, а поручает эту работу почтовой программе,установленной по умолчанию в операционной системе компьютера (например, Outlook). Письмо посылается в виде:
subjct: ФормаотправленаизMicrosoft Internet Explorer
name= Прохоров Виктор Сергеевич
value=prohwik@mail.ru
obj= «Методические указания»
Письмо составляется из пар имя=значение, которыевыбираются по порядку из полей формы.
Рассмотрим подробнееследующий пример.
Листинг form_1.html
ВведитеВашеимя:
Сохранив этот код вHTML-файле form_1.html и просмотрев его с помощью браузера,можно увидеть HTML-форму:
/>
Форма реализована тегом-контейнером . Тегсвоими атрибутами указывает:
● адрес сценария, которому будет послана форма;
● способ пересылки и характеристику данных,содержащихся в форме. Начальный и конечный /form> теги задают границы формы. Ихуказание является обязательным.
Атрибуты тега-контейнера (все необязательные):
● action—атрибут, в качестве значения которого указывают URL-адрес (полный илиотносительный) запрашиваемой CGI-программы. Эта программа будетобрабатывать данные, содержащиеся в форме. Допустимо использовать запись MAILTO:URL.В этом случае форма будет послана по электронной почте. Если атрибут actionне указать, то содержимое формы будет отправлено на URL-адрес, скоторого загружена данная web-страница,то есть «саму на себя». Это удобное сокращение, но по стандарту HTMLатрибут action обязателен.
● method — определяет метод HTTP, используемыйдля пересылки данных формы от браузера к серверу. Атрибут method можетпринимать два значения: get или post:
♦ get — отправка данных формы в адресной строке. Вы могли заметить на различных сайтахприсутствие в конце URL символа "?" и следующих за ним данныхв формате параметр=значение. Здесь «параметр» соответствуетзначению атрибута name элементов формы (см. ниже про тэг ),а «значение» — содержимому атрибута value (в нем,например, содержится ввод пользователя в текстовое поле того же тэга ).
Для примера — попробуйтепоискать что-нибудь в Яндексе и обратите внимание на адресную строку браузера.Это и есть способ get.
♦ post — данные формы отправляются в теле запроса. Если не совсем понятно (или совсемнепонятно), что это такое — не беспокойтесь, скоро мы к этому вопросу вернемся.
Если атрибутmethod неуказан — подразумевается «get».
● enctype — необязательный атрибут. Указываеттип содержимого формы, используемый для определения формата кодирования при еепересылке. В HTML определены два возможных значения для атрибута enctype:
♦ APPLICATION/X-WWW-FORM-URLENCODED (используетсяпо умолчанию).
♦ MULTIPART/FORM-DATA.
Тег позволяет создавать внутри формыполя ввода строки текста, имени файла, пароля и др. У нетконечного тега. Атрибуты и особенности использования зависят от способа его использования.
Тэг — задает элемент формы, определяемый атрибутом type:
♦ Значение «text»задает однострочное текстовое поле ввода.
♦ Значение «submit»задает кнопку, при нажатии которой происходит отправка формы на сервер.
Возможны и другиезначения (да и — не единственный тэг, задающий элементформы), но их мы рассмотрим в следующих главах.
Итак, что же происходит,когда нажимают кнопку «OK»?
1. Браузер просматриваетвходящие в форму элементы и формирует из их атрибутов name и valueданные формы. Допустим, введено имя Vasya. В этом случае данные формы: name=Vasya&okbutton=OK.
2. Браузер устанавливаетсоединение с сервером, отправляет на сервер запрос документа, указанного ватрибуте action тэга , используя метод отправкиданных, указанный в атрибуте method (в данном случае — GET),передавая в запросе данные формы.
3. Сервер анализируетполученный запрос, формирует ответ, отправляет его браузеру и закрываетсоединение.
4. Браузер отображаетполученный от сервера документ.
Отправка того же запросавручную (с помошью telnet) выглядит следующим образом (предположим, чтодоменное имя сайта — www.example.com):
telnetwww.example.com 80
GET/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n
Нажатие submit-кнопкив форме с методом отправки «GET» аналогично вводусоответствующего URL (со знаком вопроса и данными формы в конце) вадресной строке браузера: www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK
На самом деле, метод GETиспользуется всегда, когда Вы запрашиваете с сервера какой-либо документ,просто введя его URL, или щелкнув по ссылке. При использовании , к URL просто добавляются знаквопроса и данные формы.
Как же нам в сценарии получить строку параметров, переданнуюпосле знака вопроса в URL при обращении к сценарию? Для этого можнопроанализировать переменную окружения QUERY_STRING, которая в РНРдоступна под именем $_SERVER[QUERY_STRING].
Напишем пример, чтобы это проиллюстрировать (листинг qs.php).
Листинг qs.php.Вывод параметров командной строки.
echo «Данные изкомандной строки: $_SERVER[QUERY_STRING]»;
?>
Если теперь запустить этот сценарий из браузера (перед этимсохранив его в корневом каталоге сервера) таким образом:
localhost/qs.php?this+is+the+world/
то получим документследующего содержания:Данные из командной строки: this+is+the+world
/>
Обратите внимание на то, что URL-декодированиесимволов не произошло: строка $_server [' query_string '], как иодноименная переменная окружения, всегда приходит в той же самой форме, в какойона была послана браузером.
Так как РНР изначально создавался именно как язык дляWeb-программирования, то он дополнительно проводит некоторую работу спеременной query_string перед передачей управления сценарию. А именно,он разбивает ее по пробельным символам (в примере пробелов нет, их заменяютсимволы +, но эти символы РНР также понимает правильно) ипомещает полученные кусочки в массив-список $argv, который впоследствииможет быть проанализирован в программе.
Массив $argv используется при программировании на РНРкрайне редко, что связано с большими возможностями интерпретатора по разборуданных, поступивших от пользователя. Однако в некоторых (учебных) ситуациях егоприменение оправдано.
Возможно, все этитехнические подробности кажутся невероятно скучными и даже ненужными («апри чем тут PHP?»). Но это основы работы по протоколу HTTP, которыенеобходимо знать каждому web-программисту.
Теперь заменим первуюстроку нашей формы на следующую:
Мы указали метод отправки«POST». В этом случае данные отправляются на сервер несколькодругим способом:
telnetwww.example.com 80
POST/cgi-bin/form_handler.cgi HTTP/1.0\r\n
Host: www.example.com\r\n
Content-Type:application/x-www-form-urlencoded\r\n
Content-Length:22\r\n
\r\n
name=Vasya&okbutton=OK
При использовании метода POSTданные формы отправляются уже после «двух Enter-ов» — в телезапроса. Все, что выше — на самом деле заголовок запроса (и когда мыиспользовали метод GET, данные формы отправлялись в заголовке).
Для того, чтобы серверзнал, на каком байте закончить чтение тела запроса, в заголовке присутствуетстрока Content-Length; о том же, что данные формы будут переданы виде параметр1=значение1&параметр2=значение2...,причем значения передаются в виде urlencode — то есть, точно так же, каки с помощью метода GET, но в теле запроса, — серверу сообщает заголовок «Content-Type:application/x-www-form-urlencoded».
О том, что такое urlencode — чуть ниже.
Преимущество метода POST:отсутствие ограничения на длину строки с данными формы.
При использовании метода POSTневозможно отправить форму, просто «зайдя по ссылке», как было с GET.
Для краткости изложения,введем термины «GET-форма» и «POST-форма», где префикссоответствует значению атрибута method тэга.
При использовании POST-формы,в ее атрибуте action можно указать после знака вопроса и параметры GET-формы.Таким образом, метод POST включает в себя и метод GET./>/>/>1.3. ТехнологияCGI
Мы разобрались, каксоздать HTML-форму, и как браузер отправляет введенные в нее данные насервер. Но пока не понятно, что будет сервер делать с этими данными.
Сам по себе web-сервер умеет только отдаватьзапрошенную страницу, и ничего более того, и ему все переданные данные формы, вобщем-то, совершенно безразличны. Для того, чтобы можно было обработать этиданные с помощью какой-либо программы и динамически сформировать ответбраузеру, и была изобретена технология CGI (Common Gateway Interface).
Взглянем на этот URL:www.example.com/cgi-bin/form_handler.cgi. Первое предположение,которое можно сделать на его счет, обычно такое: сервер отдает содержимое файлаform_handler.cgi из каталога cgi-bin. Однако, в случае с технологиейCGI дело обстоит по-другому. Сервер запускает программу form_handler.cgiи передает ей данные формы. Программа же формирует текст, который передаетсябраузеру в качестве ответа на запрос.
Программу form_handler.cgiможно написать на любом языке программирования, главное — соблюдать в программестандарт CGI. Можно использовать, например, популярный скриптовый языкPerl. А можно написать все на Си, или на shell-скриптах… Для примера, напишемэту программу на Си. Но сначала разберемся, как происходит обмен данными между web-сервером и CGI-программой:
1. Перед запуском CGI-программы,сервер устанавливает переменные окружения (Вам они наверняка знакомы по командеPATH). В каждый мало-мальски серьезном языке программирования есть средства длячтения переменных окружения. Стандарт CGI определяет весьма значительныйнабор переменных, которые должны быть определены перед запуском CGI-программы.Рассмотрим сейчас только три из них:
REQUEST_METHOD — метод передачи данных -GETили POST (есть и другие, но пока мы их не рассматриваем)
QUERY_STRING — содержит частьURL послевопросительного знака, или, другими словами, данные GET-формы.
CONTENT_LENGTH — длина тела запроса (данныеPOST-формы).
2. Сервер запускает CGI-программу.Тело запроса передается программе в виде стандартного ввода (stdin) — будто бы эти данные были введены с клавиатуры.
3. Программа выдает ответбраузера на стандартный вывод (stdout) — «на экран».Этот вывод перехватывается веб-сервером и передается браузеру.
Это CGI-программа на Си, выводящая содержимоеполученных от web-сервера параметров форм:
1. #include
2. #include
3.
4. intmain(void)
5. {
6. // Читаемпеременные среды, установленные веб-сервером
7. char*query_string = getenv(«QUERY_STRING»);
8. char*request_method = getenv(«REQUEST_METHOD»);
9.
10. char*post_data; // Буфер для данных POST-запроса
11. intpost_length= 0; // Длина тела запроса
12.
13. if(strcmp(request_method, «POST») == 0) {// ЕслиполученPOST-запрос,
14.post_length = atoi(getenv(«CONTENT_LENGTH»)); // сначалачитаемиз
15. // переменнойсреды его длину,
16. if(post_length) {// если она не нулевая,
17.post_data = (char*)malloc(post_length+1); // выделяемпамятьдлябуфера,
18. fread(post_data, post_length, 1, stdin); // читаем со стандартного вводатело запроса,
19.post_data[post_length] = 0; // завершаем строку нулевым байтом.
20. }
21. }
22.
23. // Выводимзаголовок ответа...
24.printf(«Content-type: text/html\r\n\r\n»);
25.
26. // и его тело:
27.printf("Здравствуйте!\r\n");
28.
29. if(strlen(query_string)) {
30.printf("ПараметрыGET-формы: %s\r\n", query_string);
31. }
32.
33. if(post_length) {
34.printf("ПараметрыPOST-формы: %s (длинателазапроса: %d)\r\n",post_data, post_length);
35. free(post_data); // не забываем освободитьвыделенную в строке 17 память
36. }
37.
38. return0;
39.}
Браузер в результатеполучит примерно следующий код (если «засабмитить» на эту программу POST-формуиз последнего примера):
Здравствуйте!
ПараметрыPOST-формы: name=Vasya&okbutton=OK (длина тела запроса: 22)
Что при этом отобразитсяна экране пользователя, думаю, понятно без комментариев.
Как видите, дажепростейшая программа вывода параметров не очень проста. Более того, постандарту HTTP почти все не алфавитно-цифровые символы (в т.ч. и русскиебуквы) передаются в UrlEncoded-виде (%XX, где XX — шестнадцатеричный код символа), и, если добавить в приведенную Си-программукод расшифровки UrlEncode, она уже не поместится на экран. А это — всеголишь базовые операции. А как вырастет программа на Си, если необходимоработать с базой данных?
Впрочем, написание CGI-программна Си — довольно редкое извращение. Чаще всего это делают на Perl — языке, разработанном специально для обработки текстовых данных, а наличиемодуля CGI делает написание CGI-скриптов намного более простойзадачей. Здесь я не буду Вас знакомить с Perl, отмечу лишь, что проблемостается достаточно: все же Perl не предназначен для Web, этоязык универсальный. Да и сама технология CGI несовершенна: при каждомобращении происходит запуск программы (в случае с Perl — интерпретаторязыка), а эта операция довольно ресурсоемкая: для домашней странички ВасиПупкина производительности, конечно, достаточно, но серьезный портал сдесятками и сотнями тысяч хитов в сутки потребует уже огромных аппаратныхмощностей.
А теперь взглянем навеб-сервер Apache. По своей природе он модульный, и позволяет подключатьрасширения добавлением одной строки в конфигурационный файл. Было бы прекрасно,если бы существовал скриптовый язык, заточенный именно под Web,подключаемый модулем к Apache, не так ли? Это и есть PHP.
В принципе, PHPможно скомпилировать и как CGI-приложение, и использовать так же, как и Perl — но это для нестандартных web-серверовили особых извращенцев./>/>/>
2. PHP: Препроцессор Гипертекста
В 1994-м году программистпо имени Rasmus Lerdorf, намучавшись с классическим перловым модулем CGI,решил написать несколько Perl-скриптов, чтобы было попроще создавать своюдомашнюю страницу. Такой движок был готов к началу 1995 года и назывался PersonalHome Page Tools (PHP). Умел он не очень много – понимал простейший язык ивсего несколько макросов.
Через некоторое времяпонадобилось обрабатывать формы, поэтому Rasmus Lerdorf и для увеличенияпроизводительности все переписал на C. Так появился к середине 1995 годаPersonal Home Page/Forms Interpreter (PHP/FI) 2.0. Приставка FI –присоединилась из другого пакета Rasmusa, который умел обрабатывать формы(Form Interpritator). PHP/FI компилировался внутрь Apacheи использовал стандартный API Apache. PHP скрипты оказалисьбыстрее аналогичных CGI – скриптов, так как серверу не былонеобходимости порождать новый процесс. Язык PHP по возможностямприблизился к Perl, самому популярному языку для написания CGI-программ.Была добавлена поддержка множества известных баз данных (например, MySQLи Oracle). Интерфейс к GD – библиотеке, позволял генерироватькартинки на лету.
Труды свои Rasmus Lerdorf,следуя принципам Open Source, выложил на всеобщее обозрение, и на некоторомколичестве сайтов PHP/FI вполне успешно использовался, хотя был довольнопримитивен. С этого момента началось широкое распространение PHP/FI.
В 1997-м на PHP/FI, впоисках инструмента для удобного web –программирования, наткнулись два других программиста — Andi Gutmans и ZeevSuraski. Идея им понравилась, но функциональность и скорость работы PHP/FIоставляли желать лучшего. Zeev Suraski и Andi Gutmans решили переписатьвнутренний движок для исправления ошибки интерпретатора и повышения скоростивыполнения скриптов. 6 июня 1998 года вышла новая версия, которая была названа PHP3. Язык получился универсальный и мощный, и вскоре привлек вниманиемножества web — разработчиков: к концу 1998 года PHP3использовался на ~10% web — серверов.К лету 1999 года PHP 3 был включен в несколько коммерческих продуктов.По данным NetCraft на ноябрь 1999 PHP использовался в более чем 1млн. доменах.
Скромное название«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 – это скрипт-язык (scriptinglanguage), встраиваемый в HTML — код, который интерпретируется ивыполняется на web — сервере.Проще всего это показать на примере:
Листинг prim_1
Васприветствует PHP
body>
php
echo«Привет Виктор Сергеевич! Учи меня!»;
?>
После выполнения этогоскрипта получают страничку, в которой будет написано:
/>
Основное отличие от CGI-скриптов,написанных на других языках, типа Perl или C – это то, что в CGI-программахВы сами пишете выводимый HTML-код, а, используя PHP – вывстраиваете свою программу в готовую HTML-страницу, используяоткрывающий и закрывающий теги (в примере и ?>).
Отличие PHP от JavaScript,состоит в том, что PHP-скрипт выполняется на сервере, а клиентупередается результат работы, тогда как в JavaScript-код полностьюпередается на клиентскую машину и выполняется только там.
Любители InternetInformation Server найдут, что PHP очень похож на Active ServerPages (ASP), а энтузиасты Java скажут, что PHP похож на JavaServer 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:
1. атрибут method указывает методотправки формы POST;
2. атрибут 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-запрос,который равносилен вводу в адресной строке адреса: адрес-сайта/имя-скрипта.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'])) {
if($_POST['name'] == '') {
echo 'Укажитеимя!';
} else if($_POST['year'] 2004) {
echo 'Укажите годрождения! Допустимый диапазон значений: 1900..2004';
} else {
echo 'Здравствуйте, '. $_POST['name'].'!';
$age = 2004- $_POST['year'];
echo 'Вам'. $age. ' лет';
}
echo'';
}
?>
">
ВведитеВашеимя:
ВведитеВашгодрождения:
Никаких новых приемовздесь не используется. Разберитесь, выполните код, попробуйте модифицировать...
/>
/>
Изменим последний пример,чтобы пользователю не нужно было повторно заполнять поля. Для этого заполниматрибуты value элементов формы только что введенными значениями.
Листинг form_7.php
$name =isset($_POST['name'])? $_POST['name']: '';
$year =isset($_POST['year'])? $_POST['year']: '';
if(isset($_POST['name'], $_POST['year'])) {
if($_POST['name'] == '') {
echo 'Укажитеимя!';
} else if($_POST['year'] 2004) {
echo 'Укажите годрождения! Допустимый диапазон значений: 1900..2004';
} else {
echo 'Здравствуйте, '. $_POST['name'].'!';
$age = 2004- $_POST['year'];
echo 'Вам'. $age. ' лет';
}
echo'';
}
?>
">
ВведитеВашеимя: ">
ВведитеВашгодрождения: ">
/>
Несколько непонятнымимогут оказаться строки 4 и 5. Все очень просто: X = A? B: C — сокращенная запись условия if (A) X=B else X=C. Строку 4 можно было бызаписать так:
if(isset($_POST['name']))
$name =$_POST['name'];
else
$name = '';
Используемая в строках 21и 23 конструкция foo ?> — и того проще: это сокращениедля foo ?>.
Может возникнуть вопрос — почему бы не выбросить строки 4-5 и не написать:
ВведитеВашеимя: ">
ВведитеВашгодрождения: ">
Дело в том, что, если этиPOST-переменные не определены (а так и будет, если форму еще не заполнили),то PHP выдаст предупреждения об использовании неинициализированныхпеременных (причем, вполне обоснованно).
Такое сообщение позволяетбыстро находить трудно обнаруживаемые опечатки в именах переменных, а такжепредупреждает о возможных «дырах» на сайте.
Можно, конечно, поместитькод с isset(). прямо в форму, но получится слишком громоздко.
Разобрались? А теперьпопробуйте найти ошибку в приведенном коде. Ну, не совсем ошибку, — но недочет./>/> 2.7. Функция htmlspecialchars()
Не нашли? Я подскажу.Введите, например, в поле «имя» двойную кавычку и какой-нибудьтекст, например, «123. Отправьте форму, и взгляните на исходный кодполученной страницы. В четвертой строке будет что-то наподобие:
ВведитеВашеимя:
/>
/>
То есть — ничегохорошего. А если бы хитрый пользователь ввел JavaScript-код?
Для решения этой проблемынеобходимо воспользоваться функцией htmlspecialchars(), которая заменитслужебные символы на их HTML-представление (например, кавычку — на "):
Листинг form_7.php
$name =isset($_POST['name'])? htmlspecialchars($_POST['name']):'';
$year =isset($_POST['year'])? htmlspecialchars($_POST['year']): '';
if(isset($_POST['name'], $_POST['year'])) {
if($_POST['name'] == '') {
echo 'Укажитеимя!';
} else if($_POST['year'] 2004) {
echo 'Укажите годрождения! Допустимый диапазон значений: 1900..2004';
} else{
echo'Здравствуйте, '. $name. '!';
$age = 2004- $_POST['year'];
echo 'Вам'. $age. ' лет';
}
echo'';
}
?>
">
ВведитеВашеимя: ">
ВведитеВашгодрождения: ">
/>
Повторите опыт иубедитесь, что теперь HTML-код корректен.
/>
/>
Запомните — функцию htmlspecialchars()необходимо использовать всегда, когда выводится содержимое переменной, вкоторой могут присутствовать спецсимволы HTML./> 2.8. Применение функции phpinfo() дляотладки
Функция phpinfo() — одна из важнейших в PHP. Она выводит информацию о настройкахPHP,значения всевозможных конфигурационных переменных...
Почему она упоминается вглаве, посвященной формам? Потому что функцияphpinfo() — удобнейшеесредство отладки.
Функцияphpinfo(),помимо прочего, выводит значения всех $_GET, $_POST и $_SERVER — переменных.
Так что, если переменнаяформы «потерялась», самый простой способ обнаружить, в чем дело — воспользоваться функцией phpinfo(). Для того, чтобы функция выводилатолько значения переменных (и Вам не пришлось прокручивать десяток страниц), ееследует вызвать следующим образом:
phpinfo(INFO_VARIABLES);
или — что абсолютно то жесамое:
phpinfo(32);
Листинг form_8.php
">
ВведитеВашеимя:
phpinfo(32);
?>
/>
Или, например, такаяситуация: вы хотите узнатьIP-адрес посетителя. Вы помните, чтосоответствующая переменная хранится в массиве $_SERVER, но — вотнезадача — забыли, как именно переменная называется. Опять же, вызываем phpinfo(32);,ищем в табличке свой IP-адрес и находим его — в строке _SERVER[«REMOTE_ADDR»]:
/>
/>3. Что такое MySQL
MySQL – компактный многопоточный сервербаз данных. MySQL характеризуется большой скоростью, устойчивостью илегкостью в использовании.
MySQL был разработан компанией TcXдля быстрой обработки очень больших баз данных. Компания утверждает, чтоиспользует MySQL с 1996 года на сервере с более чем 40 БД, которыесодержат 10.000 таблиц, из которых около 500 имеют более 7 миллионов строк(24.01.2004).
MySQL является идеальным решением длямалых и средних приложений. Исходники сервера компилируются на множествеплатформ. Наиболее полно возможности сервера проявляются на Unix-серверах,где есть поддержка многопоточности, что дает значительный приростпроизводительности.
На текущий момент MySQLвсе еще в стадии разработки, хотя версии 3.22 и более поздние полностьюработоспособны.
MySQL-сервер является бесплатным длянекоммерческого использования. Для коммерческого использования необходимоприобрести лицензию, стоимость которой составляет 190 EUR./> 3.1. Возможности MySQL
MySQL поддерживает язык запросов SQL встандарте ANSI 92, и кроме этого имеет множество расширений к этомустандарту, которых нет ни в одной другой СУБД.
Краткий переченьвозможностей MySQL:
● Поддерживаетсянеограниченное количество пользователей, одновременно работающих с базойданных.
● Количество строкв таблицах может достигать 50 млн.
● Быстроевыполнение команд. Возможно MySQL самый быстрый сервер из существующихсерверов.
● Простая иэффективная система безопасности.
MySQL действительно очень быстрый сервер,но для достижения этого разработчикам пришлось пожертвовать некоторымитребованиями к реляционным СУБД. В MySQL отсутствуют:
● Поддержка вложенных запросов, типа SELECT * FROM table1 WHERE id IN(SELECT id FROM table2).
● Не реализованаподдержка транзакций. Взамен предлагается использовать LOCK/UNLOCK TABLE.
● Нет поддержкитриггеров и хранимых процедур.
По словам создателейименно эти пункты дали возможность достичь высокого быстродействия. Ихреализация существенно снижает скорость сервера. Эти возможности не являютсякритичными при создании web-приложений,что в сочетании с высоким быстродействием и малой ценой позволило серверуприобрести большую популярность./> 3.2. Примеры использования PHPсовместно с MySQL/> 3.2.1. Работа с формами
В этом примере показанокак в PHP легко обрабатывать данные с HTML – форм.
Создадим HTML файлrequest.html.
Листинг request.html
HTML>
Запросинформации
Хотите больше знать онаших товарах?
Вашеимя:
Вашemail:
Меня интересуют:
Яблоки">Яблоки
Апельсины">Апельсины
Отправить запрос!">
В файле request.htmlуказано, что данные формы будут обрабатываться файлом email.php.Приведем его содержание:
Листинг email.php
/*Этот скрипт получает переменные из request.html */
PRINT"CENTER>";
PRINT "Привет,".$_POST['name'];
PRINT "";
PRINT«Спасибо за ваш интерес.»;
PRINT«Вас интересуют ».$_POST['preference'].", информациюо них мы пошлем вам на email: ".$_POST['email'];
PRINT"";
?>
Теперь, если пользовательвызовет request.html и наберет в форме имя “Вася”, email: vasya@pupkin.comи скажет, что его интересуют “Яблоки”, а после этого нажмет «Отправитьзапрос!»,
/>
то в ответ вызовется email.php,который выведет на экран примерно следующее:
Привет, Вася
Спасибо за вашинтерес.
Вас интересуют Яблоки.Информацию о них мы пошлем вам на email: vasya@pupkin.com
/>
Теперь мы должны сдержатьобещание и выслать email.
Для этого в PHPесть функция MAIL.
Синтаксис функцияMAIL:
voidmail(string to, string subject, string message, string add_headers);
to – email адрес получателя.
subject – тема письма.
message – собственно текст сообщения.
add_headers – другие параметры заголовка письма(необязательный параметр).
Допишем в конец файла email.phpследующий код:
Листинг добавочного кодадля email.php
$subj = «Запрос наинформацию»;
$text = «Уважаемый».$_POST['name']."!
Спасибо за ваш интерес!
Вас интересуют".$_POST['preference']."
Мы их распространяембесплатно.
Обратитесь в ближайшийфилиал нашей компании и получите ящик этого продукта.";
mail($_POST['email'],$subj, $text);
$subj = «Поступилзапрос на информацию»;
$text= $_POST['name']." интересовали".$_POST['preference']." email-адрес:".$_POST['email'];
mail($adminaddress,$subj,$text);
?>
Вот теперь пользовательбудет получать письмо с более подробной информацией о наших товарах. Такжеписьмо получит и администратор сайта.
Когда интересующихся нашимитоварами станет очень много, мы захотим их как-то упорядочить и хранитьинформацию о них в базе данных. Об этом в следующем примере./> 3.2.2. Сохранение данных в базеданных MySQL
Для начала создаем базуданных products и таблицу clients.
Чтобы создать в системе базу данных, нужно войти в систему MySQL и ввести в командной строке MySQL:mysql> createdatabaseproducts;
База данных создана:
/>
После этого следует набрать:mysql>useproducts;
Следующий этап настройки базы данных — создание таблиц. Этоделается при помощи SQL-команды CREATETABLE:
CREATETABLE clients
(
nameVARCHAR(25),
emailVARCHAR(25),
choiseVARCHAR(8)
);
Таблицы базы данных созданы:
/>
Можно просмотреть перечень таблиц созданной базы данных c помощью оператора SHOW.
Можно отобразить информацию о столбцах всех таблиц c помощью оператора DESCRIBE.
Для просмотра данных, сохраненных в каждой таблице, можноприменить оператор SELEKT.
Все этапы создания базыданных с таблицами отражены на экране командной строки:
/>
Для общения с MySQLиз PHP понадобятся следующие функции:
1. Создать соединение с MySQL.
intmysql_connect(string hostname, string username, string password);
Параметры функции:
Hostname – имя хоста, на котором находитсябаза данных.
Username – имя пользователя.
Password – пароль пользователя.
Функция возвращаетпараметр типа int, который больше, если соединение прошлоуспешно, и равен в противном случае.
2. Выбрать базу данныхдля работы.
intmysql_select_db(string database_name, int link_identifier);
Параметры функции:
Database_name – имя базы данных.
link_identifier – ID соединения, котороеполучено в функции mysql_connect. (параметр необязательный, если он неуказывается, то используется ID от последнего вызова mysql_connect)
Функция возвращаетзначение true или false
3. Функция выполняетзапрос к базе данных.
intmysql_query(string query, int link_identifier);
Параметры функции:
Query – строка, содержащая запрос
link_identifier – см. предыдущую функцию.
Функция возвращает IDрезультата или, если произошла ошибка.
4. Функция закрываетсоединение с MySQL.
intmysql_close(int link_identifier);
Параметры функции:
link_identifier– см. выше.
Функция возвращаетзначение true или false
Теперь файл email.phpбудет иметь следующий вид:
Листинг email_1.php
/*Этот скрипт получает переменные из request.html */
/*Переменные для соединения с базой данных */
$hostname = «localhost»;
$username = «myusername»;
$password = «mypassword»;
$dbName= «products»;
/*Таблица MySQL, в которой хранятся данные */
$userstable = «clients»;
/* email администратора*/
$adminaddress =«administration@me.com»;
/* создатьсоединение*/
mysql_connect($hostname,$username,$password)OR DIE("Немогусоздатьсоединение");
/*выбрать базу данных. Если произойдет ошибка – вывести ее */
mysql_select_db($dbName) ordie(mysql_error());
echo "";
echo "Привет,".$_POST['name'];
echo "";
echo«Спасибо за ваш интерес.»;
echo "Васинтересуют".$_POST['preference'].". Информациюо них мы пошлем вам на email: ".$_POST['email'];
echo "";
/* Отправляемemail-ы*/
$subj= «Запрос на информацию»;
$text= «Уважаемый ».$_POST['name']."!
Спасибоза ваш интерес!
Васинтересуют ".$_POST['preference']."
Мыих распространяем бесплатно.
Обратитесьв ближайший филиал нашей компании и получите ящик этого продукта.";
mail($_POST['email'], $subj, $text);
$subj=«Поступилзапрос на информацию»;
$text = $_POST['name']." интересовали".$_POST['preference']." email-адрес:".$_POST['email'];
mail($adminaddress,$subj, $text);
/*составить запрос для вставки информации о клиенте в таблицу */
$query = «INSERT INTO $userstableVALUES('$name','$email', '$preference')»;
/*Выполнить запрос. Если произойдет ошибка – вывести ее. */
mysql_query($query) ordie(mysql_error());
echo«Информация о вас занесена в базу данных.»;
/*Закрыть соединение */
mysql_close();
?>
Вот так можно работать сбазой данных в PHP. Теперь кроме письменных уведомлений, информация оклиенте и его интересах будет заноситься в таблицу MySQL./> 3.2.3. Получение (извлечение)данных из базы данных MySQL
После занесения данных,нас иногда будет интересовать вопрос: так кого же из наших клиентов интересуеттовар “Яблоки”
Напишем скрипт apple.php.
Листинг apple.php
/*Скрипт показывает клиентов, которые яблоки любят больше чем апельсины */
/*Переменные для соединения с базой данных */
$hostname = «localhost»;
$username = «myusername»;
$password = «mypassword»;
$dbName= «products»;
/*Таблица MySQL, в которой хранятся данные */
$userstable = «clients»;
/* создатьсоединение*/
mysql_connect($hostname,$username,$password)OR DIE("Немогусоздатьсоединение");
/*выбрать базу данных. Если произойдет ошибка – вывести ее */
mysql_select_db($dbName) ordie(mysql_error());
/*составить запрос, который выберет всех клиентов – яблочников */
$query = «SELECT * FROM $userstableWHERE choise = 'Яблоки'»;
/* Выполнитьзапрос.Еслипроизойдетошибка– вывестиее.*/
$res = mysql_query($query) or die(mysql_error());
/*Как много нашлось таких */
$number= mysql_num_rows($res);
/*Напечатать всех в красивом виде*/
If ($number == 0) {
echo "Любителейяблокнет";
} else {
echo "Количестволюбителейяблок:$number";
/*Получать по одной строке из таблицы в массив $row,пока строки не кончатся */
while ($row=mysql_fetch_array($res)) {
echo "Клиент".$row['name']." любитЯблоки.";
echo "ЕгоEmail: ".$row['email'];
echo"";
}
echo"";
}
?>
Вот и все, продуктпрактически готов.