Author: Флойд К.С.
Tags: информационные технологии вычислительная техника обработка данных микропроцессоры программирование учебное пособие веб дизайн язык программирования php
ISBN: 978-5-4497-0886-1
Year: 2025
Введение в программирование
на PHP5
Учебное пособие
4-е издание стереотипное
электронное
Интернет-Университет
Ай Пи Ар Медиа
Информационных Технологий
www.intuit.ru
Москва
2025
УДК 004
ББК 32.97
Ф лойд, К. С.
Введение в программирование на PHP5 : учебное пособие / К. С. Флойд. —
4-е изд., стер. электрон. — Москва : Национальный Открытый Университет «ИНТУИТ» : Ай
Пи Ар Медиа, 2025. — 280 с. — Текст : электронный.
ISBN 978-5-4497-0886-1
В учебном пособии рассмотрены основы Web-дизайна, основная структура документа,
данные PHP, структуры принятия решений, циклические структуры, повторное использование
кода и функции, базовая обработка форм, сеансы, доступ к базам данных, к базе данных
MySQL, к файлам и папкам, отправка E-mail, приложение PHP E-Commerce, справочник SQL.
Издание предназначено для студентов, обучающихся по направлениям подготовки,
связанным с информатикой и информационными технологиями, а также для всех, кто
занимается изучением программирования на РНР5.
Учебное электронное издание
Технический редактор М.В. Половникова
Обложка С.С. Сизиумова, Я.А. Кирсанов
© ООО «ИНТУИТ.РУ», 2007-2016
© Флойд К. С., 2007-2016
© Оформление электронного издания.
ООО Компания «Ай Пи Ар Медиа», 2021
К.С. Флойд
Введение в программирование на PHP5
Содержание
1. Основы Web-дизайна
2. Основная структура документа
3. Данные PHP
4. Структуры принятия решений
5. Циклические структуры
6. Повторное использование кода и функции
7. Базовая обработка форм
8. Сеансы
9. Доступ к базам данных
10. Доступ к базе данных MySQL
11. Доступ к файлам и папкам
12. Отправка E-mail
13. Приложение PHP E-Commerce
14. Справочник SQL
4
24
32
57
64
72
76
100
110
128
143
165
170
264
В данной лекции описаны основы разработки Web-страниц
трехслойная, клиент/серверная архитектура, модели систем Web и т.д
-
Контекст разработки Web
Многие люди являются "авторами" страниц Web, немногие являются
"разработчиками" сайтов Web. Возможно, вы также присоединитесь к
сообществу разработчиков.
Создание страницы Web
Сегодня создание страницы Web является не слишком трудной задачей.
Многие стандартные программные пакеты персональных компьютеров
обладают встроенными средствами для преобразования документов
текстовых процессоров, электронных таблиц, баз данных и т.д. в
специально кодированные документы, которые могут быть доступны в
Web. Специальные пакеты для создания страниц Web, такие, как
Microsoft FrontPage и Macromedia Dreamweaver, позволяют легко
создавать страницы Web с помощью технологии перетаскивания (Dragand-Drop). В большинстве таких случаев даже не нужно знать о
существовании специального языка кодирования HTML (язык разметки
гипертекста), который неявно все это обеспечивает.
Если вы знаете язык XHTML, то страницы Web можно создавать с
помощью простого текстового редактора, получая в этом случае
значительно больше контроля над их структурой и форматированием,
чем это возможно с помощью методов перетаскивания. Кроме того,
появляется возможность легко интегрировать существующий код
XHTML, апплеты Java, встраиваемые модули мультимедиа и языки
сценариев
браузера, чтобы
создать на странице некоторое
взаимодействие с пользователем. Независимо от содержания или
привлекательности страниц, их назначение обычно ограничено
представлением интересного или информативного текста и графики для
персонального потребления. Маловероятно, что кто-то будет
заниматься задачей создания основной бизнес-системы с помощью
HTML и нескольких подключаемых модулей.
"Разработка" Web, в противоположность "созданию" страниц Web,
выходит далеко за пределы использования кодов разметки и нескольких
подключаемых модулей или метода сценариев для создания
привлекательных или информативных страниц Web. Этот термин
относится к использованию специальных стратегий, инструментов и
методов для создания страниц Web и сайтов Web, характеризуемых как
трехуровневые, клиент/серверные системы обработки информации.
Давайте рассмотрим эти термины более подробно, чтобы понять
разнообразие задач, для которых разрабатываются страницы и сайты
Web.
Системы обработки информации
Технологии Web используются не только для создания персональных
или рекламных сайтов Web, содержащих информативный, интересный
или развлекательный материал для публичного потребления. Скорее
они становятся важным средством поддержки фундаментальных
"бизнес-процессов" современных организаций — поддерживающие
операционные
и
управленческие
функции.
Технические
инфраструктуры поддержки этих задач упрощенно делятся на три типа
систем на основе Web, называемых системами интранет, интернет и
экстранет.
Системы интранет
Системы интранет являются частными, внутренними системами,
помогающими выполнять повседневную обработку информации,
управленческо-информационную и производственную деятельность
организаций. Системы интранет на основе Web обслуживают
стандартные внутренние функции бизнеса, оказывая тем самым
влияние на основные организационные системы, такие, как
бухгалтерский учет и финансовая отчетность, маркетинг и отдел
продаж, системы закупок и сбыта, производственные системы, системы
трудовых ресурсов и другие. Со временем системы интранет на основе
К.С. Флойд
Введение в программирование на PHP5
Web станут основными техническими средствами, посредством которых
будет осуществляться внутренняя деятельность организаций по
выполнению бизнес-процессов.
Системы интернет
Системы
интернет являются публичными
информационными
системами. Они включают в себя публичные сайты, которые
предоставляют новости, информацию, и развлечения; сайты
электронной коммерции для маркетинга и продажи продуктов и услуг;
правительственные сайты для информирования или обслуживания
широкой публики; и образовательные сайты для предоставления
локального и удаленного доступа к образованию и знаниям. Всем
частям общества публичные системы интернет предоставляют товары,
услуги и информацию посредством Всемирной паутины WWW и
связанных с ней сетей и услуг.
Системы экстранет
Системы экстранет являются системами бизнес-для-бизнеса (B2B),
которые управляют электронным обменом данными (EDI) между
деловыми
предприятиями.
Эти
системы
обеспечивают
информационный поток между организациями - между компанией и ее
поставщиками и между компанией и ее сбытовыми организациями чтобы
помочь
в
координации
последовательности
закупки,
производства и распространения. Электронный обмен данными
помогает исключить бумажный поток, сопровождающий бизнес
транзакции, используя технологии Web для пересылки электронных
документов между компьютерами, а не между людьми.
Как системы на основе Web приложения EDI устраняют трудности
передачи
информации
между различными
программными
и
аппаратными
платформами
с
изначально
различными
информационными форматами и различными протоколами обмена
информацией.
Web становится основным технологическим базисом, электронной
К.С. Флойд
Введение в программирование на PHP5
магистралью для сбора информации, обработки и распространения во
всех типах организаций - в коммерческих и финансовых предприятиях,
образовательных
учреждениях,
правительственных
агентствах,
учреждениях здравоохранения, агентствах новостей и отрасли
развлечений и в большинстве других формальных организаций, как
больших, так и маленьких. Это всепроникающая технология для
разработки систем работы с информацией во всех частях общества.
На основе Web
Термин "на основе Web" относится к тому факту, что системы обработки
информации полагаются на технологию Интернет, в частности, на так
называемую Всемирную паутину (WWW). Поэтому системы на основе
Web действуют в технологических рамках со следующими
характеристиками.
Первое: системы действуют в публичных, а не в частных сетях данных.
Они осуществляют коммуникацию через Интернет, т.е. через
распространенные по всему миру, взаимосвязанные сети компьютеров,
которые являются публично доступными.
Второе: коммуникационные сети основываются на открытых и
публичных технических стандартах, таких, как архитектуры Ethernet,
протоколы передачи TCP/IP и протоколы приложений HTTP и FTP. Они
не являются частными или патентованными стандартами, но являются
принципиально
открытыми
и
свободными
для
публичного
использования.
Третье: системы обработки на основе Web используют широко
распространенное, часто бесплатное, программное обеспечение для
разработки и работы. Деятельность по обработке происходит с
помощью браузеров Web, а не специально написанного программного
обеспечения для интерфейса пользователя и для внешнего сбора
данных и обработки. Браузеры Microsoft Internet Explorer, Mozffla Firefox,
Opera, Netscape Navigator и другие являются средством взаимодействия
пользователей с системами обработки информации. Также широко
распространенные компьютеры серверов Web выполняют основные
функции бизнес-обработки, а серверы баз данных обеспечивают
К.С. Флойд
Введение в программирование на PHP5
хранение информации, доступ к ней и извлечение.
Поэтому общедоступные, не являющиеся специализированными, не
являющиеся патентованными оборудование и системы программного
обеспечения предоставляют техническую среду для разработки систем
обработки информации и для управления этой деятельностью.
Трехслойная, клиент/серверная архитектура
Термин "клиент/сервер" относится к применению сетей на основе
серверов для управления общим доступом к ресурсам и для
распределения
задач
между аппаратными
и
программными
компонентами. В клиент/серверных сетях на основе Web распределение
задач обработки происходит в трех слоях, которые соответствуют трем
основным компонентам оборудования/программного обеспечения
системы.
Tier I
T ie r 11
T ie r 111
Web Hardware Components
PC Client
Web- Server
Database Server
Web Software Components
Wab Browser
Network Operating
System
Database Management
System
Я л . у Ц «. « т я еП
■ Windows
Server2003
lUyGQL;
К.С. Флойд
Введение в программирование на PHP5
Рис. 1.1. Аппаратные и программные слои трехслойной системы
обработки информации
В первом слое ( T i e r 1) клиентский настольный ПК выполняет
работу интерфейса пользователя системы; во втором слое ( T i e r 2)
сервер Web выполняет основные функции системы по обработке; и в
третьем слое ( T i e r 3) сервер базы данных, и в некоторых случаях
медиа-сервер, осуществляет требуемые системе функции хранения и
извлечения информации.
В свою очередь, каждый из трех аппаратных компонентов содержит
соответствующее программное обеспечение. Клиентским программным
обеспечением является браузер Web. Сервер Web выполняет сетевую
операционную систему (NOS), такую, как Windows Server, Unix Server
или Linux Server, и с помощью дополнительного программного
обеспечения, например, Internet Information Server или Apache Web Server,
реализует службы Интернет, — WWW, FTP, SMTP mail и другие. Сервер
базы данных выполняет систему управления базой данных (DBMS),
такую, как MySQL, Oracle, Access и другие популярные пакеты. Таким
образом, отдельные компоненты выполняют отдельные задачи
обработки, которые интегрируются с помощью Web в законченную
систему обработки информации.
Рассмотрим, например, посещение Web-сайта е-коммерции, например,
Amazon.com. Браузер Web является интерфейсом с сайтом. В ответ на
различные "входящие" запросы, которые вы отправляете при просмотре
продаваемых товаров, создаются различные страницы "вывода".
Запросы вводятся в систему через ссылки Web и посылаемые формы,
ответы системы создают страницы HTML, передаваемые назад браузеру
для вывода на экране. Браузер выполняет действия по вводу и выводу,
необходимые для взаимодействия с сайтом.
За сценой на сервере Web решаются специальные задачи по обработке
информации. Когда, например, делается запрос по поиску книги,
выполняются программы поиска в базах данных для извлечения
подходящих книг и для форматирования вывода для доставки в браузер
Web. При просмотре корзины покупателя другие процедуры извлекают
выбранные товары и вычисляют общую стоимость заказа. При оплате
заказа исполняются специальные программы для соединения с
К.С. Флойд
Введение в программирование на PHP5
системой проверки кредитной карты и банковскими системами, так что
соответствующие счета дебетуются и кредитуются. Множество задач
обработки, связанных с перемещением в сети и покупкой, происходят на
серверах Web скрыто от пользователя, но они критически важны для
осуществления покупки и для осуществления бизнес-транзакций,
которые с этим связаны.
Большая часть информации, которая собирается и генерируется во
время покупки, хранится в базах данных, которые находятся на
отдельных серверах баз данных. Вся информация, которая выводится на
экран, извлекается из таблиц базы данных. Выбранные товары хранятся
в таблицах базы данных. Практически каждый фрагмент информации о
просматриваемых продуктах и транзакциях при покупке сохраняется в
больших базах данных в самой системе е-коммерции или в связанных
базах данных, которые находятся в центре окружающих ее систем
бухгалтерского учета, закупок и дистрибуции.
Даже в самых маленьких коммерческих системах на основе Web
присутствуют такие же функции. Браузер Web предоставляет интерфейс
пользователя с системой, специальные страницы обрабатывают бизнес
транзакции, а одна или несколько баз данных поддерживают
информацию, перемещающуюся в системе. Главное состоит в том, что в
системах на основе Web любого размера существуют три основных слоя
функциональности. Поэтому, с точки зрения разработчика Web, задача
состоит в создании трех отдельных компонентов - интерфейса
пользователя, процедур обработки бизнес-операций, и компонентов
поддержки базы данных — и последующей интеграции в полностью
функциональную систему обработки информации.
Навыки разработки Web
Разработка Web относится к использованию технологий Web для
создания клиентских и серверных компонентов обработки, к
интеграции их в качестве приложений в системах обработки интранет,
интернет или экстранет, и к развертыванию их в Web для реализации
частной и публичной деятельности организаций. Набор навыков для
реализации этих задач простирается далеко за пределы способности
сохранить страницы Web из программы текстового процессора, за
пределы создания простого сайта Web с помощью перетаскивания в
К.С. Флойд
Введение в программирование на PHP5
программном пакете настольного компьютера или даже за пределы
жестко закодированных с помощью XHTML страниц c вкраплениями
подключаемых модулей.
При
окончательном
анализе
разработчику
Web
необходимо
проникновение в сущность операционных и управленческих процессов
организации, понимание того, каким образом производственные
процессы создаются и опираются на информационные потоки при
производстве товаров и услуг, и способность абстрагироваться и
моделировать эти бизнес системы на доступном оборудовании и
программных технологиях, а также навыки использования этих
технологий для создания систем на основе Web, которые реализуют эти
модели.
Один учебник не может вместить все это. Он может, однако,
предоставить основные знания и навыки для решения существующих
проблем и использования возможностей, сопровождающих системы
обработки на основе Web. Он охватывает основные технические
средства для интеграции клиентского и серверного оборудования и
программного обеспечения для создания систем по сбору, обработке,
управлению и распространению информационного содержания,
которое оживляет современные организации. Попутно вы получите
надежное понимание той критической роли, которую системы на
основе Web могут играть в создании операционного и управленческого
успеха различных организаций.
Модели систем Web
Исторически Всемирная паутина WWW функционировала просто как
"система доставки информации". Люди привыкли использовать ее для
сбора информации по всевозможным вопросам, для которых миллионы
сайтов Web предоставили доступ. Однако со временем Web стала чемто большим, чем просто электронной библиотекой информации. Она
стала платформой коммуникации, информации и транзакций, на
которой реализуется экономическая, социальная, политическая,
образовательная и культурная деятельность.
Модель доставки информации
К.С. Флойд
Введение в программирование на PHP5
При функционировании в качестве системы доставки информации
деятельность по разработке Web — достаточно простая и
прямолинейная. Прежде всего, информационное содержимое вводится
в документ, который со временем станет страницей Web. Это
содержимое окружается специальными кодами компоновки и
форматирования Языка разметки гипертекста (HTML) — в последнее
время Расширяемого языка разметки гипертекста (XHTML) - для
управления его структурой и представлением в браузере Web.
Затем документ сохраняют на компьютере сервера Web для ожидания
публичного доступа. Пользователи обращаются к документу, вводя в
окне своего браузера адрес Web-документа. Этот адрес, называемый
URL, или Единообразный локатор ресурса, определяет сайт, где
хранится страница, и расположение ее каталога на сервере Web. Этот
сервер, в свою очередь, извлекает страницу и посылает ее браузеру,
который интерпретирует код HTML и выводит документ на экране
компьютера.
Существуют определенные последствия построения доступа к Web на
модели доставки информации и в следовании традиционному процессу
разработки Web. Прежде всего, информационное содержимое страницы
Web "фиксируется" или "замораживается" в определенном месте. Оно
становится встроенным и тесно связанным с кодами форматирования
XHTML, которые его окружают. В связи с этим становится трудно
изменять содержимое страницы, не переписывая и не редактируя его
форматы
представления.
Поэтому
затрудняется
сохранение
актуальности страниц, особенно если содержимое постоянно
изменяется.
В то самое время авторам страниц Web зачастую необходимо быть
знакомым с кодированием XHTML. Даже при использовании
визуальных инструментов, таких, как FrontPage или Dreamweaver, автору
может понадобиться специалист по кодированию, чтобы страница
выглядела требуемым образом. "Эксперту" Web часто также бывает
необходимо работать в тесном контакте с поставщиком контента,
обеспечивая технические навыки для сопровождения страниц.
Для пользователей также имеются ограниченные возможности
взаимодействия с традиционными страницами Web. Пользователь
часто выступает в роли пассивного читателя контента, для которого
сервер
Web
действует
в
качестве
простого
электронного
"переворачивателя страниц". Поэтому сайт Web, создаваемый вокруг
модели доставки информации, может стать статическим, пассивным
хранилищем устаревшей информации. Страница Web рискует стать
историческим архивом, а не своевременным, быстро реагирующим
источником точной, самой свежей информации.
Модель обработки информации
Чтобы преодолеть это статическое, пассивное использование Web,
возникает необходимость рассматривать Web не просто как систему
доставки информации, но как полнофункциональную систему
обработки информации. Это означает, что саму систему Web и
составляющие ее сайты и страницы необходимо воспринимать как
механизмы для выполнения полного набора действий по вводу,
обработке, выводу и хранению, требуемых для создания динамического,
активного контента, - короче, для обеспечения основных функций
системы обработки информации.
т
STORAGE
Рис. 1.2. Функции системы обработки информации
В модели информационной обработки четыре базовые функции ввода,
обработки, вывода и хранения имеют специфическое значение.
• Функция ввода позволяет пользователям взаимодействовать с
системой,
запрашивая
параметры
обработки,
управляя
информационным доступом и определяя методы доставки. Кроме
того, пользователь может стать источником данных, которые
обрабатывает система и которые она поддерживает в своих
репозиториях хранимой информации.
К.С. Флойд
Введение в программирование на PHP5
• Функция обработки относится к деятельности по манипуляции
данными и логике обработки, необходимых для выполнения
работы системы. Этот термин предполагает, что система может
"программироваться" для выполнения арифметических и
логических операций, необходимых для манипуляции данными
ввода и для создания выводимой информации.
• Функция вывода доставляет результаты обработки пользователю в
правильном, своевременном и соответствующим образом
форматированном виде.
• Функция
хранения
гарантирует
продолжительность
существования и целостность обрабатываемой информации,
поддерживая ее в течение длительного периода времени и
позволяя добавлять, изменять или удалять систематическим
образом. В конечном счете, хранимая информация становится
основным контентом страниц Web, отражая самую современную
и точную информацию, появляющуюся на этих страницах.
С точки зрения обработки информации сама сеть Web функционирует
как гигантская открытая компьютерная система, и фактически такой и
является. Деятельность по обработке информации происходит на
различных аппаратных и программных компонентах, расположенных в
одном месте или разбросанных по всему миру.
При принятии модели обработки информации можно начинать
применять технологию Web для создания сайтов Web, которые являются
действительно динамичными, интерактивными и современными сайты Web, на которых информационный контент всегда самый
современный, персонализирован в соответствии с потребностями
пользователя, автоматически изменяется в ответ на запросы
пользователя, и когда изменяется сама информация, пользователь может
взаимодействовать со страницей Web, добавляя или изменяя
информацию в системе. Дополнительное преимущество состоит в том,
что сайты можно создавать таким образом, что не потребуется
постоянно переписывать или переформатировать страницы Web. Сами
страницы изменяются динамически, отражая изменение информации
или изменение предпочтений пользователей.
Присваивание функций компонентам
К.С. Флойд
Введение в программирование на PHP5
Возвращаясь к понятию трехслойной, клиент/серверной системы,
посмотрим, как аппаратные компоненты, программные компоненты, и
функции обработки связаны друг с другом с точки зрения обработки
информации. Вспомните, что аппаратные компоненты в трехслойной
среде состоят из компьютера клиента Web (настольного ПК),
компьютера сервера Web, и сервера базы данных. Каждый из этих трех
аппаратных компонентов выполняет соответствующее программное
обеспечение.
Теперь
можно
отобразить
функции
обработки
информации на эти три слоя оборудования/программ.
Рис. 1.3. Функции системы обработки информации, отображенные в
трехслойную систему клиент/сервер
Все функции ввода и вывода попадают в основном в клиентскую
машину Web. Такая деятельность интерфейса пользователя, как ввод
данных, проверка данных, управление обработкой и форматирование
вывода, выполняются на клиенте Web.
К.С. Флойд
Введение в программирование на PHP5
Основная деятельность по обработке информации падает на сервер
Web, называемый иногда сервером приложений Web. Здесь
программируются арифметические и логические процедуры для
выполнения задач системы по бизнес обработке.
Наконец, хранение данных и функции доступа выполняются на сервере
базы данных. Этот компонент управляет хранением информации и
функциями извлечения, необходимыми для выполнения бизнес
обработки, и позволяет осуществлять долгосрочное обслуживание
хранимой информации посредством добавления, изменения и удаления
файлов и баз данных.
Как можно видеть на иллюстрации, системные функции "передаются"
различным отдельным компонентам, хотя все они действуют совместно,
как интегрированные системы различных видов деятельности.
Основная идея заключается в том, что специализированные
компоненты выполняют специализированную работу, для которой они
лучше всего подходят. Справедливо также то, что системные функции
"не привязаны к месту". То есть деятельность ввода, обработки, вывода
и хранения могут происходить там, где расположены компоненты. Они
могут быть заключены в одной машине на одном рабочем столе,
распределены между двумя или несколькими машинами в отделе или
компании либо широко разбросаны по всему земному шару. Во всех этих
случаях используемые технологии и методы являются практически
одинаковыми, делая достаточно рутинной разработку приложений Web
для любой физической или географической среды, с которой столкнется
разработчик.
Разработка приложений Web
Рассмотрение Web как трехслойной, клиент/серверной системы
обработки информации имеет важные последствия для разработки
приложений Web. Вчерашний "создатель страницы Web" становится
сегодня "разработчиком системы Web". Теперь недостаточно иметь пакет
разработчика, состоящий из редактора WYSIWYG и базовых навыков
XHTML.
Необходимо
стать широко
образованным в
более
разнообразном множестве технологий.
Внизу на следующей
расширенной схеме трехслойной системы указаны некоторые навыки и
К.С. Флойд
Введение в программирование на PHP5
инструменты, необходимые для проектирования и программирования
систем на основе Web, которые обслуживают деятельность по обработке
информации.
Tier I
Tier II
Tier III
Web Hardware Components
PC Client
Web Server
Database Server
Web Development Skills
XHTML
CSS
JavaScript
DHTML
XML
PHP
SOL
XML
D3MS Procedures
Рис. 1.4. Навыки разработки Web, требуемые для создания трехслойных
Системный ввод и вывод
Так как функция интерфейса пользователя осуществляется через браузер
Web, выполняющийся на клиентском ПК, необходимо использовать
инструменты
разработки
приложений,
которые
позволяют
программировать браузер для выполнения задач форматирования
вывода, ввода данных и проверки данных. Для этого требуются,
конечно, языки разметки, такие, как XHTML и CSS (Каскадные таблицы
стилей), для структуризации и представления системного ввода и
вывода. Растет важность расширений языков разметки, например,
DHTML (Dynamic HTML) для взаимодействия пользователей со
страницей Web и XML (Расширяемый язык разметки) для представления
структур данных, которые доставляются сервером для обработки в
браузере. Также основным языком программирования для браузера
является JavaScript, который используется для манипуляции языками
разметки и структурами данных для выполнения задач браузера по
обработке.
Системная обработка
На стороне сервера Web необходимо иметь возможность писать
приложения для выполнения основных задач системы по обработке.
Для кодирования этих процедур используются серверные языки, такие,
как PHP. С одной стороны, эти языки применяются как полноценные
языки программирования для кодирования арифметических и
логических операций обработки, с другой — они используют
встроенные компоненты серверной обработки для выполнения
основных и вспомогательных задач системы. PHP является широко
распространенным языком сценариев общего назначения, который
особенно хорошо подходит для разработки Web и может встраиваться в
XHTML.
Управление базой данных
К.С. Флойд
Введение в программирование на PHP5
На стороне сервера базы данных такие языки, как SQL (Язык
структурированных запросов), выполняют функции сохранения данных,
их обслуживания и доступа. Кроме того, языки программирования базы
данных используются для кодирования командных процедур, которые
являются функциями обработки, хранимыми в базах данных, для
извлечения, обновления и создания отчетов о содержимом баз данных.
Серверные языки могут вызывать эти встроенные процедуры баз
данных для выполнения соответствующей обработки, а не кодировать
их непосредственно. Все большую важность в хранении данных и
электронном обмене данными приобретают структуры данных XML.
Иногда на разработку Web смотрят упрощенно с чисто технической
точки зрения, забывая, что это является также разработкой системы.
Разработчик должен понимать организационные структуры и процессы.
Прежде всего, система на основе Web является бизнес-процессом. Если
не понимать суть процессов, то маловероятно, что можно будет
разработать системы для их реализации или поддержки. Разработка Web
является также реализацией некоторой интеграции. Задача состоит в
том, чтобы объединить совокупность оборудования, программного
обеспечения, людей и процедур для выполнения некоторой
деятельности. Поэтому системный подход является критически важным
для соединения всех частей вместе во что-то функциональное,
продуктивное, экономичное и дружественное. Наконец, разработка Web
является в большой степени творческим предприятием. Очень часто
работа состоит в разработке чего-то нового там, где ничего перед этим
не существовало. Вместо следования директивам хорошо продуманных
планов, ваше воображение создает эти планы, а художник внутри вас их
воплощает. Управляемый полет фантазии хорошо служит разработке
Web.
Разработчику Web требуется поэтому творческое воображение,
организаторское чутье и обширный набор навыков для создания
приложений Web, которые обслуживают потребности информационной
обработки. Разработчик не обязан быть экспертом высокого уровня во
всех языках и программных инструментах; но необходимо иметь
хорошее представление об их использовании.
Программное обеспечение учебника
К.С. Флойд
Введение в программирование на PHP5
В этом учебнике представлено основное подмножество инструментов,
необходимых для создания динамических, интерактивных сайтов Web.
На стороне браузера применяются и описываются XHTML, CSS,
JavaScript для редактирования данных, и динамический HTML. В
качестве языка сценариев сервера используется PHP. Также
описываются встроенные функции PHP, необходимые для выполнения
функций ввода, обработки, вывода и хранения. На стороне базы данных
представлены примеры для Microsoft Access, и описаны основные
принципы использования языка SQL.
Даже при отсутствии достаточного доступа к этим технологиям,
необходимо уметь следовать инструкциям и начать создавать свои
собственные динамические приложения Web. Необходимо, конечно,
разбираться в программировании: разработчик Web, прежде всего,
является программистом. Предполагается, что читатель хорошо знаком с
Visual Basic. Необходимо также иметь навыки работы с XHTML и быть
знакомым с каскадными таблицами стилей.
Язык PHP
PHP означает Препроцессор гипертекста PHP. Это серверный язык
программирования, созданный специально для динамических страниц
Web. Язык был первоначально разработан в 1994 г. Расмусом
Лердорфом и был с тех пор расширен, чтобы стать одним из наиболее
популярных языков сценариев WWW. Согласно статистике Netcraft в
2005 г. PHP использовался более чем на 23000000 доменах. Подобно
другим типам серверных языков, таких, как ASP, ASP.NET и JSP, код PHP
обрабатывается на сервере Web и создает код XHTML или другой вывод,
который можно увидеть в браузере. В отличие от других серверных
языков, PHP является продуктом с открытым исходным кодом — это
означает, что каждый имеет доступ к исходному коду и может
использовать, изменять и распространять его полностью бесплатно.
Текущая версия PHP, рассматриваемая в учебнике, имеет номер 5. Этот
К.С. Флойд
Введение в программирование на PHP5
учебник, несомненно, не является полным изложением языка PHP. Он
должен только продемонстрировать некоторые наиболее широко
используемые свойства и приложения PHP.
Систему PHP5 можно применять практически с любым типом
операционной системы и сервера Web. Однако, чтобы сценарии PHP
были обработаны, должен быть установлен интерпретатор PHP. Это
программное обеспечение доступно в двух формах - полный исходный
код и исполняемые двоичные файлы. Большинство систем Linux
поставляются с исходным кодом PHP. Для систем, отличных от
Unix/Linux, двоичные файлы можно загрузить по адресу ссылка:
http://www.php.net/downloads.php.
Дополнительную информацию о PHP можно найти на сайте ссылка:
http ://www. php.net.
Прочитав эту лекцию вы узнаете, как PHP встраивается в XHTML, а
также научитесь писать комментарии и выводить текст на экран
браузера
Соединение XHTML и PHP
Код PHP обычно объединяется с тегами XHTML. PHP является
встраиваемым языком — это означает, что можно перемещаться между
чистым кодом HTML и PHP, не жертвуя возможностью чтения текста.
Чтобы встроить код PHP в XHTML, PHP должен задаваться
обособленно, с помощью начального и конечного тегов PHP. Теги PHP
говорят серверу Web, где начинается и заканчивается код PHP.
Анализатор PHP распознает три варианта начального и конечного тегов.
• Стиль XML
<?php
Блок кода PHP
?>
Первый вариант тегов PHP называется тегами в стиле XML и
является предпочтительным стилем. Он работает в документах
Расширяемого языка разметки (XML). Этот метод должен
использоваться при соединении PHP с документами XML и
XHTML. Примеры в этом учебнике применяют этот формат тегов
XML.
• Сокращенный стиль
<?
Блок кода PHP
?>
Сокращенный стиль является самым простым, однако, он не
рекомендуется, так как вступает в противоречие с объявлениями
документов XML.
К.С. Флойд
Введение в программирование на PHP5
• Стиль сценария (script)
<script language="php">
Блок кода PHP
</script>
Этот стиль использует самую длинную запись и похож на стиль
тегов, применяемых с JavaScript. Этот стиль является
предпочтительным при использовании редактора HTML, который
не распознает другие стили тегов. Так как большинство новых
редакторов XHTML распознают стиль тегов XML, то
использование этого стиля не рекомендуется.
Блоки сценария могут размещаться в любом месте документа XHTML, в
том месте, где сценарий создает и показывает свой вывод. Следующий
пример страницы XHTML иллюстрирует использование трех форматов
тегов сценария.
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11-transitionaL dtd">
<html xmlns='http://www.w3.org/1999/xhtml" xml;lang="en" lang="en">
<head>
<Ше>Страница Web </title>
</head>
<body>
<p>
<?php echo "Это базовый документ PHP";?>
</p>
<p>
<? print "PHP - это здорово!";?>
</p>
<p>
<script language="php">
$myvar = "Hello World! ";
К.С. Флойд
Введение в программирование на PHP5
echo $myvar;
</script>
</p>
</body>
</html>
В предыдущем примере три блока PHP включены в документ XHTML.
Первый блок использует открывающий и закрывающий теги < ? p h p
...
? > . Сегмент кода использует оператор PHP e c h o для вывода
строки 'Это базовый документ PHP" в окне браузера.
Второй блок применяет теги <? . . . ?> для пометки начала и конца
кода PHP. Этот раздел применяет оператор PHP p r i n t (другое имя
оператора e c h o ) для вывода на экране текста "PHP - это здорово!".
Наконец, третий блок использует блок сценария < s c r i p t
l a n g u a g e = " p h p " > . . . < / s c r i p t > для определения начала и
конца кода PHP. В коде строка " H e l l o W o r l d ! " присваивается
переменной $ m y v a r , а оператор e c h o выводит значение $ m y v a r в
окне браузера.
Это базовая страница PHP.
PHP - это здорово!
Hello World!
Пример показанного выше кода включает теги XHTML, теги PHP,
операторы PHP и разделители. Когда пользователь запрашивает
страницу PHP, сервер обрабатывает весь код PHP. Когда страница PHP
просматривается в окне браузера, выводится только текст между
открывающим и закрывающим тегами XHTML или PHP. Никакой
реальный код PHP не виден при просмотре исходного кода в окне
браузера. Причина в том, что интерпретатор PHP выполняет сценарий
на сервере и заменяет код результатом вывода работы сценария. Только
этот вывод передается браузеру. Это одна из характеристик, которая
делает PHP серверным языком сценариев, в отличие от JavaScript, языка
сценариев клиента.
Вывод контента
PHP содержит два основных оператора для вывода текста в браузере
Web: e c h o и p r i n t .
Оба оператора, e c h o и p r i n t , кодируются между открывающим и
закрывающим тегами блока кода PHP и могут находиться в любом месте
в документах XHTML.
Операторы e c h o и p r i n t используют следующий формат:
e c h o - используется для вывода одной или нескольких строк.
echo
"В ы водим ы й т е к с т ” ;
p r i n t - используется для вывода строки. В некоторых случаях
оператор p r i n t предлагает большую функциональность, чем оператор
e c h o . Это будет рассмотрено далее в учебнике. Пока p r i n t можно
считать другим именем оператора e c h o .
print
"В ы водим ы й т е к с т " ;
Следующие примеры демонстрируют использование и размещение
команд e c h o и p r i n t в документе XHTML.
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitiona]//EN"
' http ://www.w3.org/TR/xhtm]1/DTD/xhtml11-transitionaL dtd">
<html xm]ns="http://www.w3.org/1999/xhtml" xml]ang="en" lang="en">
<head>
<Ше>Страница Web</title>
</head>
<body>
<p>
<?php
К.С. Флойд
Введение в программирование на PHP5
echo 'Это базовый документ PHP";
?>
</p>
</body>
</html>
В большинстве случаев необходимо выводить целые параграфы в окне
браузера или создавать переносы строк при выводе контента. По
умолчанию операторы e c h o и p r i n t не создают автоматические
переносы строк, необходимо использовать тег < p > или < b r > для
создания параграфов или переносов строк. Разделители, создаваемые в
редакторе XHTML с помощью возврата каретки, пробелов и табуляции,
игнорируются процессором PHP.
В следующем примере тег параграфа XHTML включается в оператор
PHP e c h o . В PHP теги XHTML можно применять в операторах p r i n t
и e c h o для форматирования вывода. В этих случаях вывод необходимо
заключать в двойные кавычки (""), чтобы гарантировать, что браузер не
интерпретирует тег буквально и не выведет его как часть строки вывода.
echo " ^ ^ а р а г р а ф 1</p>";
echo " ^ ^ а р а г р а ф 2</p>";
Без использования тега параграфа XHTML предыдущие операторы
e c h o будут выводить контент в следующем виде:
Параграф 1 Параграф 2
При включении тегов параграфов
отдельных параграфа.
Параграф 1
Параграф 2
Терминатор инструкции
операторы выводятся как два
К.С. Флойд
Введение в программирование на PHP5
Каждая строка кода PHP должна завершаться терминатором инструкции
(признаком конца), в качестве которого используется точка с запятой
( ; ) . Терминатор инструкции применяется для отделения одного
множества инструкций от другого.
Отсутствие терминатора инструкции может приводить к ошибкам в
работе интерпретатора PHP и выводу ошибок в окне браузера.
Следующий фрагмент кода показывает распространенную ошибку
отсутствия терминатора инструкции.
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHIML 1.0 Transitiom]//EN"
' http ://www.w3.org/TR/xhtmll/DTD/xhtmUl-transitiomL dtd">
<html xm]ns="http://www.w3.org/1999/xhtml" xmUang="en" lang="en">
<head>
<title>Страница Web </title>
</head>
<body>
<p>
<?php
echo "Эта строка порождает ошибку"
echo "В предыдущей строке отсутствует терминатор инструкции";
?>
</p>
</body>
</html>
В этом примере в первом операторе e c h o пропущен терминатор
инструкции. Так как интерпретатор PHP не может определить конец
первого оператора e c h o и начало второго, то происходит ошибка. В
зависимости от настроек Обработки ошибок (Error Handling)
интерпретатора, будет выводиться сообщение об ошибке или браузер
выведет просто пустую страницу.
К.С. Флойд
Введение в программирование на PHP5
Далее показано типичное сообщение об ошибке, которое выводится,
когда пропущен терминатор инструкции:
Parse error: syntax error, unexpected T_PRINT in C:\ApacheRoot\test.php on li
Ошибка при разборе: синтаксическая ошибка, непредвиденный T_PRIN
Как можно видеть, сообщения об ошибках PHP достаточно загадочны
по своей природе. Отсутствие терминатора инструкции является
распространенной ошибкой среди новичков PHP. Со временем появится
привычка проверять каждую строку на наличие терминатора
инструкции.
Комментарии в коде
Комментарии применяются в PHP для записи собственных замечаний
во время процесса разработки кода. Такие комментарии могут
определять назначение сегмента кода или их можно использовать для
исключения блоков кода во время тестирования и отладки сценариев.
Синтаксический
анализатор
PHP
игнорирует
комментарии.
Комментарии в PHP можно определить одним из следующих способов:
/ / — простой комментарий PHP;
# — альтернативный простой комментарий PHP;
/ * . . . * / — многострочные блоки комментариев.
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitiona]//EN"
' http ://www.w3.org/TR/xhtmll/DTD/xhtmlll-transitionaL dtd">
<html xm]ns='http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
^ й ^ С т р а н и ц а Web </title>
</head>
<body>
<p>
К.С. Флойд
<?php
// Простой комментарий PHP
# Другой тип простого комментария PHP
/* Многострочный блок комментария PHP
Он может занимать любое необходимое
количество строк */
?>
</p>
</body>
</html>
Введение в программирование на PHP5
К.С. Флойд
Введение в программирование на PHP5
Данные PHP
Переменные - основа любого языка программирования. Эта лекция о
них, кроме того, описаны некоторые встроенные функции PHP, а также
рассказано о различии одиночных и двойных кавычек в PHP
Скалярные переменные
Переменные являются временным местом хранения, используемым для
представления значений в сценарии PHP. В PHP имеется два основных
типа переменных: скалярные и массивы. Скалярные переменные
содержат только одно значение в данный момент времени, а
переменные массивы — список значений. Переменные массивы
обсуждаются в следующем разделе. Скалярные переменные PHP
содержат значения следующих типов.
Целые - целые числа или числа без десятичной точки (1, 999,
325812841).
Числа с плавающей точкой - числа, содержащие десятичную точку (1.11,
2.5, .44).
Строки - текстовая или числовая информация. Строковые данные
всегда определяются с помощью кавычек ("Hello World", "478-477-5555").
Булевы значения - используются для значений t r u e
f a l s e (ложь).
(истина) или
Имена переменных PHP всех типов начинаются со знака " $ " . Имена
переменных могут содержать буквы, числа, и символ подчеркивания ( _
); они не могут, однако, начинаться с цифры. В PHP имена переменных
различают регистр символов. Следующие переменные в PHP
интерпретируются как две различные переменные.
$myvar
$MYVAR
Допустимые имена переменных:
К.С. Флойд
Введение в программирование на PHP5
$myvar
$F_Name
$address1
$my_string_variable
Недопустимые имена переменных:
Myvar
$1stvar
$&62##
Скалярным переменным PHP присваивают значения в следующем
формате:
$username = "jdoe"
$first_name = "John"
$Last_Name = "Doe"
Переменная u s e r n a m e содержит значение j d o e .
Вывод переменных
Следующий фрагмент кода демонстрирует, как объявить скалярную
переменную, присвоить скалярной переменной значение и вывести
результаты в окне браузера:
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional. dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Страница Web</title>
</head>
<body>
<p>
<?php
$string_var = "Моя программа PHP";
$integer_var = 500;
$float_var = 2.25;
echo $string_var;
echo $integer_var;
echo $float_var;
?>
</p>
</body>
</html>
Переменные массивы PHP можно создавать и присваивать им значения
с помощью конструкции a r r a y ( ) или явным образом.
Переменную можно соединять с другими переменными или тегами
XHTML с помощью оператора PHP — точки ( .). В предыдущем блоке
кода значения переменных выводятся в следующем формате:
Моя программа PHP5002.25
Чтобы создать возврат каретки или перенос строки,
присоединить тег XHTML < b r / > в конце каждой пременной:
<?php
$string_var = "My PHP program" . "<br/>";
$integer_var = 500 . "<br/>";
$float_var = 2.25;
echo $string_var;
echo $integer_var;
echo $float_var;
можно
К.С. Флойд
?>
Теперь после каждой переменной вставляется перенос строки, что
приводит к выводу каждого значения на отдельной строке.
My PHP Program
500
2.25
Соединение переменных
Оператор точки можно использовать также для соединения строк и
переменных:
Сообщение — T he u s e r \ ’ s n a me
окне браузера.
is
J o h n Doe — выводится в
Строка " T h e u s e r ’ s n a me i s
” соединяется со значением
$ f n a m e (John), за которым следует пробел ” ", и значением $ l n a m e
(Doe).
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
"http ://www.w3.org/TR/xhtml1/DTD/xhtml11-transitionaL dtd">
<html xmlns='hl;tp://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>A Web Page</title>
</head>
<body>
<p>
<?php
$fname = "John";
$lname = "Doe";
echo "The user\'s name is " . $fname ." ". $lname;
?>
</p>
</body>
</html>
The user\'s name is John Doe
Интерполяция
PHP поддерживает также процесс, называемый интерполяцией - замену
переменной в строке ее содержимым. Вместо соединения переменных и
литералов, их можно объединять внутри двойных кавычек ("").
Интерполяция является свойством только двойных кавычек.
Переменные и литералы нельзя объединить внутри одиночных кавычек.
При использовании двойных кавычек значение переменной выводится
вместе с литералом. При использовании одиночных кавычек выводится
"буквально" имя переменной вместе с остальной строкой. Следующий
пример иллюстрирует свойство интерполяции PHP.
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtmll/DTD/xhtmlll-transitionaL dtd">
<html xmhs='http://www.w3.org/1999/xhtml" xml;lang="en" lang="en">
<head>
<title>A Web Page</title>
</head>
<body>
<p>
<?php
$fname = "John";
$lname = "Doe";
echo "The user\'s name is $fname $lname";
?>
</p>
</body>
</html>
Этот код создает такой же вывод, как и предыдущий пример. Здесь
переменные
объединяются с помощью
литеральной
строки,
заключенной в двойные кавычки. Соединение (конкатенация) не
требуется.
Форматирование вывода валюты
Кроме вывода стандартного текста можно применять для вывода
форматированного текста вариант конструкции print с именем
s p r i n t f . Оператор требует задания форматирующей строки и
значения для форматирования.
sprintf("%01.2f', $var) - выводит значение '$var' как валюту.
Оператор s p r i n t f показан ниже:
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11-transitionaL dtd">
<html xmlns='http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>A Web Page</title>
</head>
<body>
<p>
<?php
$amount = 35;
$tax = 2.50;
$total = $amount + $tax;
echo "$" . sprintf("%01.2f', $total);
К.С. Флойд
?>
</p>
</body>
</html>
Вывод валюты показан ниже:
$37.50
Переменные массивы
В то время как скалярная переменная PHP хранит одно значение,
переменную массива можно использовать для хранения множества или
последовательности значений. Система PHP поддерживает массивы с
числовыми индексами и ассоциативные массивы. Массив в PHP
является фактически упорядоченным отображением. Отображение
является типом, который отображает значения в ключи. Переменные
массивов состоят из двух частей - индекса и элемента. Индекс массива,
иногда
называемый
ключом
массива,
является
значением,
применяемым для идентификации или доступа к элементам массива.
Индекс массива помещается в квадратные скобки. Большинство
массивов используют числовые индексы, которые обычно начинаются с
0 или 1. В PHP ассоциативные массивы могут использовать строковые
индексы. Оба типа массивов создаются с помощью конструкции
a r r a y () .
Массивы с числовыми индексами
$my_array = array('red', 'green', 'blue');
Этот код создает массив с числовым индексом с именем $ m y _ a r r a y .
Массиву присваивается три элемента — r e d , g r e e n , и b l u e . Каждый
элемент идентифицируется числовым индексом.
$my_array[0] = 'red' // индекс 0 соответствует элементу red
$my_array[1] = 'green' // индекс 1 соответствует элементу green
$my_array[2] = 'blue' // индекс 2 соответствует элементу blue
К.С. Флойд
Введение в программирование на PHP5
Чтобы получить доступ к содержимому массива, используется имя
массива и индекс. Следующий код применяется для вывода значений
переменной $ m y _ a r r a y .
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 TransitionaP/EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional. dtd">
<html xmhs="http://www/w3.org/1999/x]itml" xml:lang="en" lang="en">
<head>
<tit]e>Страница Web </title>
</head>
<body>
<p>
<?php
$my_array = array('red', 'green', 'blue');
echo "Первое значение массива — " . $my_array[0]."<br/>";
echo "Второе значение массива — " . $my_array[1]."<br/>";
echo "Третье значение массива — " . $my_array[2]."<br/>";
?>
</p>
</body>
</html>
Первое значение массива — red
Второе значение массива — green
Третье значение массива — blue
Ассоциативные массивы
Ассоциативные массивы позволяют использовать более полезные
значения индекса. Для массивов с числовыми индексами значения
индекса создаются автоматически, начиная с 0. Ассоциативные
массивы допускают применение числовых и строковых значений
К.С. Флойд
Введение в программирование на PHP5
индекса. Символ между индексом и значениями ( => ) является знаком
равенства, за которым сразу следует символ больше.
$members = array('FName' => 'John', 'LName' => 'Smith', 'Age' => 50)
В этом примере члены массива содержат три элемента, однако
используются строковые индексы — FName, LName и A g e .
$members['FName'] = 'John' //индекс FName соответствует элементу John
$members['LName'] = 'Smith' // индекс LName соответствует элементу Smi
$members['Age'] = '50' // индекс Age соответствует элементу 50
Для доступа к содержимому массива используется имя массива и
индекс. Следующий код применяется для вывода значений переменной
$members.
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitiona]//EN"
' http ://www.w3.org/TR/xhtmll/DTD/xhtmlll-transitiona]. dtd">
<html xmhs="http://www/w3.org/1999/xhtml" xmUang="en" lang="en">
<head>
<title>Страница Web </title>
</head>
<body>
<p>
<?php
$members = array('FName' => 'John', 'LName' => 'Smith', 'Age' => 50);
echo "The user\'s first name is " . $members['FName'];
echo "The user\'s last name is " . $members['LName'];
echo "The user\'s age is " . $members['Age'];
?>
</p>
</body>
К.С. Флойд
</html>
The user's first name is John The user's last name is Smith
The user's age is 50
Функции для работы с массивами
Кроме функции a r r a y ( ) система PHP включает множество других
функций для работы с массивами. Следующий раздел описывает
некоторые из наиболее часто используемых функций. Более обширный
список доступен на Web-сайте PHP.
c o u n t () - функция count используется для подсчета числа элементов в
массиве.
s o r t ( ) - функция s o r t
существующего массива.
используется для сортировки элементов
s h u f f l e ( ) - функция s h u f f l e используется для случайного
перемешивания элементов в заданном массиве.
s i z e o f ( ) - функция s i z e o f является синонимом (алиасом) функции
c o u n t() .
a rra y_ slice ($array_nam e,offset,
length)
- функция
a r r a y _ s l i c e используется для извлечения части существующего
массива. $ a r r a y _ n a m e является именем разрезаемого массива,
o f f s e t указывает позицию, где будет начинаться разрез, l e n g t h
указывает число элементов, которое будет вырезано из массива.
array_m erge($array_nam e,
$array_name)
функция
a r r a y _ m e r g e используется для объединения или слияния двух или
большего количества существующих массивов. Имена массивов
разделяются запятыми.
Следующий код показывает, как применяется каждая из функций для
работы с массивами.
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitiona]//EN"
К.С. Флойд
Введение в программирование на PHP5
' http У/www. w3.org/TR/xhtmll/DTD/xhtmUl-transitional. dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Страница Web </title>
</head>
<body>
<p>
<?php
//Созданы два массива
$numbers = array(50,20,18,30,10,7);
$colors = array('red', 'blue', 'green');
// определяем размер массива $numbers — 6
$array_size = sizeof($numbers);
// сортируем элементы массива $numbers - возвращает array(7,10,18,20,3
sort($numbers);
// случайным образом перемешиваем элементы массива $numbers
shuffle($numbers);
// $merged_array возвращает array(7,10,18,20,30,50,'red','blue','green')
$merged_array = array_merge($numbers,$colors);
// вырезаем номера 18 и 20 из сортированного массива $numbers
// $slice содержит array(18,20)
$slice = array_slice($numbers, 2, 2);
К.С. Флойд
?>
</p>
</body>
</html>
П рим ер 3 . 1 .
PHP включает также ряд предопределенных или глобальных массивов.
Их называют также суперглобальными переменными, так как они всегда
присутствуют и доступны для всех блоков сценария PHP. Ниже
показаны обычно используемые суперглобальные переменные PHP.
$_GET[]
$_POST[]
$_REQUEST[]
$_COOKIE[]
$_FITES[]
$_SERVER[]
$_ENV[]
$_SESSION[]
Суперглобальные переменные PHP будут описаны в дальнейшем.
Массивы имеют много применений в PHP и программировании в
целом. Этот раздел представил некоторые базовые вопросы массивов
PHP и описал некоторые базовые функции: это понадобится при
рассмотрении более развитых свойств массивов в следующих разделах.
Константы PHP
Константы, как и переменные, являются временным хранилищем
значений в памяти. В отличие от переменных значение константы
никогда не изменяется. При объявлении константы используется
функция d e f i n e ( ) , которая требует задать имя константы и значение
этой константы.
Константам можно присваивать следующие типы данных.
Целые - целые числа или числа без десятичной точки (1, 999,
Числа с плавающей точкой — числа, содержащие десятичную точку
(1.11, 2.5, .44).
Строки - текстовая или числовая информация. Строковые данные
всегда заключаются в кавычки ("Hello World", "478-477-5555").
Имена констант PHP в отличие от переменных не начинаются со знака
"$". Имена констант обычно записывают в верхнем регистре. Имена
констант могут содержать буквы, цифры и символ подчеркивания ( _ );
они не могут, однако, начинаться с цифры. Объявление констант
показано ниже.
define("STRING_CONSTANT", 'This is my string.");
define("NUMERIC_CONSTANT", 5);
Вывод констант
Следующий фрагмент кода демонстрирует объявление константы,
присваивание константе значения и вывод результатов в окне браузера.
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11-transitionaL dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>A Web Page</title>
</head>
<body>
<p>
<?php
define("STRING_CONST","My PHP program");
define("INTEGER_CONST",500);
К.С. Флойд
Введение в программирование на PHP5
define(TLOAr_CONST",2.25);
echo STRING_CONST;
echo INTEGER_CONST;
echo FLOAT_CONST;
?>
</p>
</body>
</html>
П рим ер 3 . 2 .
My PHP program 500 2.25
В этом примере объявляются значения трех констант: STRING_CONST,
INTEGER_CONST и FLOAT_CONST. Затем используется оператор
e c h o для вывода содержимого констант в окне браузера. Кроме вывода
в окне браузера, константы можно использовать при выполнении
математических и строковых операций PHP.
Операторы PHP
Операторы применяются для выполнения операций или действий с
переменными.
Они
могут включать присваивание
значения
переменной, выполнение сложения переменных, сравнение значений
переменных и определение состояния условия.
Арифметические операторы
Операторы присваивания
Операторы сравнения
Логические операторы
Арифметические операторы используются для выполнения основных
математических операций. В следующей таблице представлены
К.С. Флойд
Введение в программирование на PHP5
арифметические операторы, которые применяются в PHP.
Оператор
Описание
+
сложение
*
вычитание
умножение
/
деление
%
сравнение по модулю (возвращает остаток от деления)
++
увеличивает значение
--
уменьшает значение
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11-transitionaL dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>A Web Page</title>
</head>
<body>
<p>
<?php
// Оператор сложения
$sum = 5 + 2;
$sum = 7;
$newsum = $sum + 4;
echo "The sum is " . $newsum;
//The subtraction operator
$difference = $newsum - 2;
echo "The difference is " . $difference;
//The multiplication operator
$product = $difference * 3;
echo "The product is " . $product;
//The division operator
$quotient = $product / $difference;
echo "The quotient is " . $quotient;
//The Increment operator
$quotient++;
echo $quotient;
//The decrement operator
$quotient --;
echo $quotient;
?>
</p>
</body>
</html>
П рим ер 3 . 3 .
The sum is 11 The difference is 9
The product is 27 The quotient is 343
Порядок выполнения операций
К.С. Флойд
Введение в программирование на PHP5
Когда вычисляется арифметическое выражение, существует заданный
порядок, в котором выполняются операции. Этот порядок называется
приоритетом операций. Умножение и деление имеют преимущество (и
выполняются первыми) перед сложением и вычитанием, при
движении в выражении слева направо. Этот порядок имеет важное
влияние на то, будут ли получены ожидаемые результаты. Рассмотрим
следующие объявления и присваивания.
<?php
$num1 = 4;
$num2 = 5;
$num3 = 2;
$answer = $num1 * $num2 - $num3;
echo $answer;
?>
Получающееся значение будет равно 18. Сначала $num1 умножается на
$ n u m 2 , чтобы получить 20; затем $num3 вычитается из 20, чтобы
получить 18. Предположим, однако, что в действительности надо
сначала вычесть $num3 из $ n u m 2 , а затем умножить на $ n u m 1 , чтобы
получить 12. Показанное выше выражение не создаст этот результат,
потому что умножение имеет приоритет перед вычитанием и
выполнится первым.
Поэтому часто необходимо переопределить порядок выполнения
операций и явно управлять порядком вычисления выражения. Для
этого используют скобки (), которые могут помочь изменить порядок
выполнения арифметических операций. Приведенный выше пример
можно переписать следующим образом.
<?php
$num1 = 4;
$num2 = 5;
$num3 = 2;
$answer = $num1 * ($num2 - $num3);
К.С. Флойд
Введение в программирование на PHP5
echo $answer;
?>
В этот раз $ a n s w e r равно 12. $num3 вычитается из $ n u m 2 , чтобы
получить 3. Затем 3 умножается на $ n u m 1 .
Операторы присваивания используются для изменения значения
текущей переменной на значение справа от оператора. В следующей
таблице представлены операторы присваивания языка PHP.
Оператор
Описание
=
Переменной слева присваивается вычисленное справа
значение
+=
Складывает значение слева со значением справа и
присваивает результат переменной слева
-=
Вычитает значение справа из значения слева и присваивает
результат переменной слева
*=
Умножает значение справа на значения слева и присваивает
результат переменной слева
/=
Делит значение слева на значение справа и присваивает
результат переменной слева
%=
Делит значение слева на значение справа и присваивает
остаток (по модулю) переменной слева
.=
Значение слева соединяется (конкатенация) со значением
справа, и результат присваивается переменной слева
Операторы сравнения используются для сравнения значений.
следующей таблице представлены операторы сравнения языка PHP.
Оператор
Описание
==
равно
!=
не равно
>
больше
<
меньше
В
К.С. Флойд
Введение в программирование на PHP5
>=
больше или равно
<=
меньше или равно
Логические операторы позволяют определять состояние условий. В
зависимости от условия переменной в сценарии могут происходить
различные действия. Логические операторы широко используются в
управляющих структурах PHP. В следующей таблице представлены
логические операторы языка PHP.
Оператор Описание
&&
AND (И)
||
!
OR (ИЛИ)
NOT (НЕ)
Строки PHP
Строки являются последовательностями символов. В PHP символ
соответствует байту, т.е. существует точно 256 возможных различных
символов. Строки могут быть очень большими. В PHP не существует
практического ограничения на размер строк, поэтому вообще нет
причин беспокоиться об их длине. Строковые значения могут
использоваться буквально или присваиваться переменным.
В PHP строковый литерал можно представлять тремя способами.
строки в одиночных кавычках
строки в двойных кавычках
строки в синтаксисе h e r e d o c
В этом учебнике представлено использование строк в одиночных и
двойных кавычках. Синтаксис h e r e d o c
не рассматривается.
Подробная информация об этом синтаксисе имеется в документации
PHP.
Строки в одиночных кавычках
К.С. Флойд
Введение в программирование на PHP5
Одиночные кавычки предоставляют самый простой метод для работы
со строками. При использовании этого метода строки заключаются в
одиночные кавычки (' '). Если одиночные кавычки требуются как часть
строки, они должны быть экранированы символом обратной косой
черты (Т ). Хотя одиночные кавычки предоставляют простой способ
работы со строками, одиночные кавычки не поддерживают применение
интерполяции (см. раздел 3-1, Скалярные переменные). Примеры ниже
иллюстрируют использование одиночных кавычек.
<?php
//A literal string displayed in the browser window
echo 'PHP was developed in 1994 by Rasmus Lerdorf;
//A literal string assigned to a variable
$string = 'Since its development, PHP has become a popular scripting language.';
echo $string;
//escaping single quotes
echo 'The array contains the values \'2,5,3,4\'.';
//invalid attempt to expand a variable inside of a single quote string
$name = 'John Smith';
echo 'The user\'s name is $name';
?>
PHP was developed in 1994 by Rasmus Lerdorf
Since its development, PHP has become a popular scripting language.
The array contains the values '2,5,3,4'.
Parse error: syntax error, unexpected T_STRING, expecting ',' or ';'
Первая строка вывода является результатом работы оператора e c h o ,
который выводит литеральную строку в одиночных кавычках в окне
К.С. Флойд
Введение в программирование на PHP5
браузера. Вторая строка выводится после присваивания строки в
одиночных кавычках переменной. Переменная затем выводится с
помощью оператора e c h o . Следующая строка вывода демонстрирует
использование экранирующего символа.
Строки в двойных кавычках
Строки PHP можно выводить также с помощью двойных кавычек ("").
Если строки PHP помещаются в двойные кавычки, то можно применять
интерполяцию. Для строк в двойных кавычках PHP поддерживает также
больше экранированных символов. Эти символы представлены в
таблице ниже.
Символ
Описание
\n
перенос строки
\r
возврат каретки
\t
горизонтальная табуляция
\\
обратная косая черта
\$
знак доллара
\"
двойная кавычка
<?php
echo "PHP is supported by many operating systems including Windows and Linux
$name = "John";
echo "The user\'s name is $name.";
$fruits = array('grapes', 'peaches', 'strawberries');
echo "My favorite fruit is $fruits[0].";
?>
PHP is supported by many operating systems including Windows and Linux.
К.С. Флойд
Введение в программирование на PHP5
The user's name is John.
My favorite fruit is grapes.
Первая строка выводит строку в двойных кавычках с помощью
оператора e c h o . Вторая - создается строкой с включенной переменной.
Переменная расширяется, и ее содержимое выводится вместе со
строкой. Затем расширяется переменная массива и выводится вместе со
строкой.
Функции для работы со строками
Система PHP содержит ряд функций для работы со строками.
Следующий список содержит некоторые из наиболее распространенных
строковых функций.
s t r l e n ( s t r i n g ) - определяет длину строки s t r i n g .
ltrim (string)
string.
- удаляет символы-разделители в начале строки
rtrim (string)
string.
- удаляет символы-разделители в конце строки
s t r p b r k ( s t r i n g , c h a r ) - ищет в строке s t r i n g символ c h a r .
Возвращает f a l s e или строку, начинающуюся с найденного символа.
s t r t o u p p e r ( s t r i n g ) - преобразует строку в верхний регистр.
s t r t o l o w e r ( s t r i n g ) - преобразует строку в нижний регистр.
s t r r e v ( s t r i n g ) - возвращает строку s t r i n g в обратном порядке.
e r e g i ( p a t t e r n , s u b j e c t ) - выполняет независимое от регистра
символов сравнение с выражением. В строке s u b j e c t происходит
поиск регулярного выражения, заданного строкой p a t t e r n .
Следующий блок кода демонстрирует, как использовать строковые
функции PHP.
К.С. Флойд
Введение в программирование на PHP5
<?php
$string = "Hello World";
$amther_string = "Welcome to PHP";
echo
echo
echo
echo
strlen($string);
strtoupper($another_string);
strrev($another_string);
strpbrk($string, "W");
?>
11
WELCOME TO PHP
PHP ot emocleW
World
Первая строка выводит длину строки " H e l l o W o r l d ” , равную 11.
Затем строка " W e l c o m e t o PHP" преобразуется в верхний регистр и
выводится в окне браузера. Эта строка используется также с функцией
strrev для изменения порядка символов строки на обратный. Наконец, в
строке происходит поиск символа "W". Так как первое появление
символа происходит в тексте " W o r l d " , выводится эта строка.
Функции даты и времени
Базовые функции PHP для даты и времени позволяют форматировать
отметку времени для применения в запросах базы данных или просто
для вывода даты и времени в окне браузера. PHP включает следующие
функции даты и времени:
date(form at)
возвращает
текущее
время
сервера,
форматированное согласно заданному множеству параметров f o r m a t .
c h e c k d a t e (month,
day,
y e a r ) - проверяет заданную дату
Успешная проверка означает, что год y e a r находится между 0 и 32767,
месяц m o n t h - между 1 и 12, и правильное количество дней каждого
месяца.
К.С. Флойд
Введение в программирование на PHP5
t i m e () - возвращает текущее время сервера, измеренное в секундах,
начиная с 1 января 1970 г.
Следующая таблица содержит допустимые форматы d a t e () :
a выводит "am" или "pm"
A выводит "AM" или "PM"
h часы в 12-часовом формате (01 - 12)
H часы в 24-часовом формате (00 - 23)
g часы в 12-часовом формате без ведущего нуля (1 - 12)
G часы в 24-часовом формате без ведущего нуля (0 - 23)
i минуты (00 - 59)
s секунды (00 - 59)
d день месяца двумя цифрами (01 - 31)
D день недели текстом (Mon - Sun)
l день недели длинным текстом (Monday - Sunday)
F месяц длинным текстом (January - December)
n месяц двумя цифрами (1 - 12)
Y год четырьмя цифрами (2005)
у год двумя цифрами (05)
S английские порядковые суффиксы (th, nd, st)
Следующая страница использует функцию PHP d a t e ()
определения и вывода текущего времени сервера и даты:
для
<?php
echo "<span style='font:10pt arial'>Today is ".date('l F j Y')."</span>";
echo "<br/>";
echo "<span style='font:10pt arial'>The current time is:</span>".
date('g±s a');
?>
Формат даты/времени, выводимый с помощью функции d a t e ( ) ,
зависит от типов параметров формата, подставленных в функцию.
Параметры функции d a t e ( ) можно объединять, разделяя запятой
К.С. Флойд
Введение в программирование на PHP5
” , ” , двоеточием ” : ” или другими знаками пунктуации, в зависимости
от желаемого формата вывода. Все параметры, однако, должны быть
заключены в одиночные кавычки. В примере выше время выводится с
помощью параметров формата времени g , i , s , и а . Двоеточия и
пробелы также вставляют для разделения часов, минут, секунд и
признаков a m / p m .
Функции c h e c k d a t e () и t i m e () обычно используются в процессах
принятия решений. Поэтому они подробнее будут рассмотрены в
дальнейшем.
К.С. Флойд
Введение в программирование на PHP5
Структуры принятия решений
Структуры принятия решений (или структуры выбора) в PHP, мало чем
отличаются от остальных языков программирования - поэтому лекция
достаточно небольшая
Оператор If
При создании кода часто требуется выполнять различные действия на
основе некоторого выбора. В PHP это можно делать с помощью
условных операторов - оператора i f , оператора i f
... e l s e и
оператора e l s e i f .
i f - этот оператор используется для выполнения блока кода, когда
выполняется условие ( t r u e ).
i f . . . e l s e - этот оператор используется для выполнения блока кода,
когда условие выполняется ( t r u e ), или для выполнения другого блока
кода, когда условие не выполняется ( f a l s e ).
e l s e i f - комбинация i f и e l s e . Оператор расширяет оператор i f ,
чтобы выполнялся другой оператор в случае, если исходное выражение
i f оценивается как FALSE. В отличие от e l s e он будет выполнять
альтернативное выражение, только если условное выражение e l s e i f
оценивается как TRUE.
В том случае, когда необходимо выполнить блок кода, если выполняется
некоторое условие ( t r u e ), можно использовать оператор i f .
Ниже представлен синтаксис оператора i f :
if (условие) {
// выполняемый код
}
Строки кода оператора i f заключаются в фигурные скобки ( {} ). Эти
скобки определяют начало (открывающая скобка { ) и конец
(закрывающая скобка } ) оператора I f . Следующий пример
<?php
$number = 5;
if ($number <= 10)
{
echo "Число меньше или равно 10.";
}
?>
Число меньше или равно 10.
В приведенном выше примере число 5 присваивается переменной
$ n u m b e r . Затем сценарий PHP использует оператор сравнения " < = "
(меньше или равно) для сравнения значения $ n u m b e r с числом 10.
Если значение меньше или равно 10, оператор e c h o выводит
сообщение " Ч и с л о м е н ь ш е и л и р а в н о 1 0 " в окне браузера.
Можно видеть, что скобки применяются для ограничения блока
оператора i f . Открывающая скобка { появляется сразу после оператора
условия, а закрывающая скобка } — в конце оператора i f .
Вспомните, что все операторы PHP должны завершаться с помощью
терминатора инструкции ( ; ): e c h o " Ч и с л о м е н ь ш е и л и р а в н о
10.";
В некоторых случаях может понадобиться предоставить альтернативное
сообщение. В приведенном выше примере предположим, что
переменная $ n u m b e r содержит число 15, которое больше 10.
Альтернативное сообщение должно выводиться, чтобы пользователь
знал: число больше 10. Это можно выполнить с помощью оператора i f
... e l s e .
<?php
$number = 15;
if ($number <= 10) {
}
else {
echo "Число больше 10";
}
?>
Число больше 10.
В приведенном выше примере число 15 присваивается переменной
$ n u m b e r . Затем сценарий PHP использует оператор сравнения " < = "
(меньше или равно) для сравнения значения $ n u m b e r с числом 10.
Если это значение меньше или равно 10, оператор e c h o выводит
сообщение " Ч и с л о м е н ь ш е и л и р а в н о 1 0 " в окне браузера.
Теперь в код добавлен оператор e l s e , чтобы выводить альтернативное
сообщение, если условие в операторе i f
не выполняется.
Альтернативное сообщение " Ч и с л о б о л ь ш е 1 0 " выводится в окне
браузера, если оператор условия возвращает f a l s e . Здесь также
используются скобки для ограничения блока оператора i f .
Открывающая скобка { появляется сразу после оператора условия, а
закрывающая скобка } — в конце оператора i f . Скобки также
используются для ограничения альтернативного блока оператора e l s e .
Третий тип условного оператора является структурой e l s e i f .
Оператор e l s e i f является комбинацией i f и e l s e . Подобно e l s e
он расширяет оператор i f , чтобы выполнить другой оператор, если
условное выражение исходного i f оценивается как FALSE. Однако в
отличие от e l s e он будет выполнять это альтернативное выражение,
только если условное выражение в e l s e i f оценивается как TRUE. В
одном операторе i f может быть несколько структур e l s e i f . Первое
выражение e l s e i f (если такое имеется), которое оценивается как
TRUE , будет выполнено.
<?php
$number = 15;
К.С. Флойд
Введение в программирование на PHP5
if ($number < 10) {
echo "Число меньше 10.";
}
elseif ($number == 10) {
echo "Число равно 10.";
}
else {
echo "Число больше 10.";
}
?>
Число больше 10.
В этом примере числовое значение переменной
$number
сравнивается с 10. Сперва оператор i f проверяет, что $ n u m b e r
меньше 10. Если этот оператор выполняется ( t r u e ), выводится
сообщение " Ч и с л о м е н ь ш е
1 0 ” . Затем оператор e l s e i f
используется для проверки, что $ n u m b e r равно 10. Если этот оператор
оценивается как t r u e , выводится сообщение " Ч и с л о р а в н о 1 0 " .
Оператор e l s e i f
выполняется, ТОЛЬКО если оператор i f
возвращает FALSE. Наконец, если операторы i f и e l s e i f
возвращают FALSE, выполняется оператор e l s e и выводится
сообщение " Ч и с л о б о л ь ш е 1 0 " . В то время как оператор e l s e i f
позволяет проверить только одно условие, структуру i f можно
применять для проверки множества условий.
Следующий пример использует функцию c h e c k d a t e ( ) , функцию
e x p l o d e () и оператор i f ... e l s e для проверки правильности
строки даты.
<?php
$orig_date = "09/19/2005";
$date = explode("/", "$orig_date");
$month = $date[0];
$day = $date[1];
$year = $date[2];
$result = checkdate($month, $day, $year);
if ($result == true)
{
echo "Правильная дата";
}
else
{
echo "Неправильная дата!";
}
?>
Правильная дата
Операторы i f можно использовать "в одиночку" либо как часть
оператора i f . . . e l s e или i f . . . e l s e i f . . . e l s e . В любом случае
вы обнаружите, что эта структура будет важным элементом в любой
программе.
Оператор switch
В дополнение к операторам i f , рассмотренным в предыдущем разделе,
PHP включает четвертый тип условного оператора, называемый
оператором s w i t c h . Оператор s w i t c h очень похож или является
альтернативой для команд i f . . . e l s e
i f . . . e l s e . Оператор
s w i t c h проверяет условие. Результат этой проверки определяет, какой
c a s e выполняется. s w i t c h используется обычно, когда ищут точный
(равенство) результат, вместо условия больше или меньше. При
проверке диапазона значений должен применяться оператор i f .
s w i t c h - используйте этот оператор для выбора одного из нескольких
блоков кода для выполнения.
Ниже представлен синтаксис оператора s w i t c h .
<?php
switch (выражение) {
case "значение1":
// код, который будет выполнен, если выражение = значение1;
break;
case "значение2":
// код, который будет выполнен, если выражение = значение2;
break;
default:
// код, который будет выполнен, если выражение не равно ни значение1
}
?>
Подобно оператору i f строки кода в операторе s w i t c h заключаются в
фигурные скобки.
Эти скобки определяют начало и конец оператора s w i t c h . Следующий
пример демонстрирует использование оператора s w i t c h .
<?php
$number = 25;
switch ($number) {
case 40:
echo "Значение \$number равно 40";
break;
case 25:
echo "Значение \$number равно 25";
break;
default:
echo "Значение \$number отлично от 25 и 40";
}
?>
Оператор s w i t c h может включать множество операторов c a s e . В
К.С. Флойд
Введение в программирование на PHP5
предыдущем примере показаны два оператора c a s e . Создается
переменная $ n u m b e r , которой присваивается значение 25. Оператор
s w i t c h используется для сравнения значения $ n u m b e r с другими
значениями. Проверяемое (сравниваемое) выражение (в данном случае
$ n u m b e r ) помещается внутри скобок сразу после оператора s w i t c h .
Затем вызывается последовательность операторов c a s e для сравнения
выражения с другими значениями. Эти значения помещаются сразу
после оператора c a s e . (Примечание: если проверяемые значения
являются строками, они должны заключаться в кавычки.) За значением,
которое сравнивается с выражением, следует двоеточие ( :). Операторы
c a s e аналогичны конструкциям i f и e l s e i f . Если значение
оператора c a s e будет t r u e , то выполняется код, связанный с этим
оператором, и оператор b r e a k . Оператор b r e a k приводит к
завершению оператора s w i t c h . Остальные операторы c a s e
проверяться не будут. В конце оператор s w i t c h содержит инструкцию
d e f a u l t . Она аналогична оператору e l s e . Если ни один из
операторов c a s e не будет выполнен (не будет иметь значение TRUE ),
выполняется оператор d e f a u l t . Здесь одновременно происходит
несколько вещей:
1. проверяется условие s w i t c h и находится значение ( $ n u m b e r
== 25 );
2. значение условия передается по очереди операторам c a s e ;
3. если это значение совпадает со значением c a s e , выполняется код
этого блока. Оператор b r e a k приводит к завершению оператора
s w i t c h . Остальные операторы c a s e не проверяются;
4. если проверяемое значение не совпадает ни с одним из значений
c a s e , выполняется раздел d e f a u l t ;
5. в приведенном выше примере, так как выражение " з н а ч е н и е
$ n u m b e r " р а в н о 2 5 , выполняется второй оператор c a s e , и
в окне браузера выводится текст " З н а ч е н и е $ n u m b e r р а в н о
25".
В программировании часто необходимо повторить один и тот же блок
кода несколько раз. Это можно реализовать с помощью операторов
цикла. Язык PHP содержит несколько типов операторов цикла
Циклы while
В программировании часто необходимо повторить один и тот же блок
кода несколько раз. Это можно реализовать с помощью операторов
цикла. Язык PHP содержит несколько типов операторов цикла. Данный
раздел рассматривает цикл w h i l e .
Оператор w h i l e циклически повторяет блок кода, пока указанное
условие имеет значение t r u e . Другими словами, оператор w h i l e
будет выполнять блок кода, если и пока условие будет истинным.
Базовый синтаксис цикла w h i l e показан ниже.
while (условие) {
выполняемый код;
}
Код в цикле w h i l e будет повторно выполняться, пока условие в начале
цикла имеет значение t r u e . Блок кода, связанный с оператором
w h i l e , всегда заключается в фигурные скобки.
Следующий пример демонстрирует цикл w h i l e , который будет
выполняться, пока значение переменной $ n u m b e r будет больше или
равно 2.
<?php
$number = 5;
while ($number >= 2) {
echo $number . "<br/>";
$number -= 1;
}
?>
К.С. Флойд
Введение в программирование на PHP5
В приведенном выше примере переменная $ n u m b e r получает
начальное значение, равное 5. Цикл w h i l e выполняется, пока условие
( $ n u m b e r >=2 ), или значение $ n u m b e r больше или равно 2, и
печатает в окне браузера значение $ n u m b e r . В конце блока цикла
значение $number уменьшается на 1.
Ниже показан вывод, создаваемый примером цикла.
5
4
3
2
При первом выполнении значение $ n u m b e r равно 5. Так как 5 больше
2, используется оператор e c h o для вывода значения 5. При выводе
присоединяется < b r / > , чтобы создавать возврат каретки при каждом
выполнении цикла. Затем значение $ n u m b e r уменьшается на 1. Во
время второй итерации значение $ n u m b e r равно 4. Так как 4 больше 2,
то оператор e c h o выводит значение 4. Этот процесс продолжается,
пока значение $ n u m b e r равно 3 и 2. Когда $ n u m b e r равно 2,
оператор e c h o выводит значение 2, а значение $ n u m b e r затем
уменьшается на 1. Так как 1 не больше и не равно 2, то условие больше
не выполняется, и цикл w h i l e заканчивается.
Циклы do while
Оператор d o . . . w h i l e повторяет циклически блок кода, пока
определенное условие принимает значение true. Другими словами,
оператор d o ...w h ile будет выполнять блок кода, если и пока условие
будет выполняться (т.е. оцениваться как t r u e ).
Цикл d o . . . w h i l e аналогичен по своей природе циклу w h i l e ,
рассмотренному в предыдущем разделе. Ключевое различие состоит в
том, что тело цикла d o . . . w h i l e будет обязательно выполнено как
минимум один раз. Это связано с тем, что оператор условия
оценивается в конце оператора цикла после выполнения тела цикла.
Базовый синтаксис цикла d o ...w h ile показан ниже.
К.С. Флойд
Введение в программирование на PHP5
do {
выполняемый код;
}
while (условие);
Выполнение кода внутри цикла d o ...w h ile будет повторяться, пока
условие в конце цикла будет оцениваться как t r u e . Блок кода,
связанный с оператором d o ...w h ile , всегда размещается внутри
фигурных скобок.
Следующий пример демонстрирует цикл d o ...w h ile , который
продолжает выполняться, пока переменная $ n u m b e r будет больше или
равна 2.
$number = 5;
do {
echo $number . "<br/>";
$number -= 1;
}
while ($number >= 2);
В
приведенном
выше
примере
переменная
$number
инициализируется значением 5. Цикл d o ...w h ile выполняется до тех
пор, пока справедливо условие ( $ n u m b e r >=2 ) или $ n u m b e r
больше или равно 2, выводя значение $ n u m b e r в окне браузера. В
конце блока цикла значение $ n u m b e r уменьшается на 1.
Ниже показан вывод, создаваемый примером цикла:
5
4
3
2
Во время первого выполнения значение $ n u m b e r равно 5. Так как
условие для выполнения цикла не проверяется, пока цикл не будет
выполнен один раз, то выводится значение $ n u m b e r , равное 5. Затем
значение $ n u m b e r уменьшается на 1, становясь равным 4. Так как 4
больше 2, снова выполняется цикл, и во время второй итерации
К.С. Флойд
Введение в программирование на PHP5
используется оператор e c h o для вывода значения 4. В вывод
добавляется < b r / > , чтобы создать возврат каретки при каждом
выполнении цикла. Этот процесс продолжается, пока значение
$ n u m b e r равно 3 и 2. Когда $ n u m b e r становится равным 2, оператор
e c h o выводит значение 2, и значение $ n u m b e r уменьшается затем до
1. Так как 1 не больше и не равно 2, то условие больше не выполняется,
и цикл d o . . . w h i l e заканчивается.
Цикл for
Оператор цикла f o r используется, когда известно, сколько раз
необходимо выполнить оператор или последовательность операторов.
В связи с этим цикл f o r называют точным циклом.
Базовый синтаксис цикла f o r показан ниже.
for (инициализация; условие; шаг цикла) {
выполняемый код;
}
Оператор цикла f o r имеет три параметра. Первый параметр
используется для инициализации переменных, второй содержит
условие, а третий включает в себя приращения, требуемые для
реализации цикла. Блок кода, связанный с оператором f o r , заключается
в фигурные скобки ( { } ), если блок состоит из одного оператора, то
фигурные скобки не обязательны.
Следующий пример демонстрирует цикл f o r для 4-кратного вывода
сообщения " Д о б р о п о ж а л о в а т ь в ми р P H P " :
<?php
for ($counter=1; $counter < 5; $counter++) {
echo "Добро пожаловать в мир PHP!<br/>";
}
?>
В приведенном выше примере цикл f o r включает три параметра,
которые выполняют следующие задачи:
К.С. Флойд
Введение в программирование на PHP5
1. Переменная $ c o u n t e r инициализируется значением 1.
2. $ c o u n t e r
<
5 определяет условие, которое должно
выполняться для выполнения цикла.
3. $ c o u n t e r + + увеличивает значение переменной $ c o u n t e r при
каждом выполнении цикла.
Ниже показан вывод, созданный этим примером цикла.
Добро
Добро
Добро
Добро
пожаловать
пожаловать
пожаловать
пожаловать
в
в
в
в
мир
мир
мир
мир
PHP!
PHP!
PHP!
PHP!
При первом выполнении переменная $ c o u n t e r инициализируется
значением 1. Так как 1 меньше 5, $ c o u n t e r увеличивается на 1. Затем
используется оператор
echo
для вывода строки
"Добро
п о ж а л о в а т ь в ми р P H P ! " . К выводу присоединяется < b r / > ,
чтобы создавать возврат каретки при каждом выполнении цикла. Во
время второй итерации значение $ c o u n t e r будет равно 2. Так как 2
меньше 5, то оператор e c h o снова выводит строку " Д о б р о
п о ж а л о в а т ь в ми р P H P ! " . Этот процесс продолжается при
значениях $ c o u n t e r , равных 3 и 4. Когда $ c o u n t e r становится
равным 5, условие больше не выполняется, и цикл f o r заканчивается.
Циклы f o r используются также в качестве удобного способа
выполнения итераций по значениям массива. Вспомните, что массивы
состоят из элементов и индексов. Каждый элемент имеет связанный с
ним индекс. Первый индекс массива с числовыми индексами равен 0.
До сих пор при выводе элементов массива требовалось выводить
каждый элемент отдельно. Для больших массивов это может
потребовать много времени и оказаться громоздким. Циклы f o r
решают эту проблему. В следующем примере создается массив с 5
элементами. Затем применяется цикл f o r для вывода всех значений
массива.
<?php
//Создается новый массив, содержащий 5 значений цвета
$colors = array('red', 'green', 'blue', 'yellow'/white');
// Цикл for используется для итераций по массиву и вывода каждого эле
for ($i = 0; $i < sizeof($cobrs); $i++)
{
echo "Значением элемента массива", $i+1,” является $cobrs[$i].".<br
}
?>
Массив $ c o l o r s содержит пять элементов — $ c o l o r s [ 0 ]
=
"red", $colors[1] = "green", $colors[2] = "blue",
$ c o l o r s [3]
= "yellow ",
и $colors[4]
= "w hite".
Создается цикл f o r . Переменной счетчику $ i сначала задается
значение 0, что соответствует первому элементу массива. Затем задается
условие,
проверяющее,
что значение
счетчика
$i
меньше
s i z e o f ( $ c o l o r s ) или общего числа элементов массива. Здесь мы
знаем, что размер массива равен 5, однако в большинстве случаев
размер массива во время выполнения неизвестен. Наконец, переменная
счетчика увеличивается на 1 во время каждой итерации. На каждом
шаге выполнения цикла выводится строка — " З н а ч е н и е м
элемента
массива
$i+1
является
$colors[$i]".
Значения $ i + 1 и $ c o l o r s [ $ i ] расширяются и создают при выводе
литеральные значения. Цикл выполняется, пока счетчик не превысит
число элементов или размер массива. Получаемый вывод показан ниже.
Значением
Значением
Значением
Значением
Значением
элемента
элемента
элемента
элемента
элемента
массива
массива
массива
массива
массива
1 является red.
2 является green.
3 является blue.
4 является yellow.
5 является white.
Циклы являются полезными конструкциями,
используются при программировании.
которые
активно
Цикл foreach
Конструкция f o r e a c h является вариацией цикла f o r и применяется
для итераций на массивах. Существуют две различные версии цикла
К.С. Флойд
foreach.
Базовый синтаксис обеих версий цикла f o r e a c h показан ниже.
foreach ($array as $value)
{
оператор
}
foreach ($array as $key => $value)
{
оператор
}
Первый тип цикла f o r e a c h используется для итераций по массиву,
обозначенному как $ a r r a y . Во время каждой итерации цикла текущее
значение массива присваивается переменной $ v a l u e , и счетчик цикла
увеличивается на единицу. Цикл продолжается, пока f o r e a c h не
достигнет последнего элемента или верхней границы заданного
массива. Во время каждой итерации значение переменной $ v a l u e
можно использовать любым способом, но исходное значение массива
не изменяется. Чтобы изменить реальное значение массива, необходимо
добавить символ " & " . Любые изменения, сделанные в & v a l u e , будут
присвоены элементу массива с текущим индексом.
Следующий пример демонстрирует, как цикл f o r e a c h применяется
для итераций по значениям массива.
<?php
$my_array = array('red','green','blue');
echo "Различные цвета включают: ”;
foreach($my_array as $value)
{
$colors = $value . " ";
echo $colors;
}
?>
Во время каждой итерации имя цвета, связанное с текущим элементом
К.С. Флойд
Введение в программирование на PHP5
массива, присваивается переменной $ c o l o r s . Также добавляется
одиночный пробел между соседними именами цветов для целей
вывода. Когда цикл достигает конца массива, создается следующий
вывод.
Различные цвета включают: red green blue
Вторая форма цикла обеспечивает такие же функции, что и первая, но
дополнительно присваивает на каждом шаге итерации индекс текущего
элемента массива или ключ переменной $ k e y . В предыдущем примере
массив $ m y _ a r r a y содержит три элемента: $ m y _ a r r a y [ 0 ]
=
"red",
$my_array[1] = "green", и $my_array[2] =
" b l u e " . В то время как переменная $ v a l u e содержит значения
элементов массива r e d , g r e e n и b l u e , переменная $ k e y содержит
индексы элементов массива 0, 1, и 2.
Возможность повторного использования существующего кода является
очень важной, так как может сберечь время, деньги, и способствовать
согласованности
Включаемые файлы
Возможность повторного использования существующего кода является
очень важной, так как может сберечь время и деньги и способствовать
согласованности. Предположим, что сайт Web содержит текстовое
меню, которое повторяется на каждой странице. Вместо повторного
кодирования меню будет значительно легче закодировать его один раз и
динамически включать содержимое меню на каждую из отдельных
страниц Web. Это можно сделать с помощью так называемых серверных
включаемых файлов.
Включаемые файлы могут содержать любой код XHTML или PHP и
обычно сохраняются с расширением . i n c , хотя можно использовать
также расширения . p h p , . t x t , или . h t m . Содержимое включаемого
файла кодируется один раз и включается в любое необходимое
количество страниц PHP. Если во включаемом файле делается
изменение, то обновление автоматически отражается на всех страницах
PHP, ссылающихся на включаемый файл.
Ниже показан пример типичного включаемого файла, содержащего
информацию о заголовке страницы.
Header.inc
<h3> Welcome to WebBooks.Com </h3>
Этот пример показывает включаемый файл с именем h e a d e r . i n c .
Файл содержит текст " W e l c o m e t o W e b B o o k s . C o m ” , окруженный
тегом XHTML < h 3 > . Он создает заголовок третьего уровня, который
можно теперь включать на все страницы, которые составляют сайт
WebBooks.
После создания включаемого файла, его можно включить в страницу
r e q u i r e (и м я _ ф а й л а ) - включает и проверяет указанный файл
i n c l u d e ( и м я _ ф а й л а ) - другой способ подключения файлов
В следующем примере файл h e a d e r . i n c включается в существующую
страницу PHP:
home.php
<?php
require('header.inc');
echo "<p>This is the WebBooks site...</p>";
?>
Функция r e q u i r e () вызывает файл h e a d e r . i n c и проверяет
содержимое файла. Содержимое затем выводится, как если бы оно было
частью страницы h o m e . p h p . В этом примере функция r e q u i r e ()
кодируется вверху страницы, так как она содержит информацию
заголовка. Оператор r e q u i r e ( ) можно, однако, включить в любом
месте документа PHP. Расположение функции r e q u i r e ( ) определяет,
где будет выводиться содержимое файла в контексте страницы PHP.
Welcome to WebBooks.Com
This is the WebBooks site...
Важно отметить, что при использовании включаемых файлов, которые
содержат конфиденциальную информацию, такую, как пароли или
информацию о пользователе, файлы должны сохраняться с
использованием расширения . p h p , а не . i n c или другого
нестандартного
расширения.
Файлы,
которые
применяют
нестандартные расширения файлов, могут загружаться с сервера Web, а
их содержимое можно
просматривать как обычный
текст.
Использование расширения . p h p гарантирует, что клиент не сможет
увидеть исходный код, сервер вернет только код XHTML.
Функции используются для разбиения больших блоков кода на меньшие,
более управляемые единицы. Содержащийся внутри функции код
выполняет определенную задачу и возвращает значение. PHP содержит
два типа функций - определенные пользователем (или созданные
программистом) и внутренние (встроенные функции), которые
являются частью определения языка PHP. Этот раздел посвящен
созданию и применению определенных пользователем функций.
Определенные пользователем функции создаются с помощью
ключевого слова f u n c t i o n . Они особенно полезны в больших
программах PHP, так как могут содержать блоки кода, которые могут
вызываться или использоваться в программе, что позволяет избежать
повторного переписывания кода. Далее представлен пример простой
определенной пользователем функции PHP:
function AddNumbers($num1,$num2)
{
echo 'Это пример функции PHP. Она вычисляет сумму двух чисел и
результат вызывающей программе";
return $num1 + $num2;
}
Определенные пользователем функции могут вызываться в любом
месте блока кода PHP. В PHP функция выполняется при использовании
в коде ее имени. После вызова функция получает все передаваемые ей
значения в форме параметров, выполняет определенные задачи и
возвращает значение вызывающей программе. Простой пример показан
ниже.
<?php
function AddNumbers($num1,$num2)
{
К.С. Флойд
Введение в программирование на PHP5
return $num1 + $num2;
}
echo "Сумма 5 и 2 равна ” . AddNumbers(5,2);
?>
Однако определенная в начале функция A d d N u m b e r s () вызывается
только позже в программе. Вызов функции происходит в операторе
e c h o . Выводится строка "С ум м а 5 и 2 р а в н а ” . Имя функции
соединяется со строкой вывода, вызывая тем самым функцию. Функции
передается два параметра — 5 и 2. Они присваиваются параметрам
функции $num1 и $ n u m 2 . Параметры складываются, и вызывается
оператор r e t u r n , чтобы "вернуть" значение или сумму двух чисел в то
место в блоке кода PHP, который первоначально вызвал функцию.
Вывод результата показан ниже:
Сумма 5 и 2 равна 7
Имена функций следуют тем же правилам, что и переменные в PHP.
Допустимые имена могут начинаться с буквы или подчеркивания, после
чего может следовать любое количество букв, цифр или подчеркиваний.
К.С. Флойд
Введение в программирование на PHP5
Базовая обработка форм
Обработка форм является очень важным свойством PHP. С помощью
форм пользователи взаимодействуют со страницами Web, и с их
помощью можно собирать информацию для персонализированных
страниц посетителей. В более широком смысле информационной
обработки, формы предназначены для ввода данных в системы
обработки. Они являются первичным механизмом получения данных,
которые обрабатывают сценарии для порождения новой информации,
обновления файлов и баз данных, и для ответа на запросы
пользователей для получения информации
Проектирование форм
Обработка форм является очень важным свойством PHP. С помощью
форм пользователи взаимодействуют со страницами Web, и с их же
помощью можно собирать информацию для персонализированных
страниц посетителей. В более широком смысле информационной
обработки, формы предназначены для ввода данных в системы
обработки. Они являются первичным механизмом получения данных,
которые обрабатывают сценарии для порождения новой информации,
обновления файлов и баз данных, а также для ответа на запросы
пользователей для получения информации.
В этом учебнике будут рассмотрены все аспекты обработки форм. У нас
будет возможность обсудить и продемонстрировать все элементы
управления или механизмы ввода данных, которые можно закодировать
в формах. Вполне вероятно, что большинство из них встречались вам во
время посещения Web: поля ввода текста, активные кнопки,
радиокнопки, флажки, раскрывающиеся меню и тому подобное. Все они
будут изучены в дальнейшем. Сейчас мы рассмотрим два
распространенных элемента управления - поля ввода текста и кнопки
отправки форм.
Пример приложения
Первым примером обработки форм является приложение регистрации.
К.С. Флойд
Введение в программирование на PHP5
В нем две страницы. Первая страница с именем " l o g i n . p h p "
содержит форму для отправки имени учетной записи и пароля.
Посетитель вводит эту информацию и щелкает на кнопке " S u b m i t " ,
чтобы отправить информацию формы для проверки.
login.php
Login Page
User Name: |"
Password: ]"
Submit
Вторая страница является страницей приветствия сайта с именем
" w e l c o m e . p h p " . Информация формы посылается на эту страницу
для проверки учетной записи и пароля. Если имя учетной записи и
пароль будут правильными, то страница становится доступной. Если
имя учетной записи или пароль будут неправильными, посетитель
возвращается на страницу l o g i n . p h p .
welcome.php
Welcome Page
Welcome to my PHP page
<html>
<body>
<Ь3>Страница регистрации </h3>
<form mme="Login" action=Velcome.php" method="post">
К.С. Флойд
Введение в программирование на PHP5
<table border="0">
<tr>
<td>User name: </td>
<td><input type="text" name="Account" size="10"></td>
</tr>
<tr>
<td>Password: </td>
<td><input type="password" name="Password" size="10"></td>
</tr>
</table>
<input type="submit" name="SubmitButton" value="Submit">
</form>
</body>
</html>
Элементы управления формы XHTML выводятся на странице Web при
кодировании их внутри тегов < f o r m > . . . < / f o r m > . Эти теги
окружают элементы управления формы, однако они не обязаны
окружать их "плотно". Другими словами, теги < f o r m > не обязаны
непосредственно предшествовать первому элементу управления и не
обязаны следовать сразу за последним элементом управления. Если
страница содержит одну форму, можно записать открывающий тег
< f o r m > сразу после тега < b o d y > , а закрывающий тег < / f o r m > —
непосредственно перед закрывающим тегом < / b o d y > . Затем элементы
управления могут появляться в теле документа вперемешку с другими
тегами HTML или текстом.
Тег < f o r m > содержит три важные для обработки форм атрибута.
Атрибут Na me . Все формы должны быть именованы. Хотя это не
требуется для текущего упражнения, стоит следовать такой привычке.
Имя формы потребуется, когда понадобится выполнить проверку
данных в браузере, что будет рассмотрено в оставшейся части этого
раздела. Формы именуют, записывая n a me = " Имя Фо р м ы" в теге
< f o r m > . Форме можно присвоить любое имя по желанию. В данном
примере используется n a m e = " L o g i n " .
Атрибут A c t i o n . Атрибут A c t i o n = " u r l " определяет расположение
К.С. Флойд
Введение в программирование на PHP5
и имя страницы, на которую посылается информация из формы для
обработки. Если страница, которая будет обрабатывать данные,
находится в том же каталоге, что и содержащая форму страница, то URL
в параметре A c t i o n является просто именем этой страницы. Иначе
это может быть полный URL, определяющий адрес Web на другом
сервере или в другом каталоге на том же сервере. В рассматриваемом
примере имя учетной записи и пароль, введенные посетителем,
посылаются на страницу w e l c o m e . p h p в том же каталоге:
action="w elcom e.php".
Атрибут M e t h o d . Атрибут m e t h o d = " G E T | POST” определяет способ,
используемый для пересылки данных формы на страницу, где они будут
обрабатываться. Существует два метода на выбор.
• Метод GET является более старым способом пересылки данных. В
этом случае данные из формы присоединяются в конце URL
страницы, на которую посылаются данные (URL в атрибуте
a c t i o n ). Данные формы состоят из текстовой строки, которая
соединяется с URL с помощью знака вопроса (?). Вы могли видеть,
как это происходит, при посещении Web. Этот метод не является
предпочтительным при отправке данных формы, так как
существует ограничение на количество посылаемых символов, и
данные плохо защищены от постороннего взгляда, когда они
появляются в поле адреса URL в браузере. Мы будем в
дальнейшем в некоторых случаях использовать этот метод.
• Метод POST отчасти решает эти проблемы. Он посылает данные
формы на страницу a c t i o n как отдельный поток данных,
который не появляется в поле адреса браузера, кроме того, можно
посылать любое требуемое для обработки формы количество
символов. Если нет специальных причин, всегда используйте
метод POST. В этом примере применяется m e t h o d = " p o s t " .
Поля формы
Формы состоят из полей, или элементов управления формы, с помощью
которых пользователь вводит данные, делает выбор, и посылает
информацию. Способ сбора информации зависит от типа элемента
К.С. Флойд
Введение в программирование на PHP5
формы. Хотя в этом учебнике будут обсуждаться все типы элементов
формы, в данный момент мы рассмотрим только три типа, необходимые
для приложения регистрации. Это позволит хорошо понять общую
методику обработки форм, без дополнительных осложнений, связанных
с кодированием всех видов полей форм.
Поле A c c o u n t . Пример страницы содержит текстовое поле, в котором
пользователь вводит свое учетное имя. Это стандартное текстовое поле,
созданное с помощью тега < i n p u t t y p e = " t e x t " > с заданными
атрибутами n a me и s i z e .
<input type-text" name="Account" size="10">
Поле P a s s w o r d . Поле пароля имеет вид стандартного текстового поля
ввода; однако при вводе символов в поле, они выводятся как звездочки
(*) или маркеры, чтобы сохранить приватность вводимых данных. Поле
пароля создается с помощью тега < i n p u t t y p e = " p a s s w o r d " > .
Полю необходимо присвоить имя и изменить его размер, равный по
умолчанию 20 символам.
<input type-'password" name-Tassword" size="10">
В этом примере и для всех создаваемых форм необходимо не забывать
задавать имена для полей формы. Эти имена требуются при обработке
на сервере. Кроме того, можно управлять физическим размером полей,
задавая атрибут s i z e , и можно ограничить максимальное число
символов, допустимых для ввода, задавая атрибут m a x l e n g t h .
Кнопка S u b m i t . При щелчке на кнопке передачи s u b m i t
выполняется действие, определенное параметром ACTION тега
< f o r m > . Другими словами, щелчок на кнопке s u b m i t передает
данные из формы на указанную страницу. Кнопка s u b m i t создается с
помощью тега <INPUT T Y P E = " s u b m i t " > . Кроме того, необходимо
задать имя кнопки для ссылки в сценарии и присвоить значение,
которое служит в качестве метки, появляющейся на кнопке.
<input type="submit" name="SubmitButton" value="Submit">
После создания страница с формой готова к активации. Вспомните, что
К.С. Флойд
Введение в программирование на PHP5
эта форма передает информацию об имени учетной записи и пароле на
страницу w e l c o m e . p h p . Там эти значения проверяются, чтобы
разрешить доступ к странице. Если предоставлены неправильное имя
учетной записи и/или пароль, пользователя немедленно возвращают на
страницу l o g i n . p h p , не позволяя увидеть страницу w e l c o m e . p h p .
Работа с формами
Элементы управления формы XHTML позволяют пользователям
вводить данные и делать выбор и предоставляют механизм, с помощью
которого пользователи взаимодействуют со страницей Web. Форма
полезна в той мере, насколько она поддерживается сценарием
обработки, закодированным на странице Web, или программой,
выполняющейся на сервере Web. В данном учебнике рассматривается,
как PHP, подобно другим серверным языкам программирования,
взаимодействует с формами в ответ на ввод пользователя.
Введенные в форму данные посылаются на обработку, после щелчка на
кнопке формы s u b m i t (отправка), < i n p u t
type="subm it">.
Информация из полей формы передается затем на страницу,
определенную атрибутом ACTION тега < f o r m > . Когда запрос этого
URL и соответствующие данные формы прибывают на сервер,
вызывается указанная страница и данные передаются ей для обработки.
Пары имя/значение
Данные из формы передаются на сервер как последовательность пар
имя/значение. Это значит, что имя каждого элемента формы
(появляющееся в атрибуте NAME тега) связывается со значением этого
элемента (введеным или выбранным пользователем). Формат имя/
значение, используемый для передачи, имеет вид и м я = з н а ч е н и е .
Используется столько пар имя/значение, сколько имеется элементов
формы, и все пары соединяются с помощью символа амперсанда (&),
чтобы сформировать текстовую строку, имеющую следующий вид:
name1=value1&name2=value2&name3=value3....
К.С. Флойд
Введение в программирование на PHP5
Все символы-разделители, появляющиеся в именах или значениях,
заменяются символом плюс (+), чтобы создать неразрывную строку пар
имя/значение. Предположим, что пользователь ввел имя учетной
записи " m y a c c o u n t " и пароль " x y z z y " . Полученная строка пар
имя/значение, доставляемая на сервер, будет иметь вид:
Account=myaccount&Password=xyzzy&SubmitButton=Submit
Отметим, что передаются имена полей, кнопок и значения. Хотя здесь
они показаны в том же порядке, в котором элементы появляются в
форме, не гарантируется, что порядок, в котором пары имя/значение
приходят на сервер, будет таким же, как и на форме.
PHP имеет три типа переменных для работы с формами,
предназначенные для хранения и обработки ввода информации
пользователя в форму: $_GET, $ _ P O S T , и $_REQUEST. Вспомните из
раздела 3-2, что они являются в действительности ассоциативными
массивами значений.
Эти переменные называют также суперглобальными. Это означает
просто, что они доступны во всех областях действия сценария.
$_GET [ ] — ассоциативный массив, который содержит все значения,
передаваемые в сценарий с помощью метода формы GET.
$ _ POS T[ ] - ассоциативный массив, который содержит все значения,
передаваемые в сценарий с помощью метода формы POST.
$_REQUEST[ ] - ассоциативный массив, который содержит все
значения, передаваемые в сценарий с помощью методов POST и GET.
Следующий пример показывает типичную страницу XHTML с формой,
которая может обрабатываться с помощью PHP:
form_page.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitiona]//EN"
' http ://www.w3.org/TRxhtmll/DTD/xhtmUl-transitionaL dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmUang="en" lang="en">
К.С. Флойд
Введение в программирование на PHP5
<head>
<title>A Web Page </title >
</head>
<body>
<form action="process.php" method="post">
First Name: <input type="text" name="FName"/><br>
Last Name: <input type="text" name="LName"/><br>
City: <input type-text" name="City"/><br>
State: <input type="text" name="State"/><br>
<br>
Message: <textarea name="Message" cols="30" rows="5"></textarea>
<input type="submit" name="submit" value="Submit Data"/>
</form>
</body>
</html>
Ниже показана форма с введенными пользователем данными для
обработки:
Когда в приведенном выше примере нажимают кнопку отправки, все
введенные пользователем данные формы передаются для обработки на
страницу p r o c e s s . p h p . Так как эта форма использует метод POST,
все данные формы передаются с помощью переменной PHP $ _ P O S T .
Каждый элемент управления ввода уникальным образом определяется
значением, присвоенным его атрибуту name. Значение атрибута name
элемента управления формы становится значением индекса массива
$ _ P O S T . Страница формы f o r m _ p a g e . h t m передает данные с
помощью следующих переменных PHP $ _ P O S T :
$_POST["FName"j = John;
$_POST['LName'] = Smith;
$_POST["City"j = Atlanta;
$_POST["State"j = Georgia;
$_POST["Message"j = I like PHP;
Так как переменные PHP $ _ P O S T и $_GET используют значение,
связанное с атрибутом name элемента управления формы, важно, чтобы
всем элементам формы было присвоено уникальное значение n a me
(имя).
К.С. Флойд
Введение в программирование на PHP5
Приведенная выше страница формы XHTML обрабатывается
показанной ниже страницей p r o c e s s . p h p . Введенные в форму
данные передаются с помощью переменной $ _ P O S T в сценарий PHP,
который выводит информацию в окне браузера:
process.php
<?php
echo
echo
echo
echo
echo
echo
"Your First Name is: " . $_POST['FName"] . "<br/>";
"Your Last Name is: " . $_POST["LName"] . "<br/>";
"Your City is: " . $_POST["City"] . "<br/>";
"Your State is: " . $_POST["State"] . "<br/>";
"<br/>";
"Your Message is: " . $_POST['Message"];
?>
Сценарий PHP анализирует данные формы XHTML и применяет
оператор e c h o для вывода результатов в окне браузера.
Если вместо метода POST используется метод GET, < f o r m
m e t h o d = " g e t " a c t i o n = " p r o c e s s . p h p / > , то массив $ _ POS T
заменяется массивом $_GET. Можно также воспользоваться массивом
$_REQUEST. Этот массив можно применять для получения данных,
посланных с помощью метода POST или GET. Переменную REQUEST
можно использовать также с файлами C o o k i e s , что рассматривается в
дальнейшем.
В данном месте возникает естественный вопрос: что лучше
использовать при обработке форм в PHP — метод GET или POST. Хотя
оба метода определяют способ, которым информация формы передается
на страницу, заданную в атрибуте ACTION, рекомендуется применять
метод POST.
GET - информация из формы добавляется к URL атрибута ACTION,
создавая строку запроса. Если обработка формы не оказывает заметного
влияния на состояние мира, то методом формы может быть GET.
Многие запросы к базам данных не имеют видимого побочного эффекта
К.С. Флойд
Введение в программирование на PHP5
и являются идеальными для приложений с формами запроса.
POST — (рекомендуемый) информация из формы передается
отдельным потоком данных. Если служба, связанная с обработкой
формы, имеет побочные эффекты (например, модификация базы данных
или подписка на обслуживание), то должен использоваться метод
POST.
В предыдущем примере приложение обработки формы состоит из двух
отдельных страниц - страницы формы XHTML ( f o r m _ p a g e . h t m ) и
страницы PHP ( p r o c e s s . p h p ). Страница XHTML является
статической, содержащей только детали представления и не имеющей
кода. В противоположность этому страница PHP содержит только
сценарий для обработки данных формы и не имеет тегов XHTML или
деталей представления. Распространенной практикой при обработке
форм в PHP является разделение деталей представления и кода
обработки. В этом случае страницу сценария PHP можно создать таким
образом, что ее можно будет использовать повторно с множеством
страниц
форм
XHTML.
Повторное
использование
является
распространенной практикой программирования, которая позволяет
использовать код повторно в различных программах, сокращая тем
самым стоимость написания приложений.
Хотя разделение разметки XHTML и кода PHP является широко
используемой многими программистами практикой, можно также
объединять разметку и код PHP в одном файле PHP. Этот подход создает
только один файл, упрощая кодирование и процесс обнаружения
ошибок.
Следующий
пример
показывает
предыдущий
пример
(
f o r m _ p a g e . h t m и p r o c e s s . p h p ), объединенный на одной
странице PHP — f o r m _ p r o c e s s . p h p .
form_process.php
<?php
echo "Your First Name is: " . $_POST['FName"] . "<br/>";
echo "Your Last Name is: " . $_POST["LName"] . "<br/>";
К.С. Флойд
echo
echo
echo
echo
Введение в программирование на PHP5
"Your City is: " . $_POST["City"] . "<br/>";
"Your State is: " . $_POST["State"] . "<br/>";
"<br/>";
"Your Message is: " . $_POST["Message"];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitiona]//EN"
' http ://www.w3.org/TR/xhtm]1/DTD/xhtml11-transitionaL dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmUang="en" lang="en">
<head>
<title>A Web Page</title>
</head>
<body>
<form action="form_process.php" method="post">
First Name: <input type="text" name="FName"/>
Last Name: <input type="text" name="LName"/>
City:
<input type="text" name="City"/>
State: <input type="text" name="State"/>
Message: <textarea name="Message" cols="30" rows="5"></textarea>
<input type="submit" name="submit" value="Submit Data"/>
</form>
</body>
</html>
П рим ер 7 . 1 .
Блок кода PHP помещается вверху страницы. Кроме того, значение тега
формы ACTION изменяется на " f o r m _ p r o c e s s . p h p " . Теперь
страница будет отсылать к себе, а не к отдельной странице PHP.
Требуется еще один конечный шаг, чтобы новая страница работала
правильно. Взгляните на представленный ниже вывод созданной
страницы.
Здесь раздел формы XHTML выводится правильно. Однако блок кода
PHP был выполнен до отправки формы (или до того, как был сделан
щелчок на кнопке отправки). Это приводит к выводу строковых
значений в операторах e c h o при загрузке страницы. Присоединенные
значения $ _ P O S T [ ] отсутствуют, так как форма еще не была
отправлена. Решение этой проблемы состоит в запрете выполнения
блока кода PHP, пока форма не будет отправлена или пока не будет
сделан щелчок на кнопке s u b m i t . Это можно сделать с помощью
некоторой условной конструкции. Когда страница загружается, оператор
i f используется для определения, что была нажата кнопка s u b m i t в
форме i f ( $ _ P O S T [ ' s u b m i t ' ]
==
"Submit
D a t a ” ) . Это
условие будет выполняться только после того, как будет запущена
отправка формы в результате щелчка на кнопке s u b m i t . Предыдущая
страница показана ниже с оператором i f , проверяющим отправку
К.С. Флойд
Введение в программирование на PHP5
формы.
form_process.php
<?php
if ($_POST['submit'] == "Submit Data')
{
echo
echo
echo
echo
echo
echo
"Your First Name is: " . $_POST["FName"] . "<br/>";
"Your Last Name is: " . $_POST["LName"] . "<br/>";
"Your City is: " . $_POST["City"] . "<br/>";
"Your State is: " . $_POST["State"] . "<br/>";
"<br/>";
"Your Message is: " . $_POST["Message"];
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtmll/DTD/xhtmlll-transitional dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmllang="en" lang="en">
<head>
<title>A Web Page</title>
</head>
<body>
<form action="form_process.php" method="post">
First Name: <input type="text" name="FName"/>
Last Name: <input type="text" name="LName"/>
City:
<input type="text" name="City"/>
State: <input type="text" name="State"/>
Message: <textarea name="Message" cols="30" rows="5"></textarea>
<input type="submit" name="submit" value="Submit Data"/>
К.С. Флойд
Введение в программирование на PHP5
</form>
</body>
</html>
П рим ер 7 . 2 .
Теперь код раздела PHP страницы выводится только после того, как
условие ( $ _ P O S T [ ' s u b m i t ' ]
== " S u b m i t D a t a ” ) станет
истинно ( t r u e ), т.е. будет нажата кнопка s u b m i t и начнется процесс
отправки формы. По большей части, практика разделения PHP и XHTML
или их объединения является вопросом личных предпочтений.
Массив $_REQUEST
Массив PHP $ _ R e q u e s t предоставляет ценную помощь при сборе
передаваемой на сервер информации формы, помещая ее в структуру
для удобной обработки сценарием. Массив $ _ R e q u e s t перехватывает
строку имен/значений, разбирает строку на имена и соответствующие
значения и помещает эту информацию в ассоциативный массив,
индексированный соответствующими именами полей формы. PHP
предоставляет также массивы $ _ P O S T и $_GET, однако массив
$_REQUEST часто является лучшим выбором, особенно в ситуациях,
когда данные отправляются с удаленного сайта и неизвестно, какой
метод используется — GET или POST.
К.С. Флойд
Введение в программирование на PHP5
Когда значения данных оказываются в массиве $ _ R e q u e s t , их можно
легко использовать по их именам, применяя следующий синтаксис:
$_Request[TName']="John"
$_Request['LName']="Smith"
$_Request['City']="At]anta"
$_Request['State']="Georgia"
$_Request['Message']="I like PHP"
$_Request['submit']="Submit Data"
где именем является имя, связанное с полем в форме. Поэтому ссылка
$ _ R e q u e s t [ ’A c c o u n t ’ ] указывает на значение, введенное в поле
U s e r Name ; а ссылка $ _ R e q u e s t [ ’ S u b m i t B u t t o n ’ ] — на
значение, связанное с кнопкой S u b m i t . С точки зрения
программирования $ _ R e q u e s t [ ’ n a m e ’ ] работает как переменная
программы, которая указывает на значение, хранящееся в этой
переменной.
Итерации по массиву $_Request
С помощью цикла f o r e a c h можно выполнять итерации на массиве
$ _ R e q u e s t . Это предоставляет хороший способ отладки сценариев,
которые обрабатывают информацию формы, а также возможность
просмотреть имена полей и присланные значения, чтобы проверить,
что из формы была прислана правильная информация.
<?php
foreach($_REQUEST as $key => $value)
{
echo $key;
echo ": " .$value;
echo "<br/>";
}
?>
К.С. Флойд
Введение в программирование на PHP5
На каждом шаге цикла значение текущего элемента $_REQUEST
присваивается переменной $ v a l u e , а указатель массива сдвигается на
единицу. Текущий индекс массива присваивается на каждом шаге
переменной $ k e y .
Этот сценарий выводит имя каждого из полей ( I t e m ) формы вместе
со связанным значением, при этом каждая пара выводится на отдельной
строке. При использовании значений показанного выше примера вывод
этого сценария будет следующим:
FName: John
LName: Smith
City: Atlanta
State: Georgia
Message: I like PHP
submit: Submit Data
Просматривая этот вывод, можно убедиться, что ожидаемые данные
были присланы на страницу w e l c o m e . p h p перед реальной
обработкой правильно.
Проверка формы
При работе со страницами, которые включают обработку форм, часто
необходимо проверять вводимые пользователем данные.
PHP имеет много строковых и числовых функций, которые можно
использовать для проверки ввода пользователя. Часть строковых
функций, применяемых здесь, обсуждаются также в разделе 3-6.
Наиболее часто используемые функции представлены ниже:
is_string(string)
- определяет, является ли переменная
s t r i n g строкой. Возвращает значение t r u e или f a l s e .
is_int(string)
или i s _ i n t e g e r ( s t r i n g )
- определяет,
является ли переменная s t r i n g целым числом. Возвращает значение
t r u e или f a l s e .
is_num eric(string)
-
определяет,
является
ли
переменная
К.С. Флойд
Введение в программирование на PHP5
s t r i n g числовой строкой. Возвращает значение t r u e или f a l s e .
i s _ d o u b l e ( s t r i n g ) или i s _ f l o a t ( s t r i n g ) - определяет,
является ли переменная s t r i n g числом с плавающей точкой.
Возвращает значение t r u e или f a l s e
s t r l e n ( s t r i n g ) - возвращает длину строки s t r i n g .
s t r p b r k ( s t r i n g l , s t r i n g 2 ) - ищет в строке s t r i n g l символ
из строки s t r i n g 2 , возвращает строку, начинающуюся с найденного
символа (или FALSE, если ничего не найдено).
strtolow er(string)
- преобразует строку,
переменной s t r i n g , в символы нижнего регистра.
хранящуюся
в
strtoupper(string)
— преобразует строку,
переменной s t r i n g , в символы верхнего регистра.
хранящуюся
в
Рассмотрим следующую страницу с формой XHTML:
* * E n t e r Na me
E n ter user name
amyPHP
E n ter passw ord
|(must be at lea st 4 ch a ra c te rs)
Submit
in d icates required field
Эта страница формы требует, чтобы пользователь ввел имя, имя
учетной записи (имя пользователя) и пароль длиной не менее 4
символов, прежде чем происходит обработка формы. Такой тип
проверки формы является важным, так как он помогает гарантировать,
что ввод пользователя имеет правильный формат, который можно
записать в базу данных, — текстовый файл, используемый для создания
сообщения e-mail или для повторного вывода пользователю. Однако
один XHTML не может выполнить проверку такого типа. Этот процесс
выполняется с помощью перечисленных выше строковых и числовых
функций PHP.
К.С. Флойд
Введение в программирование на PHP5
Отправка формы становится теперь трехшаговым процессом.
1. Ввод данных формы и щелчок на кнопке отправки.
2. Проверка ввода с помощью функций PHP.
3. Обработка (запись в файл, генерация автоматического сообщения
e-mail или воспроизведение ввода на экране) данных с помощью
PHP.
Следующий сценарий демонстрирует этот процесс.
<?php
//Проверка, была ли нажата кнопка отправки. Если да, начинается пров
if(isset($_POST['submitB'])) {
//Проверяет, что было введено в поле name
$valid_form = true;
if ($_POST['name'] == "")
{
echo "Введите свое имя";
$valid_form = false;
}
else
{
$name = $_POST['name'];
}
if ($_PO ST['uname'] == "")
{
echo "Введите имя пользователя";
$valid_form = false;
}
else
{
$username = $_POST['uname'];
}
if ($_POST['pass'] == "")
{
echo "Введите пароль";
$valid_form = false;
}
elseif (strlen($_POST['pass']) < 4)
{
echo "Пароль должен содержать не менее 4 символов";
$valid_form = false;
}
else
{
$password = $_POST['pass'];
}
//если все поля формы были введены правильно, начинаем об
if($valid_form == true)
{
//код обработки формы находится здесь
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11-transitiomL dtd">
<html xmlns='http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>A Web Page</title>
</head>
<form method="post" action='http://.„form_va]idate.php7>
Enter Name: <input type="text" name="name"/>
Enter user name: <input type="text" name="uname"/>
Enter Password (must contain at least 4 characters): <input type="password" nar
<input type="submit" name="submitB" va]ue="Submit"/>
</form>
</body>
</htm]>
П рим ер 7 . 3 .
Когда нажимается кнопка отправки, применяется последовательность
операторов для проверки содержимого полей формы. Сначала
проверяется, что поле n a me не NULL (значение $ _ POS T[ ' n a me ' ] ).
Если $ _ POS T[ ' n a me ' ] содержит значение NULL, это указывает, что
пользователь не ввел имя в поле ' n a m e ' . Оператор e c h o
используется для вывода пользователю сообщения об ошибке. Если
$_POST [ ' n a m e ' ]
содержит значение, то оно присваивается
скалярной переменной $ n a m e , которая может использоваться позже в
программе, когда начнется обработка данных. Затем проверяется поле
' u s e r n a m e ' с помощью того же метода, который применялся для
проверки поля ' n a me ' . Если имя пользователя не введено, выводится
сообщение об ошибке. Иначе значение присваивается скалярной
переменной $ u s e r n a m e . Наконец, проверяется поле пароля
' p a s s w o r d ' . Проверка пароля является двухшаговым процессом: 1)
проверяется, что пароль был введен, и 2) если пароль был введен,
проверяется, что он содержит не меньше 4 символов. Первый оператор
i f проверяет, что пароль был введен. Оператор e l s e i f (который
выполняется, только если предыдущий оператор i f будет оцениваться
как f a l s e ) проверяет введенный пароль с помощью функции
s t r l e n () . Эта функция возвращает длину пароля. Полученная длина
сравнивается с числом 4. Если значение меньше 4, выводится ошибка.
Иначе длина пароля будет допустима, и он присваивается скалярной
переменной $ p a s s w o r d .
Если все поля формы содержат допустимые данные, можно начинать
К.С. Флойд
Введение в программирование на PHP5
обработку формы. Можно задать флаг, чтобы помочь в отслеживании
проверки. Сначала флаг задается ( $ v a l i d _ f o r m = t r u e ) в начале
блока кода. Если какое-то из полей формы не содержит допустимые
данные, то флагу присваивается значение f a l s e ( $ v a l i d _ f o r m ).
После проверки всех полей формы применяется финальный оператор
i f для проверки статуса флага ( $ v a l i d _ f o r m ). Если значение
$ v a l i d _ f o r m будет t r u e (все поля формы содержат допустимые
данные), можно начинать обработку формы, иначе блок обработки
формы пропускается. Пользователь получает сообщение об ошибке,
возникшей во время процесса проверки, и может начинать делать
исправления.
Контрольный вывод введенных значений формы
Когда страница формы PHP отправляется на сервер, все значения полей
формы посылаются сценарию PHP с помощью метода формы g e t или
p o s t . Когда страница формы выводится снова, все поля формы будут
пустыми, независимо от того, будут или нет значения допустимыми.
Это происходит, потому что сервер извлекает новый экземпляр
страницы PHP и посылает его браузеру. Однако пользователю было бы
удобно, чтобы при повторном выводе формы ее поля были заполнены
отправленной ранее информацией. В этом случае пользователю нужно
будет только исправить ошибочные данные, а не заново вводить
значения во все поля. Это не является проблемой для формы с двумя
полями, однако будет крайне неудобно для формы с большим числом
полей.
Когда страница формы отправляется и сервер извлекает новый
экземпляр страницы PHP и посылает браузеру, значения полей формы
могут динамически обновляться, так, чтобы поля не возвращались
К.С. Флойд
Введение в программирование на PHP5
пустыми. В этом случае пользователю будет удобнее просто обновить
поля, содержащие ошибки, а не все поля формы.
Вспомните, что значения полей посланной формы хранятся в
суперглобальных переменных $ _ P O S T или $_GET. В предыдущем
примере имя пользователя хранится в переменной массива
$ _ P O S T [ ' F N a m e ' ] , а фамилия — в переменной массива
$ _ POS T[ ' L N a m e ' ] . Поэтому вывод значений полей формы можно
выполнить, присваивая атрибутам ' v a l u e ' полей формы с помощью
кода PHP значения, содержащиеся в массиве. Следующий код
демонстрирует такой подход.
process.php
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitiona]//EN"
' http ://www.w3.org/TR/xhtmll/DTD/xhtmlll-transitionaL dtd">
<html xm]ns='http://www.w3.org/1999/xhtml" xmUang="en" lang="en">
<head>
<Ше>Страница Web </title>
</head>
<body>
<form action="process.php" method="post">
First Name: <input type="text" name="FName" value="<?php echo $_POST['FI
Last Name: <input type="text" name="LName" value="<?php echo $_POST['LI
<input type="submit" name="submit" value="Submit Data"/>
</form>
</body>
</html>
Отметим, что значения текстовых полей F i r s t Name и L a s t
обновлены, чтобы включить следующий код PHP:
Name
К.С. Флойд
Введение в программирование на PHP5
<?php echo $_POST['FName']?>
<?php echo $_POST['LName']?>
Когда этот код присваивается атрибуту ' v a l u e ' , он снова выводит
значения, введенные ранее пользователем. Когда страница загружается
в первый раз, значения переменных POST будут NULL, а v a l u e =
Атрибут v a l u e содержит значение только после того, как была
нажата кнопка s u b m i t .
Повторный вывод полей формы является полезным приемом, который
будет активно использоваться в последующих разделах.
К.С. Флойд
Введение в программирование на PHP5
Сеансы
Переменная сеанса является специальным типом переменной, значение
которой сохраняется при переходе между последовательными
страницами Web. C помощью переменных сеанса специфические
данные пользователя можно сохранять при переходе со страницы на
страницу, предоставляя ему индивидуализированный контент при
взаимодействии пользователя с приложением Web
Сеансы
Переменная сеанса является специальным типом переменной, значение
которой сохраняется при переходе между последовательными
страницами Web. C помощью переменных сеанса специфические
данные пользователя можно сохранять при переходе со страницы на
страницу, предоставляя ему индивидуализированный контент при
взаимодействии пользователя с приложением Web. Переменные сеанса
существуют обычно, пока не выполняется одно из следующих событий:
1. пользователь закрывает окно браузера;
2. завершение заданного на сервере максимального интервала
времени сеанса;
3. использование функций PHP, таких, как s e s s i o n _ d e s t r o y ( ) ,
чтобы освободить все существующие в данный момент
переменные сеанса.
Проблема, которую должны решить переменные сеанса, состоит в том,
что протокол HTTP, используемый в Web, не имеет состояния. Каждый
запрос страницы совершенно независим от предыдущих запросов,
поэтому, если требуется, чтобы последующие страницы "запоминали"
имя пользователя, которое он вводит на первой странице, то эту
информацию надо где-то сохранить.
Система PHP имеет ряд средств для поддержки сеансов. Это
руководство
начинается
с введения
глобальной
переменной
$_SESSION[].
Переменную
$_SESSION[]
рекомендуется
использовать для улучшения безопасности и удобочитаемости кода.
К.С. Флойд
Введение в программирование на PHP5
Также
вводятся
функции
сеанса
s e s s i o n _ s t a r t ()
s e s s i o n _ d e s t r o y () . Каждая из них определена ниже:
и
$ _ S E S S I O N [ ] - суперглобальный массив PHP, который содержит
зарегистрированные в данный момент переменные сеанса сценария.
s e s s i o n _ s t a r t ( ) - инициализация данных сеанса. Эта функция
вызывается перед созданием новой переменной сеанса с помощью
$ _ S E S S I O N [] .
s e s s i o n _ d e s t r o y () - разрушает все данные, зарегистрированные
для текущего сеанса сценария
В учебнике вводится также функция PHP h e a d e r ( " L o c a t i o n ..." ) .
Хотя это функция HTTP, а не функция сеанса, она обычно используется
для перенаправления пользователей во время существующих сеансов.
Эта функция определена ниже.
h e a d e r ( " L o c a t i o n : h t t p : / / w w w . d o m a i n . c o m ") -ф у н к ц и я
h e a d e r используется для перенаправления браузера на страницу,
определенную параметром L o c a t i o n .
Следующий блок
переменная сеанса.
кода
демонстрирует,
как
<?php
session_start();
if ($_SESSION['count'] == "")
{
$_SESSION['count'] = 1;
}
else
{
$_SESSION['count'] = $_SESSION['count'] + 1;
инициализируется
К.С. Флойд
Введение в программирование на PHP5
}
?>
В этом примере сначала вызывается функция s e s s i o n _ s t a r t () для
инициализации данных сеанса. Функция s e s s i o n _ s t a r t () должна
вызываться перед созданием и присваиванием значений переменным
сеанса. Затем используется оператор i f для проверки значения
переменной сеанса " c o u n t " . Если сеанс будет n u l l или не содержит
значения, то он инициализируется как 1, иначе значение переменной
сеанса увеличивается на 1. В этом случае переменная сеанса c o u n t
используется для подсчета числа посетителей. Переменные сеанса
предоставляют идеальный способ создания счетчиков страниц, так как
каждому пользователю предоставляется уникальный сеанс.
Переменная сеанса может создаваться также после успешного ввода
пользователем своего имени и пароля, которые нужны для доступа к
конфиденциальному сайту. В этом случае переменная сеанса содержит
значение, которое передается со страницы на страницу, указывая, что
пользователь имеет право доступа к любым ресурсам, связанным с
сайтом. Когда пользователь выходит или решает "завершить",
переменная сеанса должна возвращаться в исходное состояние. Это
выполняется с помощью функции s e s s i o n _ d e s t r o y () .
login.php
<?php
if ($_PO ST['submit'] == "Login")
{
// сценарий проверки имени пользователя и пароля должен кодирс
//если аутентификация прошла успешно
session_start();
$_SESSION['access'] = "yes";
header("Location:access.php");
}
if ($_PO ST['submit'] == "Log Out")
К.С. Флойд
Введение в программирование на PHP5
{
//если пользователь решает выйти
session_destroyO;
}
?>
access.php
<?php
// если пользователь обращается к этой странице,
// проверьте, что он был аутентифицирован в login.php
if ($_SESSION['access'] != "yes')
{
header(Location:login.php);
}
?>
П рим ер 8 . 1 .
Пример выше состоит из двух страниц — l o g i n . p h p
и
a c c e s s . p h p . Прежде чем пользователь сможет увидеть содержимое
a c c e s s . p h p , он должен пройти l o g i n . p h p . Создается сеанс, чтобы
гарантировать, что пользователь был аутентифицирован. После того как
пользователь вводит действительное имя пользователя и пароль,
выполняется щелчок на кнопке " L o g i n " . Сценарий PHP проверяет,
что пароль и имя пользователя допустимы. Затем переменной сеанса
присваивается
значение
"yes"
и
доступ
предоставляется.
Пользователь перенаправляется на страницу a c c e s s . p h p . Сценарий
на a c c e s s . p h p проверяет, что существует сеанс. Если сеанс не
существует, применяется функция h e a d e r ( ) , чтобы перенаправить
пользователя назад на страницу l o g i n . p h p и не разрешить доступ к
содержимому страницы a c c e s s . p h p .
К.С. Флойд
Введение в программирование на PHP5
Страница
login.php
содержит второй сценарий, который
используется для уничтожения переменной сеанса, вызывая функцию
s e s s i o n _ d e s t r o y ( ) . Сценарий выполняется после того, как
пользователь щелкает на кнопке " L o g O u t ” .
Приложения Web, которые используют данные сеанса, могут быть
доступны одновременно множеству пользователей. Чтобы каждый
пользователь имел свой собственный сеанс, с каждым сеансом
необходимо связать уникальное значение i d . В PHP это уникальное
значение сеанса i d
можно извлечь с помощью функции
s e s s i o n _ i d ( ) . Уникальное значение сеанса s e s s i o n _ i d ( )
поддерживается для каждого пользователя и хранится в подкаталоге
P H P / s e s s i o n d a t a , расположенном на сервере Web.
Так как значение s e s s i o n _ i d () является уникальным для каждого
пользователя, его можно применять для идентификации пользователей,
не создавая при этом индивидуальных имен пользователей и паролей.
Функция s e s s i o n _ i d () определена ниже:
session_id()
сеанса.
- используется для получения значения id текущего
Файлы Cookies
Файл c o o k i e является сообщением от браузера Web-серверу. Браузер
сохраняет сообщение в текстовом файле. Это сообщение посылается
затем назад на сервер каждый раз, когда браузер запрашивает страницу с
сервера.
Основное
назначение
cookies
состоит
в
идентификации
пользователей и возможной подготовке специально настроенной для
них страницы Web. При посещении сайта Web, использующего
c o o k i e s , на сайте может быть предложено заполнить форму, чтобы
предоставить такую информацию, как свое имя и возможные интересы.
Эта информация упаковывается в c o o k i e и посылается браузеру Web,
который сохраняет ее для последующего использования. Когда вы в
следующий раз посещаете тот же самый сайт Web, браузер пошлет
c o o k i e серверу Web. Сервер может использовать эту информацию,
К.С. Флойд
Введение в программирование на PHP5
чтобы создать индивидуализированные страницы Web. Поэтому,
например, вместо обычной приветственной страницы можно увидеть
приветственную страницу со своим именем.
В PHP файлы c o o k i e s создают с помощью функции s e t c o o k i e () .
Все данные c o o k i e хранятся в глобальной переменной PHP
$_COOKIE и доступны для последующих страниц.
setcookie(nam e,value,expiration,path,dom ain,securi
- определяет файл c o o k i e , который посылается вместе с остальными
заголовками HTTP. Как и другие заголовки, файлы c o o k i e должны
посылаться до какого-либо вывода работы сценария (это ограничение
протокола). Поэтому требуется, чтобы обращение к функции было
помещено до любого вывода, включая теги и любые символы
разделители. Если вывод происходит до обращения к этой функции, то
s e t c o o k i e () не выполнится и вернет FALSE. Если s e t c o o k i e ()
выполняется успешно, то возвращается TRUE. Это не указывает на то,
что пользователь принял c o o k i e .
Параметры setcookie() объясняются в следующей таблице.
Параметр
Описание
n a me
Имя c o o k i e . Этот идентификатор хранится в
глобальной переменной $ COOKIE и доступен в
последующих сценариях
value
Значение c o o k i e . Значение, связанное с
идентификатором c o o k i e . Хранится на компьютере
пользователя, поэтому не должно содержать секретной
информации
Время, когда истекает значение c o o k i e или становится
более недоступным. Это время можно задать с
e x p i r a t i o n помощью функции t i m e () . Файлы c o o k i e без
заданного значения времени истечения завершают свое
существование при закрытии браузера
path
Указывает пути доступа на сервере, для которых
c o o k i e действителен или доступен. Прямая косая
черта "/" говорит, что c o o k i e доступен во всех папках
105
К.С. Флойд
Введение в программирование на PHP5
domain
Домен, в котором доступен c o o k i e . Если домен не
определен, по умолчанию используется хост, на котором
создан c o o k i e . Значения d o m a i n должны содержать
в строке как минимум две точки ".", чтобы быть
допустимыми
security
Указывает, будет ли c o o k i e передаваться через HTTPS.
Значение 1 означает, что c o o k i e передается через
защищенное соединение. Значение 0 обозначает
стандартную передачу HTTP
Следующий пример демонстрирует, как c o o k i e используется для
сохранения имени пользователя посетителя. Вначале требуется ввести
имя пользователя, чтобы получить доступ к ограниченному сайту. Когда
имя пользователя будет создано, c o o k i e , содержащий его, сохраняется
на компьютере пользователя. Доступ в будущем возможен при
извлечении c o o k i e с компьютера пользователя.
<?php
if ($_REQUEST[auth] == "no")
{
$msg = "Вы не являетесь пользователем. Зарегистрируйтесь.";
}
// Если пользователь щелкает на кнопке Login, создается cookie,
К.С. Флойд
Введение в программирование на PHP5
// содержащий его имя пользователя и IP-адрес
if ($_POST[submit] == 'Login')
{
$cookie_name = "user";
$cookie_value = $_POST[uname];
$cookie_expire = time() + 14400;
setcookie($cookie_name,$cookie_value,$cookie_expire,"/');
$formDisplay = "no";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHMTL 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml1 -transitional. dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Страница Web </title>
<style type="text/css">
body {font:10pt arial;color:white}
div#form {background-color:gray;border:solid 1px black;padding:10px}
input {border:solid 2px black}
</style>
<?php
if ($formDisplay == "no")
{
?>
К.С. Флойд
Введение в программирование на PHP5
<meta http-equiv='refresh' content-0;uri=siteaccess.php?auth=yesV>
<?php
}
?>
</head>
<body>
<div id="form">
<h4 style="color:red">New User? Create User Name</h4>
<form action="setcookie.php" method="post">
<p>User Name:
<br/>
<input type="text" name="uname" size="7"/>
</p>
<input type="submit" value="Login" name="submit"/>
</form>
<h4 style="color:red">Existing User?
<a style="cobrwhite" href="siteaccess.php?auth=yes">Enter Site</a></h4>
</div>
<br/>
<br/>
<?php
echo "<span style='color:red'>" . $msg . "</span>";
К.С. Флойд
Введение в программирование на PHP5
?>
</body>
</html>
П рим ер 8 . 2 .
Ф айл s e t c o o k ie .p h p
siteaccess.php
<?php
// Если пользователь щелкает на кнопке Login,
// создается cookie, содержащий его имя пользователя и IP-адрес
if ($_REQUEST[auth] == "yes" && $_REQUEST[user])
{
echo "Добро пожаловать " . " " . $_COOKIE[user] . " на сайт с ограниче:
Теперь на вашем жестком диске хранится cookie,
и вы можете обращаться к этому сайту без регистрации при каждом об
}
else
{
header("Location:setcookie.php?auth=no");
}
?>
П рим ер 8 . 3 .
К.С. Флойд
Введение в программирование на PHP5
Доступ к базам данных
PHP обеспечивает поддержку ODBC (Open DataBase Connectivity), что
позволяет обращаться к любой совместимой с ODBC системе
управления базами данных (СУБД), если в системе или сети доступно
Имя источника данных (DSN -- Data Source Name), или доступна строка
соединения без DSN
Доступ ODBC
PHP обеспечивает поддержку ODBC (Open DataBase Connectivity), что
позволяет обращаться к любой совместимой с ODBC системе
управления базами данных (СУБД), если в системе или сети доступно
Имя источника данных (DSN — Data Source Name) или доступна строка
соединения без DSN. Это включает доступ к таким реляционным базам
данных, как Oracle, DB2, MS SQL Server, MySQL, и MS Access. Так как
PHP включает функции доступа к базам данных MySQL без DSN,
которые не требуют ODBC, в этом разделе для демонстрации методов
ODBC будет применяться MS Access. Примеры можно использовать
также с другими СУБД, совместимыми с ODBC.
Соединения ODBC с помощью DSN
Чтобы соединиться с базой данных, используя ODBC,
необходимо создать системное имя источника данных.
сначала
Вот как создается соединение ODBC с базой данных MS Access
Откройте в Панели управления значок Администрирование.
Сделайте в раскрывшемся окне двойной щелчок на значке Источники
данных (ODBC).
Выберите вкладку Системный DSN.
На вкладке Системный DSN щелкните на кнопке Добавить.
Выберите Microsoft Access Driver. Щелкните на кнопке Готово.
К.С. Флойд
Введение в программирование на PHP5
В следующем окне щелкните на кнопке Выбрать, чтобы найти базу
данных.
Задайте для базы данных Имя источника данных (DSN).
Щелкните на кнопке OK.
Конфигурация DSN должна задаваться на компьютере, на котором
размещен сайт Web. Если сайт располагается на удаленном сервере,
необходимо задать конфигурацию на этом сервере.
После установления соединения ODBC можно использовать
специальные функции PHP для соединения с базой данных и
извлечения записей. Эти функции PHP описаны ниже.
Соединения ODBC без DSN
Соединения без DSN не требуют создания DSN системного уровня для
соединения с базами данных и предоставляет некоторую альтернативу
DSN. Вместо использования DSN для соединения с базой данных,
разработчик
определяет необходимую
информацию
прямо
в
приложении. При соединении без DSN разработчик может
использовать стандарты соединения, отличные от ODBC, такие, как
OLE DB. Соединения без DSN должны применяться в том случае, когда
отсутствует доступ к серверу для регистрации DSN.
В Microsoft Access для создания соединений без DSN используется
следующая строка соединения:
Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb
o d b c _ co n n ect(dsn/строка
соединения
без
d s n , и м я _ п о л ь з о в а т е л я , п а р о л ь ) - функция, используемая для
соединения с источником данных ODBC. Функция получает четыре
параметра: имя источника данных ( d s n ) или строку соединения без
d s n , имя пользователя, пароль и необязательный тип курсора. В тех
случаях, когда имя пользователя, пароль, и тип курсора не требуются,
параметры можно заменить пустой строкой — ' ' . i d соединения,
К.С. Флойд
Введение в программирование на PHP5
возвращаемый этой функцией, требуется другим функциям ODBC.
Можно иметь одновременно открытыми несколько соединений, если
они либо имеют различные i d , либо используют различные имя
пользователя и пароль.
odbc_exec(id_соединения,
строка_запроса
SQL)
функция, используемая для выполнения оператора SQL. Функция
получает два параметра: объект соединения i d , созданный функцией
o d b c _ c o n n e c t ( ) , и оператор SQL. При возникновении ошибки
возвращает FALSE. Возвращает множество записей, если команда SQL
выполняется успешно.
o d b c _ f e t c h _ a r r a y ( M M H м н о ж е с т в а з а п и с е й ) - используется
для извлечения записей или строк из множества записей как
ассоциативного массива. Имя множества записей создается при вызове
функции o d b c _ e x e c () . Эта функция возвращает массив строк, либо
— FALSE.
o d b c _ n u m _ r o w s ( имя
множества
з а п и с е й ) - возвращает
число строк в множестве результатов ODBC. Функция возвращает -1,
если возникает ошибка. Для операторов INSERT, UPDATE и DELETE
функция o d b c _ n u m _ r o w s () возвращает число затронутых строк. Для
предложения SELECT это может быть число доступных строк.
Примечание: использование o d b c _ n u m _ r o w s () для определения
числа доступных строк после оператора SELECT возвращает -1 для
драйверов MS Access.
odbc_close(id
соединения)
сервером базы данных, связанное
соединения.
с
закрывает соединение с
данным идентификатором
Добавление записей
Применяя функции ODBC, рассмотренные в предыдущем разделе,
вместе с языком SQL можно добавлять записи в таблицы базы данных.
Записи добавляют в таблицу базы данных с помощью формы,
представляющей поля ввода данных. Затем с помощью кнопки
вызывается сценарий PHP для записи новой информации в таблицу с
К.С. Флойд
Введение в программирование на PHP5
помощью команды SQL I NSERT. Типичная форма ввода
добавления новой записи в таблицу S u r v e y показана ниже.
для
Name — 'Name', Email — 'Email',
Web Connection — 'Connection',
Residence (City/ST/Country) — 'Residence',
Age — 'Age', Gender — 'Gender',
Comments — 'Comments'.
Прежде чем переходить к коду, покажем синтаксис оператора SQL
I NSERT:
INSERT INTO TableName (FieldName! [,FieldName2]...) VALUES (Value1 [
К.С. Флойд
Введение в программирование на PHP5
Более подробно оператор INSERT рассматривается в разделе 10-1.
Следующий код применяется
V isitorSurvey.php:
для
обработки
данных
формы
VisitorSurvey.php
<?php
if ($_POST[submit] == "Submit')
{
// Получение данных формы и присвоение скалярным переменным
$Name = $_POST[Name];
$Email = $_POST[Email];
$Connection = $_POST[Connection];
$Residence = $_POST[Residence];
$Age = $_POST[Age];
$Gender = $_POST[Gender];
$Comments = $_POST[Comments];
//Установление соединения с базой данных
$conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\p,
// Оператор SQL
$sqlstring = "INSERT INTO Survey " .
"(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('3
'$Residence', '$Age', '$Gender', '$Comments')";
//Выполнение оператора SQL и сохранение результатов в множестве за
$rs = odbc_exec($conn,$sqlstring);
odbc_close($conn);
}
?>
П рим ер 9 . 1 .
После щелчка на кнопке отправки создается суперглобальный массив
$ _ P OS T , содержащий
значения
формы.
Значения
массива
присваиваются скалярным переменным. Это упрощает кодирование
оператора SQL. Затем выполняется оператор o d b c _ c o n n e c t () .
Этому оператору требуется три параметра - DSN или строка
соединения без DSN, имя пользователя и пароль. Здесь для соединения
с базой данных Access используется строка соединения без DSN. Так как
Access для доступа к данным не требует имя пользователя или пароль,
то параметры u s e r n a m e и p a s s w o r d кодируются как значения NULL.
Ссылка на соединение сохраняется в переменной $ c o n n . Это пример
ссылочной переменной PHP.
В отличие от скаляров или переменных массивов, ссылочные
переменные не применяются в программе непосредственно, но часто
используются в качестве параметров для других функций. После
оператора соединения составляется оператор SQL INSERT и
присваивается
переменной
$sqlstring.
Затем
функция
o d b c _ e x e c () выполняет оператор SQL, создающий множество
записей (множество записей из базы данных). Это множество записей
присваивается $ r s , другой ссылочной переменной PHP. Отметим, что
функция o d b c _ e x e c () требует два параметра — $ c o n n (ссылка на
текущее соединение базой данных) и $ s q l (ссылка на текущий
оператор SQL). В конце вызывается функция o d b c _ c l o s e ( ) для
закрытия текущего соединения с базой данных.
Для приложений такого типа обычно желательно выполнить проверку
данных, прежде чем добавлять данные в таблицу базы данных. Это
необходимо сделать перед тем, как создавать соединение с базой
данных, используя технику, рассмотренную в лекции 7.
В случае ошибки кодирования данные не заносятся в таблицу базы
данных, а PHP выводит предупреждение или сообщение об ошибке. В
ситуациях такого типа полезно подавить эти сообщения, добавить код
для проверки ошибок вручную и создать более понятный для
К.С. Флойд
Введение в программирование на PHP5
пользователя вывод. Это можно сделать сразу после оператора
o d b c _ e x e c ( ) , проверяя статус вновь созданного множества записей
— $rs.
Предположим в предыдущем коде, что функция o d b c _ e x e c ()
содержит вместо $ s q l параметр $ s q l S t r i n g . PHP немедленно
остановит выполнение страницы и выведет следующее сообщение:
Warning: odbc_exec() [functionodbc-exec]:
SQL error: [Microsoft][ODBC Microsoft Access Driver]
Invalid use of null pointer ,
SQL state S1009 in SQLExecDirect in
C:\ApacheRoot\VisitorSurvey.php on line 38
Ошибку PHP можно подавить с помощью оператора управления
ошибками "@". После подавления ошибки можно добавить код для
создания более понятного пользователю ответа. Такой подход показан
ниже:
VisitorSurvey.php
<?php
if ($_POST[submit] == "Submit")
{
//Извлечение данных формы и присвоение скалярным переменным
$Name = $_POST[Name];
$Email = $_POST[Email];
$Connection = $_POST[Connection];
$Residence = $_POST[Residence];
$Age = $_POST[Age];
$Gender = $_POST[Gender];
$Comments = $_POST[Comments];
//Установление соединения с базой данных
$conn = @odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c
//Оператор SQL
$sql = "INSERT INTO Survey " .
"(Name,Email,Conneclion,Residence,Age,Gender,Comments) VALUES ('3
'$Residence', '$Age', '$Gender', '$Comments')";
//Выполнение оператора SQL и сохранение результатов в множестве за
$rs = @odbc_exec($conn,$sqlstring);
if (!$rs)
{
echo "Произошла ошибка. Попробуйте еще раз. ";
}
else
{
echo "Запись была успешно добавлена.";
}
odbc_close($conn);
}
?>
П рим ер 9 . 2 .
После функции o d b c _ e x e c ( )
используется оператор i f для
проверки статуса множества записей — $ r s . Если множество записей
успешно создано, то выводится сообщение " З а п и с ь
бы ла
успешно
д о б а в л е н а " . Если возникает проблема, выводится
сообщ ение" П р о и зо ш л а о ш и б к а . П о п р о б у й т е еще р а з . "
К.С. Флойд
Введение в программирование на PHP5
Выбор записей
Кроме использования функций ODBC с оператором SQL INSERT для
добавления записей в базу данных, можно также извлекать записи из
таблицы базы данных с помощью оператора SQL SELECT. Типичная
форма ввода для выбора существующих записей из таблицы
D i r e c t o r y показана ниже. В этом примере фиктивная компания
Company XYZ, имеет онлайновую форму, которая позволяет
пользователям ввести фамилию сотрудника и найти имя и фамилию
сотрудника, номер телефона и адрес e-mail
Company XYZ Directory
Search
Оператор SQL SELECT показан ниже:
SELECT * | [DISTINCT] field1 [,field2]... FROM TableName WHERE criteria
ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...
Более подробное рассмотрение оператора SELECT дано в разделе 10.
Следующий
код
используется
D irectorySearch.php:
DirectorySearch. php
<?php
if ($_POST[submit] == "Search')
{
//Извлечение данных формы
$string = $_POST['SearchName'];
//Установление соединения с данными
для
обработки
формы
$conn = odbc_rannect('Drrver={Microsoft Access Driver (*.mdb)}; DBQ=c:\
//Выполнение оператора SQL SELECT
$sql = "SELECT * FROM Directory WHERE LName = '$string'";
$rs = odbc_exec($conn, $sql);
}
?>
<!DOCTYPE html PUBLIC "-//W3C/DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11 - transitional. dtd">
<html xmlns='http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Страница Web</title>
<style>
body {margin:15px;font:10pt Verdana}
td {vertical-align:top;border:solid 1px gray}
input,textarea{border:0px}
</style>
</head>
<body>
<form action="DirectorySearch.php" method="post">
<p> Введите ниже фамилию и щелкните на кнопке "Search",
чтобы найти номер телефона сотрудника и адрес e-mail </p>
<table>
<tr>
<td colspan="2">Company XYZ Directory</td>
</tr>
<tr>
К.С. Флойд
Введение в программирование на PHP5
<td><input type='text" size="15" name="SearchName"/></td>
<td><input type="submit" value="Search" name="submit"/>
</tr>
</table>
</form>
<div>
<?php
if(!empty($_POST))
{
while($row = odbc_fetch_array($rs))
{
echo
echo
echo
echo
}
"Name: " .$row['FName'] . " ";
$row['LName'] . "<br/>";
"Telephone: " . $row['Telephone'] . "<br/>";
"Email: " . $row['Email'] . "<br/>";
odbc_close($conn);
}
?>
</div>
</body>
</html>
П рим ер 9 . 3 .
Эта страница содержит два блока кода PHP. Первый выполняется, когда
делается щелчок на кнопке отправки " S e a r c h " . Введенное
пользователем имя ( f i r s t
n a me ) присваивается скалярной
переменной ' $ s t r i n g ' . Затем с базой данных устанавливается
соединение и выполняется оператор SQL SELECT для выбора всех (*)
полей записей таблицы, где значение поля ’ l a s t n a m e ’ совпадает со
строкой фамилии, введенной пользователем. Наконец, выполняется
оператор SQL. Если найдены подходящие записи, то множество записей
К.С. Флойд
Введение в программирование на PHP5
присваивается переменной ’ $ r s ’ .
Второй блок кода появляется в разделе тела XHTML-документа. Код,
содержащий операторы e c h o или p r i n t , помещается обычно между
открывающим и закрывающим тегами < b o d y > , чтобы он выводился
или форматировался в соответствии с другими элементами страницы.
Операторы e c h o и p r i n t в блоках PHP, появляющиеся выше
< h t m l > , всегда появляются в верху страницы и предшествуют всем
другим ее элементам.
Назначение этого блока кода состоит в выводе записей, извлеченных
при выполнении оператора SQL в предыдущем блоке кода. Сначала
оператор i f используется для определения, что массив $ _ P O S T не
является пустым. Если массив пустой, то это означает, что форма не
была отправлена и никакие записи не были извлечены. Если этот
условный оператор будет отсутствовать, то возникнет ошибка, так как
массив o d b c _ f e t c h _ a r r a y не будет содержать никаких значений.
Затем используется цикл w h i l e для итераций на множестве записей.
Во время каждой итерации по множеству записей, функция
o d b c _ f e t c h _ a r r a y () создает ассоциативный массив (здесь массив
называется $ r o w ), содержащий значения полей текущей записи.
Индексы массива соответствуют именам полей формы, а элементы
массива — значениям полей. Каждая запись затем выводит
$row['FNam e']
—
значение
поля
'F irstN am e',
$row['LNam e']
значение
поля
'L astN am e',
$row ['T elephone']
значение поля
'T elep h o n e', и
$row ['E m ail']
- значение поля ' E m a i l ' . Этот процесс
продолжается, при этом каждый раз массив $ r o w содержит новые
значения, пока не будет достигнут конец множества записей.
После вывода всех записей соединение с базой данных закрывается с
помощью функции o d b c _ c l o s e () .
Ниже показан пример вывода, созданного после поиска в каталоге
компании XYZ.
Если пользователь ищет фамилию, которая не существует в таблице
базы данных, то никакие записи не выводятся. Чтобы избежать
путаницы, приведенный выше сценарий можно немного изменить,
выводя сообщение, если не будет найдено подходящих записей.
DirectorySearch. php
<?php
if(!empty($_POST))
{
$results = 0;
while($row = odbc_fetch_array($rs))
{
echo
echo
echo
echo
'Name: " .$row['FName'] . " ";
$row['LName'] . "<br/>";
"Telephone: " . $row['Telephone'] . "<br/>";
"Email: " . $row['Email'] . "<br/>";
$results += 1;
}
if ($results == 0)
{
echo "Ничего не найдено!";
}
odbc_close($conn);
}
?>
</div>
</body>
</html>
Модифицированный сценарий, показанный выше, добавляет счетчик
записей $ r e s u l t s для подсчета числа выводимых записей. В начале
значение счетчика задается равным 0. Если множество записей
существует, то цикл w h i l e будет выполнять итерации на каждой
записи и увеличивать значение счетчика на 1. После окончания цикла
проверяется значение счетчика. Если это значение равно 0, то никаких
записей не было найдено, и выводится сообщение " Н и ч е г о н е
найдено ! "
Удаление записей
Оператор SQL DELETE используется для удаления существующих в базе
данных записей.
Синтаксис оператора SQL DELETE показан ниже:
DELETE FROM Имя_таблицы WHERE критерий
Более подробно оператор DELETE рассматривается в разделе 10.
Следующая форма представляет запись пользователя, которая будет
удалена из таблицы базы данных P e r s o n n e l (Персонал). Щелчок на
кнопке D e l e t e вызывает процедуру PHP, которая выполняет оператор
SQL DELETE, чтобы удалить эту запись из таблицы базы данных.
Кроме показанных выше элементов управления формы страница
содержит также скрытое текстовое поле с именем " A u t o N u m" со
значением, равным полю A u t o N u m таблицы базы данных. Это поле
используется для уникальной идентификации каждой записи.
Следующий код демонстрирует работу страницы:
DirectorySearch. php
<?php
if ($_POST['submitb']=="Delete Record")
{
$conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c
$sqlDelete = "DELETE FROM Personnel WHERE AutoNum =" . $_POST[
$rsDelete = odbc_exec($conn,$sqlDelete);
if(odbc_num_rows($rsDelete) == 1)
{
echo "Запись успешно удалена!";
}
odbc_close($conn);
}
К.С. Флойд
?>
П рим ер 9 . 4 .
После щелчка на кнопке " D e l e t e
R e c o r d ” устанавливается
соединение с базой данных Access. Затем формируется оператор SQL
DELETE для удаления записи из таблицы P e r s o n n e l со значением
поля A u t o N u m равным значению скрытого текстового поля A u t o N u m .
Затем выполняется оператор SQL. Результаты функции o d b c _ e x e c ()
присваиваются переменной $ r s D e l e t e . Последний шаг состоит в
проверке, что удаление записи было успешным, и в выводе
подтверждающего
сообщения.
Функция
o d b c _ n u m _ r o w s ()
применяется для определения числа строк в результатах ODBC или
числа строк, затронутых оператором o d b c _ e x e c () . Так как удаляется
одна запись, то запись будет удалена успешно, если результат функции
o d b c _ n u m _ r o w s () будет равен 1. В конце соединение с базой
данных закрывается.
Изменение записей
Оператор SQL UPDATE используется для изменения или обновления
существующих записей базы данных.
Синтаксис оператора SQL UPDATE показан ниже:
UPDATE ИмяТаблицы SET (FieldName1=value1 [,FieldName2=value2]...)
WHERE критерий
Следующая форма представляет запись пользователя, которая будет
обновлена в таблице базы данных P e r s o n n e l . Модификация любых
полей, связанных с записью, и щелчок на кнопке U p d a t e R e c o r d
вызывает процедуру PHP, которая выполняет оператор SQL UPDATE,
чтобы обновить эту запись в таблице базы данных.
Кроме показанных выше элементов управления формы страница
содержит также скрытое текстовое поле с именем " A u t o N u m" со
значением, равным значению поля A u t o N u m в таблицы базы данных.
Это поле используется для уникальной идентификации каждой записи.
Следующий код демонстрирует работу страницы:
DirectorySearch. php
<?php
if ($_POST['submitb']=='Update Record")
{
$new_fname = $_POST['FName'];
$new_lname= $_POST['LName'];
$new_telephone = $_POST['Telephone'];
$new_email = $_POST['Email'];
$conn = odbc_connect('Driver= {Microsoft Access Driver (*.mdb)}; DBQ=c
$sqlUpdate = "UPDATE Personnel SET (FName = '$new_fname', LName =
Email = '$new_email') WHERE AutoNum =" . $_POST['AutoNum'];
$rsUpdate = odbc_exec($conn,$sqlUpdate);
if(odbc_num_rows($rsUpdate) == 1)
{
echo "Запись успешно обновлена!";
К.С. Флойд
Введение в программирование на PHP5
}
odbc_close($conn);
}
?>
П рим ер 9 . 5 .
После щелчка на кнопке " U p d a t e R e c o r d ” текущие значения полей
формы присваиваются скалярным переменным. Этот шаг не является
обязательным, однако он упрощает кодирование оператора SQL
UPDATE. Затем устанавливается соединение с базой данных Access.
После соединения с базой данных формируется оператор SQL UPDATE
для обновления записи в таблице P e r s o n n e l со значением поля
A u t o N u m , равным значению скрытого текстового поля A u t o N u m .
Затем выполняется оператор SQL. Результаты функции o d b c _ e x e c ()
присваиваются переменной $ r s U p d a t e . Последний шаг состоит в
проверке, что обновление записи было успешно, и в выводе
подтверждающего сообщения.
Функция o d b c _ n u m _ r o w s () используется для определения числа
строк в результате ODBC или числа строк, затронутых оператором
o d b c _ e x e c () . Так как обновляется только одна запись, то обновление
записи
проходит
успешно,
если
результат
функции
o d b c _ n u m _ r o w s () будет равен 1. В конце соединение с базой
данных закрывается.
Доступ к базе данных MySQL
Система PHP предоставляет поддержку для MySQL с помощью набора
функций, которые можно использовать для манипуляции данными
MySQL. База данных MySQL стала самой популярной в мире базой
данных с открытым исходным кодом в связи с ее высокой
производительностью, надежностью и легкостью использования
До ступ к MySQL
База данных MySQL® стала самой популярной в мире базой данных с
открытым
исходным
кодом
—
благодаря
ее
высокой
производительности,
надежности
и легкости
использования.
Существует более 6 миллионов установок этой базы данных, начиная от
больших корпораций
и до специализированных встроенных
приложений.
M y S L jL ,
Система PHP предоставляет поддержку для MySQL с помощью набора
функций, которые можно использовать для манипуляции данными
MySQL. Задача этого учебника состоит в том, чтобы познакомить с
этими функциями, используемыми обычно в ориентированных на
данные приложениях PHP для извлечения, обновления, добавления и
удаления данных.
Используемые обычно функции PHP для MySQL описаны ниже.
m y s q l _ c o n n e c t ( имя
пользователя,пароль)
MySQL.
-
сервера
MySQL,MMH
открывает соединение с сервером
m y s q l _ s e l e c t _ d b (имя
базы
д а н н ы х , и д е н т и ф и к а т о р _ с о е д и н е н и я ) - выбирает базу данных,
расположенную на сервере MySQL. Параметр "и м я б а з ы д а н н ы х ”
относится к активной базе данных на сервере MySQL, который был
К.С. Флойд
Введение в программирование на PHP5
открыт
с
помощью
функции
m ysql_connect.
" И д е н т и ф и к а т о р _ с о е д и н е н и я " является ссылкой на текущее
соединение с MySQL.
m y sq l_ q u e ry (запрос
sql)
данный момент базе данных.
-
посылает запрос активной
в
m y s q l _ f e t c h _ a r r a y ( r e s o u r s e r e s u l t ) - возвращает массив,
который соответствует извлеченной строке, и перемещает внутренний
указатель данных вперед.
m ysql_affected_row s(resourse
result)
число строк, затронутых предыдущей операцией SQL.
m ysql_close (lin k _ id e n tifie r)
MySQL.
-
-
определяет
закрывает
соединение
Прежде чем можно будет применять эти функции для создания
приложений обработки данных с помощью MySQL, необходимо
получить подходящий доступ к серверу MySQL. Для этого требуется
учетная запись пользователя и пароль с полномочиями доступа к базе
данных и таблицам, содержащим данные, а также имя хоста сервера
MySQL или IP-адрес.
При работе с сервером MySQL полезно также использовать
инструменты управления с графическим интерфейсом, которые
обеспечивают более легкий интерфейс использования данных.
Популярными инструментами являются: SQLyog (доступный на ссылка:
http://www.webyog.com) и MySQL Administrator (доступный на ссылка:
http У/www. mysql. com/products/tools/).
Добавление записей
С помощью рассмотренных в предыдущем разделе функций MySQL и
языка SQL можно добавлять записи в таблицу базы данных. Записи
добавляются с помощью формы, предоставляющей области для ввода
информации. Нажатие кнопки вызывает затем сценарий PHP для
записи новой информации в таблицу с помощью команды SQL
I NSERT.
К.С. Флойд
Введение в программирование на PHP5
Типичная форма ввода для добавления новой записи в таблицу
S u r v e y показана ниже.
Name — 'Name', Email — 'Email', Web Connection — 'Connection',
Residence (City/ST/Country) — 'Residence', Age — 'Age', Gender — 'Gender',
Comments — 'Comments'.
Прежде чем подробно рассматривать код, будет полезно посмотреть на
синтаксис оператора SQL I NSERT:
INSERT INTO TableName (FieldName1 [,FieldName2]...) VALUES (Value1 [
Более подробное рассмотрение оператора INSERT дано в приложении.
Следующий
код
используется
для
обработки
данных
формы
К.С. Флойд
Введение в программирование на PHP5
V isitorSurvey.php:
VisitorSurvey.php
<?php
if ($_POST[submit] == "Submit')
{
//Получение данных формы и присвоение скалярным переменным
$Name = $_POST[Name];
$Email = $_POST[Email];
$Connection = $_POST[Connection];
$Residence = $_POST[Residence];
$Age = $_POST[Age];
$Gender = $_POST[Gender];
$Comments = $_POST[Comments];
//Установление соединения с базой данных
$conn = mysql_connect('localhost','root','xyxyxy');
//Выбор базы данных MySQL
$db = mysql_select_db('Membership', $conn);
//Оператор SQL
$sql = "INSERT INTO Survey " .
"(Name,Emaii,Connection,Residence,Age,Gender,Comments) VALUES ('3
'$Residence', '$Age', '$Gender', '$Comments')";
//Выполнение оператора SQL и сохранение результатов в множестве за
$rs = mysql_query($sql,$conn);
mysql_close($conn);
К.С. Флойд
Введение в программирование на PHP5
}
?>
П рим ер 1 0 . 1 .
После нажатия кнопки отправки S u b m i t создается суперглобальный
массив $ _ P OS T , содержащий значения из формы. Значения массива
присваиваются скалярным переменным. Это упрощает кодирование
оператора SQL. Затем выполняется оператор m y s q l _ c o n n e c t () .
Этот оператор требует три параметра - имя хоста сервера MySQL, имя
пользователя, и пароль. Здесь для соединения с базой данных MySQL
используется строка соединения без DSN. Ссылка на соединение
хранится в переменной $ c o n n . Это пример ссылочной переменной
PHP. В отличие от скалярных переменных и массивов, ссылочные
переменные не применяются непосредственно в программе, но часто
используются как параметры для других функций. После соединения с
сервером базы данных MySQL следующий шаг состоит в выборе базы
данных. Так как экземпляр сервера MySQL может содержать большое
число баз данных, то задействуется функция m y s q l _ s e l e c t _ d b для
выбора одной из них для использования в приложении. Эта функция
требует два параметра - имя базы данных и ссылку на соединение
MySQL. Вслед за выбором базы данных формируется оператор SQL
INSERT и присваивается переменной $ s q l . Затем функция
m y s q l _ q u e r y () выполняет оператор SQL, создающий множество
записей (множество записей базы данных). Это множество записей
присваивается переменной $ r s , еще одной ссылочной переменной
PHP. Отметим, что функция m y s q l _ q u e r y () требует два параметра
— $ s q l (ссылка на текущий оператор SQL) и $ c o n n (ссылка на
текущее соединение с базой данных). Наконец, вызывается функция
m y s q l _ c l o s e () для закрытия текущего соединения с базой данных.
Для таких приложений обычно желательно выполнять проверку
данных, прежде чем заносить данные в таблицу базы данных. Это
необходимо делать перед установлением соединения с базой данных с
помощью методов, рассмотренных в лекции 7.
В случае ошибки кодирования данные не заносятся в таблицу базы
данных, а PHP выведет предупреждение или сообщение об ошибке. В
такой ситуации полезно подавить эти критические сообщения, добавить
К.С. Флойд
Введение в программирование на PHP5
код для проверки ошибок вручную и сгенерировать более понятный для
пользователя вывод. Это можно делать сразу после оператора
m y s q l _ q u e r y ( ) , проверяя статус вновь созданного множества
записей — $ r s .
Предположим, что в предыдущем коде функция m y s q l _ q u e r y ()
содержит вместо $ s q l параметр $ s q l S t r i n g . В этом случае PHP
немедленно прекратит выполнение страницы и выведет сообщение об
ошибке.
Вывод сообщения об ошибке PHP можно подавить с помощью
оператора управления ошибками "@". При подавленном сообщении об
ошибке можно добавить код для создания более понятного
пользователю сообщения. Такой подход показан ниже:
VisitorSurvey.php
<?php
if ($_POST[submit] == "Submit')
{
//Получение данных формы и присвоение скалярным переменным
$Name = $_POST[Name];
$Email = $_POST[Email];
$Connection = $_POST[Connection];
$Residence = $_POST[Residence];
$Age = $_POST[Age];
$Gender = $_POST[Gender];
$Comments = $_POST[Comments];
//Установление соединения с базой данных
$conn = @mysql_connect('localhost','root','xyxyxy');
//Выбор базы данных MySQL
$db = @mysql_select_db('Membership', $conn);
//Оператор SQL
$sqlstring = "INSERT INTO Survey " .
"(Name,Email,Conneclion,Residence,Age,Gender,Comments) VALUES ('3
'$Residence', '$Age', '$Gender', '$Comments')";
//Выполнение оператора SQL и сохранение результатов в виде множест
$rs = @mysql_query($sqlstring,$conn);
if (!$rs)
{
echo "Произошла ошибка. Попробуйте еще раз.";
}
else
{
echo "Запись была успешно добавлена.";
}
mysql_close($conn);
}
?>
П рим ер 1 0 . 2 .
Вслед за функцией m y s q l _ q u e r y () используется оператор i f для
проверки статуса множества записей $ r s . Если множество записей
успешно создается, выводится сообщение " З а п и с ь б ы л а у с п е ш н о
д о б а в л е н а ” . Если возникает проблема, выводится сообщение
" П р о и з о ш л а о ш и б к а . П о п р о б у й т е еще р а з . "
К.С. Флойд
Введение в программирование на PHP5
Выбор записей
Кроме применения функций MySQL с оператором SQL INSERT для
добавления записей в базу данных, можно также извлекать записи из
таблицы базы данных с помощью оператора SQL SELECT.
Типичная форма ввода для выбора существующих записей из таблицы
D i r e c t o r y показана ниже. В этом примере фиктивная компания,
C o m p a n y XYZ, имеет онлайн форму, которая позволяет пользователям
ввести фамилию сотрудника и найти полное имя сотрудника, номер
телефона и адрес e-mail.
Company XYZ Directory
Search
Оператор SQL SELECT показан ниже:
SELECT * | [DISTINCT] feld1 [,field2]... FROM TableName WHERE criteria
ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...
Более подробно оператор SELECT рассматривается в приложении.
Следующий
код
используется
D irectorySearch.php:
DirectorySearch. php
<?php
if ($_POST[submit] == "Search')
{
//Получение данных формы
$string = $_POST['search'];
//Установление соединения с данными
для
обработки
формы
$conn = mysql_connect('loca]host','root','xyxyxy,);
//Выбор базы данных
$db = mysql_select_db('Membership', $conn);
//Создание оператора SQL SELECT
$sql = "SELECT * FROM Directory WHERE LName = '$string'";
$rs = mysql_query($sql, $conn);
}
?>
<!DOCTYPE html PUBLIC "-//W3C/DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtml1/DTD/xhtml11 - transitional. dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Страница Web </title>
<style>
body {margin:15px;font:10pt Verdana}
td {vertical-align:top;border:soM 1px gray}
input,textarea{border:0px}
</style>
</head>
<body>
<form action="DirectorySearch.php" method="post">
<р>Введите ниже фамилию и нажмите кнопку "Search",
чтобы найти номер телефона и адрес e-mail сотрудника</р>
К.С. Флойд
Введение в программирование на PHP5
<table>
<tr>
<td co]span="2">Company XYZ Directory</td>
</tr>
<td><input type="text" size="15" name="SearchName"/></td>
<td><input type="submit" value="Search" name="submit"/>
</tr>
</tab]e>
</form>
<div>
<?php
if(!empty($_POST))
{
while($row = mysql_fetch_array($rs))
{
echo "Name: " .$row['FName'] . " ";
echo $row['LName'] . "<br/>";
echo "Telephone: " . $row['Telephone'] . "<br/>";
echo "Email: " . $row['Email'] . "<br/>";
}
mysql_close($conn);
}
?>
</div>
</body>
</html>
П рим ер 1 0 . 3 .
Эта страница содержит два блока кода PHP. Первый выполняется, когда
нажимается кнопка отправки формы
" S e a r c h " . Введенная
пользователем
фамилия присваивается скалярной переменной
' $ s t r i n g ' . Затем создается соединение с базой данных и
формируется оператор SQL SELECT для выбора всех (*) полей таблицы
записей, в которых поле ’ l a s t n a m e ’ совпадает со строкой фамилии,
К.С. Флойд
Введение в программирование на PHP5
введенной пользователем. В конце выполняется оператор SQL. Если
найдены подходящие записи, то множество записей присваивается
переменной ’ $ r s ’ .
Второй блок кода появляется в теле документа XHTML. Код,
содержащий операторы e c h o или p r i n t , помещается обычно между
открывающим и закрывающим тегами < b o d y > , так что он может
выводиться или форматироваться в соответствии с другими элементами
страницы. Операторы e c h o и p r i n t , появляющиеся в блоках PHP,
закодированные выше тега < h t m l > , всегда появляются в верху
страницы и предшествуют всем другим ее элементам.
Назначение этого блока кода состоит в выводе извлеченных записей,
если в предыдущем блоке кода был выполнен оператор SQL. Сначала
используется оператор i f для проверки, что массив $ _ P O S T не
является пустым. Если этот массив будет пустым, то это означает, что
форма не была отправлена, и никакие записи не были извлечены. Если
этот условный оператор отсутствует, то будет возникать ошибка, так как
массив m y s q l _ f e t c h _ a r r a y не будет содержать никаких значений.
Затем используется цикл w h i l e для итераций по множеству записей.
Во время каждой итерации по множеству записей функция
m y s q l _ f e t c h _ a r r a y () создает ассоциативный массив (здесь этот
массив назван $ r o w ), содержащий значения полей текущей записи.
Индексы массива соответствуют именам полей формы, а элемент
массива соответствует значению поля. Каждая запись затем выводит
$row['FNam e']
—
значение
поля
'F irstN am e',
$row['LNam e']
-значение
поля
'L astN am e',
$row ['T elephone']
значение поля
'T elep h o n e', и
$row ['E m ail']
- значение поля ' E m a i l ' . Этот процесс
продолжается, пока не будет достигнут конец множества записей, при
этом массив $ r o w каждый раз будет содержать новые значения.
После вывода всех записей соединение с базой данных закрывается с
помощью функции m y s q l _ c l o s e () .
Ниже представлен пример вывода, созданного после поиска в каталоге.
Если пользователь ищет фамилию, которая не существует в таблице
базы данных, то никакие записи не выводятся. Чтобы предотвратить
путаницу, приведенный выше сценарий можно немного изменить так,
что будет выводиться соответствующее сообщение, если подходящие
записи не будут найдены.
DirectorySearch. php
<?php
if(!empty($_POST))
{
while($row = mysql_fetch_array($rs))
{
echo
echo
echo
echo
'Name: " .$row['FName'] . "
$row['LName'] . "<br/>";
"Telephone: " . $row['Telephone'] . "<br/>";
"Email: " . $row['Email'] . "<br/>";
}
if (mysql_affected_rows($rs) == 0)
К.С. Флойд
Введение в программирование на PHP5
{
echo 'N o records found!";
}
mysql_close($conn);
}
?>
</div>
</body>
</html>
Показанный выше измененный сценарий содержит дополнительно
функцию m y s q l _ a f f e c t e d _ r o w s ( ) . Эта функция требует один
параметр - ссылку на текущее множество записей $ r s и определяет
число строк, затронутых последней операцией SQL. Если возвращаемое
функцией m y s q l _ a f f e c t e d _ r o w s () значение равно 0, то оператор
SQL SELECT не затронул ни одной строки. Поэтому подходящих
записей найдено не было.
Удаление записей
Оператор SQL DELETE используется для удаления существующих
записей в базе данных.
Синтаксис оператора SQL DELETE показан ниже:
DELETE FROM Имя_Таблицы WHERE критерий
Более подробно оператор DELETE рассматривается в приложении.
Следующая форма представляет запись пользователя, которая будет
удалена из таблицы базы данных P e r s o n n e l . Щелчок на кнопке
D e l e t e вызывает процедуру PHP, которая выполняет оператор SQL
DELETE для удаления этой записи из таблицы базы данных.
Кроме показанных выше элементов управления формы, страница
включает также скрытое текстовое поле с именем " A u t o N u m" со
значением, равным полю A u t o N u m таблицы базы данных. Это поле
используется для уникальной идентификации каждой записи.
Следующий код демонстрирует, как работает страница:
DirectorySearch. php
<?php
if ($_POST['submitb']=='Delete Record")
{
$conn = mysql_connect('localhost','root','xyxyxy');
$db = mysql_select_db('Membership',$conn);
$sqlDelete = "DELETE FROM Personnel WHERE AutoNum =" . $_POST[
$rsDelete = mysql_query($sqlDelete,$conn);
if(mysql_affected_rows($rsDelete) == 1)
{
echo "Запись успешно удалена!";
}
mysql_close($conn);
}
?>
После нажатия кнопки " D e l e t e
R e c o r d ” устанавливается
соединение с базой данных MySQL. Затем создается оператор SQL
DELETE для удаления записи из таблицы P e r s o n n e l со значением
поля A u t o N u m , равным значению скрытого текстового поля A u t o N u m .
Затем оператор SQL выполняется. Результаты работы функции
m y s q l _ q u e r y ()
присваиваются
переменной
$rsD elete.
Последний шаг состоит в проверке, что удаление записи прошло
успешно, и в выводе подтверждающего сообщения. Функция
m y s q l _ a f f e c t e d _ r o w s ( ) используется для определения числа
строк в множестве результатов ODBC или числа строк, затронутых
оператором m y s q l _ q u e r y () . Так как будет удалена только одна
запись, то результат m y s q l _ a f f e c t e d _ r o w s () равный 1 означает,
что запись удалена успешно. В конце соединение с базой данных
закрывается.
PHP предоставляет доступ к файлам в операционных системах Windows
и Unix для чтения, записи или добавления содержимого. Эта лекция
описывает, как использовать PHP для открытия файлов в системах
Windows
Открытие файлов
PHP предоставляет доступ к файлам в операционных системах Windows
и Unix для чтения, записи или добавления содержимого. Этот раздел
описывает, как использовать PHP для открытия файлов в системах
Windows.
PHP содержит функции f o p e n ( ) и f c l o s e ( ) для работы с файлами.
Обе функции определяются ниже.
f o p e n ( и м я _ ф а й л а , р е жим) - функция используется для открытия
файла. Для функции требуется задать имя файла и режим работы. Она
возвращает указатель на файл, который содержит информацию о файле
и используется в качестве ссылки.
fc lo se (указатель_ресурса)
- функция используется для
закрытия файла. Для функции требуется указатель файла, созданный при
открытии файла с помощью функции f o p e n ( ) . Возвращает TRUE при
успешной работе или FALSE при отказе.
Имя файла является полным путем доступа к файлу, который требуется
создать или открыть. Этот путь доступа может быть относительным
путем
доступа
к
файлу:
"/Documents
and
Settings/A dm inistrator/PH P/m yfile.txt"
или
абсолютным
путем
доступа
к
файлу:
" E : / M y F i l e s / P H P / m y f i l e . t x t " . Для каждого определенного
каталога необходимо иметь подходящие права NTFS для создания,
модификации или удаления файлов.
Режим может быть одним из следующих.
Режимы, используемые в f o p e n ()
Режим
Применение
r
Открывает существующий файл с целью чтения из него данных.
Указатель файла помещается в начале файла
r+
Открывает существующий файл с целью чтения или записи
данных. Указатель файла помещается в начале файла
w
Открывает файл для записи. Если файл не существует, то он
создается. Если файл существует, то указатель файла помещается
в начале файла и функция удаляет все существующее
содержимое файла
w+
Открывает файл для чтения и записи. Если файл не существует,
то он создается. Если файл существует, то указатель файла
помещается в начале файла и функция удаляет все
существующее содержимое файла
a
Открывает файл для записи. Если файл не существует, то он
создается. Если файл существует, то указатель файла помещается
в конце файла
a+
Открывает файл для чтения и записи. Если файл не существует,
то он создается. Если файл существует, то указатель файла
помещается в конце файла
Следующий пример показывает, как открыть файл для чтения:
fileprocess.php
<?php
$filename = "C:/Documents and Settmgs/Administrator/MyFiles/myffle.txt";
$newfile = fopen($filename, "w+");
//код для чтения или записи данных в файл располагается здесь
fcbse($newfile);
?>
Первый шаг состоит в создании переменной для хранения всего пути
$filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
Путь доступа к текстовому файлу m y f i l e . t x t хранится в переменной
с именем f i l e n a m e . Затем создается указатель файла с именем
$ n e w f i l e и применяется с функцией f o p e n ( ) для открытия файла,
указанного в предыдущем разделе. Указатель файла является ссылочной
переменной PHP, используемой для ссылки на только что открытый
файл:
$newfile = fopen($filename, "w+");
Указатель файла будет использован позже для чтения и записи
содержимого в открытый файл.
В некоторых ситуациях функция f o p e n ( ) не сможет успешно открыть
файл в результате неверного пути доступа к файлу, полномочий
безопасности или других непредвиденных проблем. В связи с этим
рекомендуется использовать специальную функцию PHP для аккуратной
обработки таких ошибок. Эти функции можно применять в сочетании с
оператором управления ошибками PHP "@", рассмотренного в разделе
8-2 для завершения сценария, подавления создаваемых PHP сообщений
об ошибках, и вывода более понятного пользователю сообщения.
Функции управления ошибками PHP описаны ниже:
е х ^ ( с о о б щ е н и е _ о б _ о ш и б к е ) - завершает текущий сценарий и
выводит сообщение об ошибке, передаваемое в функцию.
d i e ( с о о б щ е н и е _ о б _ о ш и б к е ) - алиас функции e x i t () .
Следующий
сценарий
управления ошибками:
демонстрирует
использование
fileprocess.php
<?php
$filename = "C:/Documents and Settings/Administrator/MyFiles/
myfile.txt";
функций
$newfile = @fopen($fflename, "w+") or ехй("Невозможно открыть или созда
//код для чтения или записи данных в файл размещается здесь
fcbse($newfile);
?>
Если файл невозможно открыть, функция e x i t () выводит сообщение
” Н е в о з м о ж н о о т к р ы т ь и л и с о з д а т ь ф а й л ” и сценарий
завершается.
Если файл открывается успешно, то содержимое можно читать из файла,
записывать в файл, или добавлять к файлу в зависимости от
используемого в функции f o p e n ( ) режима. Подробнее эти действия
будут рассмотрены в следующих разделах. После завершения обработки
всего файла применяется функция f c l o s e ( ) для закрытия открытого
файла.
Чтение файлов
Этот раздел описывает, как использовать PHP для чтения содержимого
файлов в системах Windows.
Для чтения файлов в PHP имеются функции f r e a d () и f i l e s i z e ( ) .
Они определяются ниже.
f r e a d ( у к а з а т е л ь _ р е с у р с а , д л и н а ) - функция, используемая
для чтения содержимого файла. Читает указанное количество байтов
"длина" из файла "указатель_ресурса". Чтение останавливается, когда
будет прочитано заданное количество байтов ("длина") или будет
достигнут маркер EOF ( e n d o f f i l e ). Функция требует два
параметра - указатель файла, который создается, когда файл открывается
с помощью функции f o p e n ( ) , и размер, который определяет, какая
часть содержимого будет считана.
fg e tc s v (у к а з а т е л ь _ р е с у р с а , длина, ограничитель) функция, используемая для чтения содержимого файла и анализа
К.С. Флойд
Введение в программирование на PHP5
данных для создания массива. Данные разделяются параметромограничителем, задаваемым в функции.
f i l e s i z e ( и м я _ ф а й л а ) - возвращает размер файла. Если возникает
ошибка, функция возвращает значение f a l s e .
Следующий пример иллюстрирует, как прочитать все содержимое
файла:
fileread.php
<?php
$filename = "C:/Documents and Settmgs/Administrator/MyFiles/myfile.txt";
$newfile = @fopen($filename, "r") or ехй("Невозможно открыть файл!");
$file_contents = @fread($newfile, filesize($filename))
or ехй("Невозможно прочитать содержимое файла!");
fclose($newfile);
?>
Первый шаг состоит в создании переменной для хранения полного пути
доступа к файлу, который будет открыт для чтения:
$filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
Путь доступа к текстовому файлу m y f i l e . t x t хранится в переменной
с именем f i l e n a m e . Затем создается указатель файла с именем
$ n e w f i l e и используется с функцией f o p e n () для открытия файла,
указанного в предыдущем разделе. Указатель файла применяется для
ссылки на только что открытый файл:
$newfile = fopen($filename, "r");
Указатель файла является переменной PHP, которая содержит ссылку на
открытый файл. Он будет задействован позже с функцией f r e a d () для
чтения содержимого из открытого файла.
К.С. Флойд
Введение в программирование на PHP5
Затем создается переменная с именем $ f i l e _ c o n t e n t s
и
используется
для
хранения
содержимого
текстового
файла
m y f i l e . t x t . Первый параметр функции f r e a d () указывает на имя
файла, содержимое которого будет прочитано. Второй параметр
определяет длину файла. Если длина файла неизвестна, можно
воспользоваться специальной функцией PHP с именем f i l e s i z e ( ) ,
которая определяет длину файла. Она требует один параметр - имя или
путь доступа файла, который читается в данный момент.
$file_contents = fread($newfile, filesize($filemme));
Все содержимое текстового файла хранится теперь в переменной
$ f i l e _ c o n t e n t s . Эти данные можно выводить на экране с
помощью оператора echo или записать в другой текстовый файл.
В некоторых случаях может понадобиться прочитать и работать с
отдельными
частями
содержимого
текстового
файла.
При
использовании f r e a d ( ) все содержимое файла хранится в одной
переменной, что затрудняет работу с отдельными частями файла. Если
текстовый файл содержит разграничители для разделения отдельных
фрагментов данных, можно применить для чтения другую функцию
чтения — f g e t c s v ( ) . Эта функция читает содержимое файла и
создает массив, делая доступными определенные части текста.
Предположим, что текстовый файл n u m b e r s . t x t
содержит следующие данные:
существует и
numbers.txt
50,17,34,90
Следующий
сценарий
демонстрирует
использование
f g e t c s v ( ) для чтения содержимого текстового файла.
fileread.php
<?php
$filename = "Cynumbers.txt";
функции
$newfile = @fopen($fflename, "г") or exit("Could not open file");
$file_contents = @fgetcsv($newfile, filesize($filename),",")
or exit("Could not read file contents");
for ($i=0; $i < sizeof($file_contents); $i++)
{
echo $file_contents[$i];
echo "<br/>";
}
fclose($newfile);
?>
После открытия файла функция f g e t c s v ( ) считывает все содержимое
файла, создавая массив — ' $ f i l e _ c o n t e n t s ' . Третий параметр
функции f g e t c s v ( ) определяет, что каждый элемент, отделенный с
помощью запятой ” , ” , станет элементом нового массива. Так как
num bers.txt
содержит
значения
50,17,34,90,
то
$file_contents[0]
= 50,
$file_contents[1]
= 17,
$file_contents[2]
= 34, $ f i l e _ c o n t e n t s [ 3 ]
= 90.
После создания массива значениями можно манипулировать с помощью
любой из функций для массивов PHP. В предыдущем примере цикл f o r
выполняет итерации на массиве $ f i l e _ c o n t e n t s [ ] и выводит
каждое число.
После завершения обработки файла функция f c l o s e () используется
для закрытия открытого файла.
Запись в файлы
Этот раздел описывает, как использовать PHP для записи содержимого
в файлы в системах Windows.
PHP содержит функцию f w r i t e ( )
определена ниже.
для записи файлов. Эта функция
К.С. Флойд
Введение в программирование на PHP5
f w r i t e ( у к а з а т е л ь _ ф а й л а , с т р о к а ) - записывает содержимое
строки в поток указанного файла. Если задан аргумент l e n g t h (длина),
запись будет остановлена после записи l e n g t h байтов или
достижения конца строки.
Следующий пример иллюстрирует, как записать все содержимое файла:
filewrite.php
<?php
$filename = "C:/Documents and Settmgs/Administrator/MyFiles/myffle.txt";
$newfile = @fopen($filename, "w") or exit("Невозможно открыть файл");
$file_contents = "Добавьте эту строку в текстовый файл";
fwrite($newffle,$file_contents);
fdose($newffle);
?>
Первый шаг состоит в создании переменной для хранения полного пути
доступа к файлу, который будет открыт или создан:
$filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
Путь доступа к текстовому файлу m y f i l e . t x t хранится в переменной
с именем f i l e n a m e . Затем создается указатель файла с именем
$ n e w f i l e и используется с функцией f o p e n () для открытия файла,
указанного в предыдущем разделе. Указатель файла применяется для
ссылки на только что открытый файл. Файл открывается в режиме
записи:
$newfile = fopen($filename, "w");
Указатель файла является переменной PHP, содержащей ссылку на
открытый файл. Он будет задействован позже для записи содержимого
в открытый файл.
К.С. Флойд
Введение в программирование на PHP5
Затем создается переменная с именем $ f i l e _ c o n t e n t s и ей
присваивается строковое значение, которое будет записано в текстовый
файл m y f i l e . t x t .
Наконец вызывается функция f w r i t e () . Первый параметр функции
f w r i t e () указывает на имя файла, в который будет записываться
содержимое. Второй параметр содержит текст, который будет
записываться в открытый файл.
fwrite($newfile, $file_contents);
После завершения обработки файла используется функция f c l o s e ( )
для закрытия открытого файла.
В некоторых случаях может понадобиться записать содержимое
существующего файла в новый файл. Этот процесс требует
использования функций f o p e n ( ) , f r e a d ()
и
f w r i t e () .
Открывается первый файл, читается его содержимое и записывается в
новый файл, который также был открыт. Следующий сценарий
показывает реализацию такого процесса:
filecopy.php
<?php
$fileAname = "C:/MyFiles/PHP/file1.txt";
$fileBname = "CyMyFiles/PHP/file.txt";
$currentfile = fopen($fileAname,"r") or exit("Невозможно открыть файл");
$fileAcontents = fread($currentfile,filesize($fileAname));
$newfile = fopen($fileBname,"w");
fwrite($newfile, $ffleAcontents);
fclose($newfile);
fclose($currentfile);
echo "Содержимое файла file1.txt скопировано в файл file.txt";
?>
Этот сценарий копирует содержимое " f i l e 1 . t x t " в новый файл
" f i l e . t x t " . Сначала объявляются две переменные $ f i l e A n a m e и
$ f i l e B n a m e , которым присваиваются пути доступа к каталогам
существующего и нового файла. Функция f o p e n ( ) используется для
открытия текущего файла для чтения его содержимого. Открытый файл
присваивается указателю файла $ c u r r e n t f i l e . Содержимое
открытого файла считывается с помощью функции f r e a d ( ) и
присваивается переменной $ f i l e A c o n t e n t s . Затем функция
f o p e n ( ) применяется снова для открытия нового файла. Открытый
файл присваивается указателю файла $ n e w f i l e . Функция f w r i t e ()
используется для записи содержимого исходного файла в новый файл.
Когда процесс копирования завершается, оба файла закрываются с
помощью функции f c l o s e ( ) .
Копирование файлов
Этот раздел описывает, как использовать PHP для копирования файлов
в системах Windows.
PHP содержит функцию c o p y ( ) для копирования файлов. Эта функция
определяется ниже:
сору(исходный_файл,
н о в ы й _ ф а й л ) - копирует содержимое
исходного файла, определенного первым параметром, в новый файл,
определенный вторым параметром функции. Функция возвращает
значение t r u e или f a l s e .
Следующий пример показывает, как скопировать содержимое одного
файла в другой файл:
filecopy.php
<?php
$orig_filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";
$new_filename = "C:/Documents and Settings/Administrator/MyFiles/myNewfile.
$status = @copy($orig_filename, $new_filename) or die("Невозможно скопир
echo "Содержимое файла успешно скопировано!";
?>
Первый шаг состоит в создании переменной для хранения полного пути
доступа к исходному файлу, содержимое которого будет скопировано:
$orig_filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
Затем создается вторая переменная для хранения полного пути доступа
к новому файлу, который будет создан:
$new_filename = "C:/Documents and Settmgs/Administrators/MyFiles/myNewffle
Копирование выполняет функция c o p y ( ) , принимая два параметра,
путь доступа к исходному файлу — $ o r i g _ f i l e n a m e , и путь доступа
к новому — $ n e w _ f i l e n a m e . Функция c o p y () возвращает значение
t r u e , если копирование завершается успешно; иначе возвращается
значение f a l s e . Возвращаемое значение хранится в переменной
$status .
$status = copy($orig_filename, $new_filename) or die("Невозможно скопиров
Если функция c o p y ( ) отказывает, выполняется функция d i e ( ) ,
выводя сообщение об ошибке. Иначе с помощью функции echo
выводится сообщение об успехе.
echo "Содержимое успешно скопировано";
В предыдущем разделе функция f w r i t e ( ) используется вместе с
функцией f r e a d ( ) для чтения содержимого одного файла и записи
этого содержимого в новый файл. Если содержимое исходного файла не
добавляется к существующему файлу, то
функция
copy()
предоставляет более простой подход для копирования содержимого из
существующего файла в новый файл.
К.С. Флойд
Введение в программирование на PHP5
Удаление файлов
Этот раздел описывает, как использовать PHP для удаления файлов в
системах Windows.
PHP содержит функцию u n l i n k ( ) для удаления файлов. Функцию
u n l i n k () надо использовать с осторожностью. После удаления файла
его невозможно восстановить. Эта функция определяется ниже.
и п Ы п к ( и м я _ ф а й л а ) - удаляет файл, определенный параметром.
Функция возвращает значение t r u e или f a l s e .
Следующий пример показывает, как удалить файл с помощью функции
u n l i n k () :
filedelete.php
<?php
$filename = "C:/Documents and Settmgs/Administrator/MyFiles/myfile.txt";
$status = unlink($filename) or ехй("Невозможно удалить файл");
echo "файл удален успешно";
?>
Первый шаг состоит в создании переменной для хранения полного пути
доступа к файлу, содержимое которого будет удалено:
$filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
Функция u n l i n k ( ) выполняется, получая один параметр, путь
доступа исходного файла — $ f i l e n a m e . Функция u n l i n k ( )
возвращает значение t r u e , если файл удаляется успешно; иначе
возвращается значение f a l s e . Возвращаемое значение хранится в
переменной $ s t a t u s .
$status = unlink($filename) or die("Невозможно удалить файл");
К.С. Флойд
Введение в программирование на PHP5
Если функция u n l i n k () отказывает, выполняется функция e x i t ( ) ,
выводя сообщение об ошибке. Иначе с помощью оператора e c h o
выводится сообщение об успехе:
echo "файл удален успешно";
Переименование файлов
Этот раздел описывает, как использовать PHP для переименования
файлов в системах Windows.
PHP содержит функцию r e n a m e () для переименования файлов. Эта
функция определена ниже:
renam e($orig_filenam e,
$ n e w _ f i l e n a m e ) - переименует
файл, определенный первым параметром, в имя, определенное вторым
параметром. Функция возвращает значение t r u e или f a l s e .
Следующий пример показывает, как переименовать файл с помощью
функции r e n a m e () :
filerename.php
<?php
$orig_filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";
$new_filename = "C:/Documents and Settmgs/Administrator/MyFiles/newfile.txt"
$status = rename($orig_filename, $new_filename) or ехй("Невозможно переим
echo "файл успешно переименован";
?>
Первый шаг состоит в создании переменной для хранения полного пути
доступа к файлу, который будет переименован:
$orig_filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
Второй шаг состоит в создании переменной для хранения полного пути
К.С. Флойд
Введение в программирование на PHP5
доступа к файлу, который будет создан, когда старый файл будет
переименован:
$new_filename = "C:/Documents and Settings/Administrators/MyFiles/newfile.txt
При выполнении функция r e n a m e () получает два параметра, путь
доступа к исходному файлу — $ o r i g _ f i l e n a m e и путь доступа к
файлу, который будет создан, когда старый файл будет переименован —
$ n e w _ f i l e n a m e . Функция r e n a m e () возвращает значение t r u e ,
если файл переименовывается успешно, иначе возвращается значение
f a l s e . Возвращаемое значение хранится в переменной $ s t a t u s .
$status = rename($orig_filename,$new_filename) or exit("Невозможно переим
Если функция r e n a m e () отказывает, выполняется функция e x i t ( ) ,
выводящая сообщение об ошибке. Иначе выводится сообщение об
успехе с помощью оператора e c h o .
echo "файл успешно переименован";
Получение данных формы
В большинстве случаев введенные пользователями данные формы
записывают в СУБД, такую, как MS Access и MySQL, с помощью
функций ODBC и MySQL, рассмотренных в разделах 9 и 10.
Аналогичным образом данные формы можно также записать в
текстовый файл. Этот раздел описывает, как использовать PHP для
получения данных формы и записи их в текстовый файл.
Рассмотрим приведенную выше страницу с формой. Следующий
К.С. Флойд
Введение в программирование на PHP5
пример показывает, как записать отправленные данные формы в
текстовый файл:
<?php
if ($_POST['SubmitB'] == "Submit Data")
{
$file_name = "c:\formfile.txt";
$open_file = fopen($file_name, "a+");
$file_contents= $_POST['FName'] . "," . $_POST['LName'] . "," . $_POST['Da
fwrite($open_file,$file_contents);
fclose($open_file);
echo "Данные формы успешно записаны в файл";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TRxhtmlI/DTD/xhtmlIl-transitjonaL dtd">
<html xmlns="http://www.w3.org/1999/xht:ml" xml:lang="en"
lang="en">
<head>
^ й ^ С т р а н и ц а Web </title>
</head>
<body>
<р>Запись данных формы в файл </p>
<p>
<form method="post" action="createfile.php">
Enter First Name <input type="text" name="FName"/><br/><br/>
Enter Last Name <input type="text" name="LName"/><br/><br/>
<input type="hidden" name="DateTime" value="<?php echo date('g:i a') ?>"/>
<input type="submit" name="SubmitB" value="Submit Data"/>
</form>
</p>
</body>
</html>
П рим ер 1 1 . 1 .
В этом примере форма страницы XHTML содержит текстовое поле для
имени и фамилии пользователя. Также кодируется скрытое поле, в
которое заносится с помощью функции PHP d a t e () текущие дата и
время. Когда нажимается кнопка отправки формы, создается новый
текстовый файл ' f o r m f i l e . t x t '
и открывается в режиме
добавления:
$file_name = "c:\formffle.txt";
$open_file = fopen($file_name, "a+");
Затем переменной $ f i l e _ c o n t e n t s
присваиваются значения
суперглобальных переменных POST, содержащие имя и фамилию
пользователя и текущее значение даты и времени. К строкам
присоединяется запятая, чтобы создать разграничители этих значений.
В конце каждой строки добавляется символ новой строки для создания
возврата каретки:
$file_contents= $_POST['FName'] . "," . $_POST['LName'] . "," . $_POST['Da
Наконец, содержимое переменной $ f i l e _ c o n t e n t s записывается
(добавляется) в текстовый файл. Файл закрывается, и используется
оператор echo для вывода подтверждающего сообщения в окне браузера:
fclose($open_file);
echo "Данные формы успешно записаны в файл";
Пересылка файлов
В некоторых динамичных приложениях Web необходимо разрешать
пользователям пересылку файлов с локального компьютера на сервер
К.С. Флойд
Введение в программирование на PHP5
Web. Такое приложение может позволить пользователям обмениваться
файлами с другими пользователями или просто предоставить механизм
для хранения файлов для будущего использования. Этот раздел вводит
функцию PHP для пересылки файлов.
В PHP пересылку файлов можно реализовать с помощью следующей
функции:
move_upbaded_ffle(имя_файла, место_назначения) - перемещает файл в
Прежде чем переходить к деталям кода PHP, давайте посмотрим на
элементы управления формы XHTML, необходимые для создания
страницы для пересылки файлов.
<form enctype="multipart/form-data" action="upbad.php" method="post">
Select File: <input type="file" name="uploadFile">
<input name="SubmitB" type="submit" value-Upload File">
</form>
Блок кода начинается со стандартного тега XHTML < f o r m > . Кроме
атрибутов a c t i o n и m e t h o d форма, используемая для пересылки
файлов, должна включать тип кодирования или атрибут " e n c r y p t " .
Когда
форма
применяется
для
пересылки
файлов
должно
использоваться значение атрибута e n c r y p t " m u l t i p a r t / f o r m data".
После тега < f o r m > следует элемент текстового поля < i n p u t > . Этот
элемент управления нужен для определения расположения и имени
файла, который будет пересылаться. Он содержит атрибуты n a me и
t y p e . Атрибут t y p e должен быть задан как " f i l e " . name имеет
определенное пользователем значение, которое будет использоваться
сервером для идентификации файла источника во время процесса
пересылки.
Текстовое поле f i l e включает также кнопку " Br o ws e . . . " при выводе
в окне браузера. Когда нажимается эта кнопка, появляется диалоговое
К.С. Флойд
Введение в программирование на PHP5
окно, позволяющее пользователю найти на
компьютере файл, который будет пересылаться.
своем
локальном
Последним элементом управления является кнопка отправки ( s u b m i t
). Кнопка отправки используется для инициирования процесса
отправки формы. Когда нажимается эта кнопка, информация о файле
посылается на страницу u p l o a d . p h p , которая содержит код PHP для
пересылки файла в папку, расположенную на сервере Web.
После кодирования формы XHTML на страницу можно добавить
сценарий PHP для выполнения динамической пересылки файла. Когда
файл пересылается с помощью функции m o v e _ u p l o a d e d _ f i l e ( ) ,
он кратко хранится во временном месте на сервере Web. Для
перемещения файла в его конечное место назначения и манипуляций с
его различными свойствами, используется суперглобальный массив
PHP $ _ F I L E S . Массив $ _ F I L E S применяет значение n a m e , заданное
в теге < i n p u t t y p e = " f i l e " n a m e = " u p l o a d F i l e " / > (в данном
случае ' u p l o a d F i l e ' ) для идентификации пересылаемого файла.
Записи, связанные с массивом $ _ F I L E S , описаны ниже.
$ _ F I L E S [ ' u p l o a d F i l e ' ] [ ' t m p _ n a m e ' ] - каталог на сервере
web, где временно хранится файл. По умолчанию используется каталог
u p l o a d t e m p , расположенный в папке PHP.
$ _ F IL E S ['u p lo a d F ile '] ['nam e']
пользователя.
-
имя
файла в
системе
$ _ F I L E S [ ' u p l o a d F i l e ' ] [ ' s i z e ' ] - размер файла в байтах.
$ _ F I L E S [ ' u p l o a d F i l e ' ] [ ' t y p e ' ] - тип MIME файла.
$ _ F I L E S [ ' u p l o a d F i l e ' ] [ ' e r r o r ' ] - код ошибки, связанный с
пересылкой файла (0 - успешная пересылка, 1 - файл превышает
максимальный размер пересылки, 2 - файл превышает максимальный
размер файла, 3 - файл частично загружен, 4 - файл не загружен).
Следующие блоки кода показывают, как массив $ _ F I L E S используется
с функцией m o v e _ u p l o a d e d _ f i l e ( )
для создания простой
процедуры пересылки.
К.С. Флойд
Введение в программирование на PHP5
upload.php
<?php
if ($_PO ST[SubmitB] == 'Upload File")
{
move_uploaded_file ($_FILES['uploadFile'] ['tmp_name'],
". ./PHPTutorial/ECommerce/Databases/{$_FILES ['uploadFile'] ['name']}");
echo "Файл загружен.";
}
?>
<form enctype="multipart/form-data" action="upload.php" method="post">
Select File: <input type="file" name="uploadFile">
<input name="SubmitB" type="submit" value="Upload File">
</form>
Когда нажимается кнопка " U p l o a d F i l e ” , то файл, определенный в
< i n p u t t y p e = " f i l e " n a me = " u p l o a d F i l e " / > , автоматически
посылается во временную папку на сервере Web. Затем вызывается
функция m o v e _ u p l o a d e d _ f i l e () для перемещения файла. Первый
параметр функции, $ _ F I L E S [ ' u p l o a d F i l e ' ]
['tm p_nam e'],
становится ссылкой на файл, когда функция готовится к перемещению
его
в
конечное
место
назначения.
Второй
параметр,
" . . / P H P T u t o r i a l / E C o m m e r c e / D a t a b a s e s / {$ _ F I L E S [ ' u p l c
[ ' n a m e ' ] } " , является относительным путем доступа к папке, в
которой был временно сохранен файл. Последняя часть пути доступа
включает код { $ _ F I L E S [ ' u p l o a d F i l e ' ]
[ ' n a m e ' ] } . Это
можно интерпретировать как имя файла, который был введен в
К.С. Флойд
Введение в программирование на PHP5
текстовое поле f i l e с именем " u p l o a d F i l e " . Вкратце, функция
m ove_uploaded_file()
перемещает файл из временной папки
пересылки
folder
($_F IL E S ['uploadF ile']
[ ' tmp_name ' ] )
в
папку
"../PH PTutorial/E Com m erce/D atabases/),
и
файл
сохраняется
с
тем
именем,
которое
ввел
пользователь,
({$ _ F IL E S ['u p lo ad F ile']
[ ' n a m e ' ] } ) . Файлы
можно
пересылать в любой каталог на сервере Web, однако папка места
назначения должна иметь полномочия доступа для записи
(" w r i t e " ) .
Предыдущий пример кода иллюстрирует легкость пересылки файла, но с
предположением, что процесс пересылки всегда будет работать, а
ошибки никогда не будут происходить. Мы не рассмотрели, что
происходит, когда пользователь пытается переслать файл, который
превышает ограничение на размер, если папка загрузки не имеет
подходящих полномочий
безопасности
или
если
некоторые
непредвиденные сетевые проблемы мешают пересылке всего файла.
Чтобы улучшить приведенный выше код пересылки, необходимо
предоставить процедуры, которые проверяют ошибки и предоставляют
пользователю информацию о том, как исправить эти проблемы.
Следующие блоки кода показывают модифицированную версию
предыдущей процедуры пересылки, которая содержит проверку ошибок.
upload.php
<?php
if ($_PO ST[SubmitB] == "Upload File")
{
move_uploaded_file ($_FILES['uploadFile'] ['tmp_name'],
". ./PHPTutorial/ECommerce/Databases/{$_FILES ['uploadFile'] ['name']}");
if($_FILES['uploadFile'] ['error'] > 0)
{
switch ($_FILES['uploadFile'] ['error'])
{
case 1: echo 'Файл превышает максимальный серверный размер для
break;
case 2: echo 'Файл превышает максимальный размер файла';
break;
case 3: echo 'Файл загрузился только частично';
break;
case 4: echo 'Никакой файл не загрузился';
break;
}
}
else
{
echo 'Файл успешно загружен';
}
}
?>
<form enctype="multipart/form-data" action="upload.php" method="post">
Select File: <input type="file" name="uploadFile"/>
<input type="hidden" name='MAX_FILE_SIZE" value="1000000"/>
<input name="SubmitB" type="submit" value='Upload File"/>
</form>
П рим ер 1 1 . 2 .
К.С. Флойд
Введение в программирование на PHP5
Обновленный код включает оператор i f и оператор s w i t c h / c a s e
для проверки статуса пересылки файла. После выполнения функции
m o v e _ u p l o a d e d _ f i l e () оператор i f проверяет значение массива
$_FILES [ ' u p l o a d F i l e ' ]
[ ' e r r o r ' ] . Если значение больше 0,
то произошла ошибка. Значение
$_F IL E S ['u p lo ad F ile']
[ ' e r r o r ' ] передается оператору s w i t c h и проверяется. После этого
выводится соответствующее сообщение об ошибке. Если значение
$_FILES [ ' u p l o a d F i l e ']
[ ' e r r o r ' ] равно 0, оператор e l s e
выводит сообщение об успешном выполнении.
Еще одним новым свойством, включенным в этот пример, является
скрытое текстовое поле XHTML с именем " M A X _ F I L E _ S I Z E " . Это
специальный скрытый тег, который можно использовать с тегом f i l e ,
<input
type="file"
n a m e = " u p l o a d F i l e " / > , для задания
максимального размера файла. Если файл превышает определенное
значение, то произойдет ошибка. Это значение измеряется в байтах.
Здесь максимальный размер файла задан равным 1,000,000 байт
(приблизительно 1 мегабайт). Можно также задать максимальный
серверный размер пересылки. Это максимальный размер файла,
заданный на сервере в файле PHP. i n i .
Эта лекция описывает, как использовать службы SMTP для отправки
автоматических сообщений e-mail из приложений PHP
Этот раздел описывает, как использовать службы SMTP для отправки
автоматических сообщений e-mail из приложений PHP. E-mail
посылается с сервера Web через его службу простого протокола
пересылки почты SMTP. Как и предполагает название, это
ограниченная в возможностях служба e-mail, однако ее достаточно для
создания автоматических сообщений e-mail. Необходимо отметить, что
требуется сервер SMTP, чтобы можно было воспользоваться функциями
e-mail в PHP. В операционных системах XP Professional, Windows 2000
server и Windows 2003 server службы SMTP объединены с
информационными службами Интернет (IIS). В Linux/Unix популярными
пакетами SMTP являются Sendmail и Qmail
При выполнении PHP на сервере с помощью служб SMTP IIS, может
понадобиться сконфигурировать его, чтобы разрешить пересылку
сообщений e-mail. Выполните следующие действия.
1. Откройте инструменты администрирования IIS
2. Остановите используемую по умолчанию службу виртуального
сервера SMTP.
3. Откройте
окно
свойств
используемого
по
умолчанию
виртуального сервера SMTP.
4. Щелкните на вкладке "Access" и нажмите кнопку "Relay...".
5. Нажмите кнопку "Only the list below" и добавьте один компьютер с
IP-адресом 127.0.0.1.
6. Нажмите кнопку "OK", чтобы закрыть окно вкладок и свойств
"Access".
7. Перезапустите используемую по умолчанию службу виртуального
сервера SMTP.
Необходимо также сделать следующие изменения в конфигурационном
файле PHP — p h p . i n i - чтобы система PHP могла использовать
службы SMTP. Откройте файл p h p . i n i с помощью текстового
редактора и найдите следующие строки:
К.С. Флойд
Введение в программирование на PHP5
[mail function]
;For Win32 only
SMTP = localhost
;For Win 32 only
sendmail_from = me@localhost.com
Необходимо изменить директиву SMTP, чтобы она указывала на
используемый сервер SMTP. Если используются локальные службы
SMTP, то это значение должно быть задано как l o c a l h o s t . Вторая
директива s e n d m a i l _ f r o m является адресом email, применяемым в
заголовке F r o m исходящей почты e-mail. Должна быть задана
действительная учетная запись e-mail, если пользователям будет
разрешено отвечать на автоматически создаваемые сообщения e-mail.
В PHP имеется функция m a i l () для отправки e-mail. Эта функция
определена ниже:
m ail(string_to,
string_subject,
s t r i n g _ m e s s a g e , s t r i n g _ a d d i t i o n a l _ h e a d e r s ) - позволяет
посылать сообщение e-mail. Возвращает t r u e , если сообщение успешно
послано, иначе возвращается значение f a l s e .
Следующий пример демонстрирует использование функции m a i l () :
<?php
$to
= 'youraddress@domain.com';
$subject = 'PHP Mail';
$msg = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/1. phpversion();
mail($to, $subject, $msg, $headers);
?>
Первый шаг состоит в создании переменной для хранения адреса e-mail,
куда будет послано сообщение:
Это может быть любой действительный адрес e-mail. Несколько адресов
e-mail должны разделяться запятой ",".
Переменная $ s u b j e c t содержит тему сообщения e-mail. Эта строка
появится в строке s u b j e c t (тема) сообщения.
$subject="PHP Mail";
Основное содержание тела сообщения e-mail присваивается переменной
$ m s g . Если потребуется, то можно соединять несколько переменных
$ ms g вместе. Это часто бывает нужно, когда посылается длинное
описательное сообщение.
$msg = "Сообщение, созданное с помощью функции PHP mail().";
Затем создаются заголовки e-mail и присваиваются переменной
$ h e a d e r s . Заголовки e-mail являются строками в начале сообщений e
mail, которые определяют их структуру и делают их, по сути,
действительными почтовыми адресами. Хотя функция m a i l () может
использоваться без заголовков, рекомендуется включать заголовки
"From:" и "R ep ly -T o :"
$headers = "From: My Web Site <myaddress@mydomain.com>";
$headers .= "Reply-To: myaddress@mydomain.com";
Наконец, вызывается функция m a i l () для отправки сообщения:
mail($to,$subject,$msg, $headers);
В большинстве случаев параметры t o , s u b j e c t , и message функции
m a i l () не кодируются жестким образом, как показано в предыдущем
примере. Вместо этого они подставляются динамически в результате
ввода пользователя. Например, рассмотрим страницу, которая позволяет
пользователю электронным образом регистрироваться для получения
товара или услуги. Пользователь вводит имя, фамилию, адрес e-mail, и
номер телефона. Эта информация передается на страницу PHP, которая
анализирует информацию и посылает пользователю подтверждающее
сообщение e-mail. Следующий пример демонстрирует этот процесс:
К.С. Флойд
Введение в программирование на PHP5
<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN"
' http ://www.w3.org/TR/xhtmL1/DTD/xhtml11-transiljonal dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmllang="en" lang="en">
<head>
<title>Страница Web </title>
</head>
<body>
<h3> Страница регистрации </h3>
<form name="registration" method="post" action="emaiLphp">
First Name: <input type="text" name="fname"/>
Last Name: <input type="text" name="lname"/>
Email Address: <input type="text" name="email"/>
Telephone: <input type="text" name="telephone"/>
<input type="submit" name="Submit Registration"/>
</form>
</body>
</html>
Страница r e g i s t r a t i o n . h t m является стандартной страницей
формы XHTML, которая позволяет пользователю вводить имя,
фамилию, адрес e-mail и номер телефона. Когда нажимается кнопка
" S u b m i t R e g i s t r a t i o n ” , данные формы передаются на страницу
PHP e m a i l . p h p как переменные PHP $_POST [ ] :
$_POST [ ' f n a m e ' ] - содержит имя пользователя
$_POST [ ' l n a m e ' ] - содержит фамилию пользователя
$_POST [ ' e m a i l ' ] - содержит адрес e-mail пользователя
$_POST [ ' t e l e p h o n e ' ] - содержит номер телефона пользователя
К.С. Флойд
Введение в программирование на PHP5
Следующий
сценарий
показывает,
как
информация
анализируется и используется функцией m a i l () :
формы
<?php
$to = $_POST[email];
$subject = "Подтверждение регистрации";
$msg = "Дорогой: " . $_POST[fname] . " " . $_POST[lname] . ",\n\n";
$msg .= "Вы успешно зарегистрировались.";
$headers = "From: Registration Site <myaddress@mydomain.com>";
$headers .= "Reply-To: registration@mydomain.com";
mail($to, $subject, $msg, $headers);
?>
Страница emailphp получает значения из суперглобального массива
$_POST[] (содержащего значение, отправленные из registration.htm) и
присваивает их скалярным переменным, с которыми будет проще
работать. Затем создаются заголовки e-mail и вызывается функция mailQ.
Скалярные переменные передают функции необходимые параметры.
К.С. Флойд
Введение в программирование на PHP5
Приложение PHP E-Commerce
Общий проект сайта
Сайт e-Commerce
В данном разделе последовательно рассматривается процесс разработки
коммерческого сайта Web. В качестве примера используется база данных
товаров e C o m m e r c e . m d b . Товары будут предложены для онлайн
торговли. С помощью этого примера будут рассмотрены все основные
вопросы разработки онлайн магазина. Следующая иллюстрация
представляет страницы и механизмы связей, которые составляют
типичный сайт е-коммерции. Основные части этой системы описаны
ниже.
К.С. Флойд
Страница home.php
Введение в программирование на PHP5
К.С. Флойд
Введение в программирование на PHP5
Средство для поиска товара является частью всех страниц в качестве
основного метода навигации. Здесь используется два способа поиска
товаров: просмотр списка предложений в определенной категории
товаров и поиск товаров по ключевым словам. В то же самое время мы
отслеживаем посетителей, когда они перемещаются со страницы на
страницу. Задается механизм для идентификации пользователя и для
поддержания этой информации в течение всего посещения. Для этой
цели заказу присваивается уникальный номер.
Страница search.php
Процедуры поиска создают страницу, перечисляющую все товары в
категории или все товары, которые соответствуют критериям поиска.
Когда пользователь выбирает определенную категорию или задает
слово для поиска, эта информация передается на страницу
s e a r c h . p h p , используемую для поиска товаров.
Страница detail.php
Когда на странице s e a r c h . p h p выбирается определенный товар, это
действие соединяется со страницей d e t a i l . p h p , где выводится вся
информация
о
продукте,
включая
изображение.
Страница
d e t a i l . p h p должна получить идентификацию товара, чтобы извлечь
информацию. На этой странице пользователь может искать другие
товары или купить этот товар. Для добавления товара в корзину
покупателя создается кнопка " B u y " . Товар помещается в корзину
покупателя на этой странице, а затем происходит соединение со
страницей s h o p c a r t . p h p , чтобы посетитель мог просмотреть
содержимое своей корзины покупателя. Также доступно меню поиска,
чтобы можно было вернуться к процессу выбора товара.
Страница shopcart.php
Страница корзины покупателя перечисляет объекты в корзине
покупателя и предоставляет посетителю возможность изменить
К.С. Флойд
Введение в программирование на PHP5
количество единиц товара или удалить товары. Когда посетитель готов
купить
товар,
происходит
соединение
со
страницей
creditcheck.php.
Страница creditcheck.php
Эту страницу создавать не требуется. Необходимо только соединиться с
ней и предоставить идентификацию заказа, объем заказа и имя
страницы возврата. С заказчиком через защищенное соединение будет
взаимодействовать компания по обслуживанию кредитных карт.
Компания по обслуживанию кредитных карт возвращает код
подтверждения, а информация для выставления счета к оплате
собирается на странице формирования заказа.
Страница ordercapture.php
После получения кода возврата от компании кредитных карт остаются
завершающие задачи оформления — они происходят скрытно на этой
странице,
и
одной
из
них
является
создание
нового
идентификационного номера заказа на тот случай, если посетитель
захочет продолжить покупки. Товары в корзине покупателя заказчика
удаляются, и создаются заголовок заказа и другие записи для создания
постоянной записи заказа покупателя. Эти записи можно использовать
для восстановления заказа в будущем. Наконец создается подтверждение
e-mail, если заказчик предоставил адрес e-mail.
Страница salesorder.php
Эта страница выводит окончательный торговый заказ, чтобы заказчик
подтвердил покупку и напечатал копию. Отвергнутые заказы выводят
подтверждающее сообщение.
Когда мы перейдем к проектированию и кодированию этих страниц,
возникнут другие вопросы, которые потребуется решать. Мы можем
также придумать новые свойства, которые необходимо добавить на
К.С. Флойд
Введение в программирование на PHP5
страницы. Тем не менее, имеется достаточно хорошее представление,
что мы будем делать и как все это должно работать в совокупности.
Общая структура страниц
Здесь представлена общая модель компоновки всех страниц сайта Web
eCommerce. Разделы Content (Содержимое) страниц будут различаться в
зависимости от функции страницы. Однако разделы H e a d e r
(Заголовок) и Men u (Меню) одинаковы для всех страниц. Они создают
общий внешний вид страниц, плюс раздел Menu предоставляет общее
меню ссылок для перемещения и другие функции, которые доступны на
всех страницах.
Этот сайт использует свойства каскадных таблиц стилей (CSS) для
форматирования страниц и управления их представлением. Здесь будут
даны некоторые общие рекомендации без излишних подробностей.
Существует много специальных руководств по CSS, где можно найти
дополнительную информацию об их применении.
Код XHTML, задающий структуру всех страниц, имеет следующий вид:
<html>
<head>
^ й ^ С а й т eCommerce </title>
<link href="stylesheetEC.css" rel="stylesheet">
require("jscript.inc")
</head>
<body>
<div style="position:absolute; top:0px; left:0px; width:780px;
background-colorseagreen; colorwhite; padding:5px">
require("header.inc")
</div>
<div style="position:absolute; top:75px; left:10px; width:175px">
require("menu.inc")
К.С. Флойд
Введение в программирование на PHP5
</div>
<div style="position:absolute; top:75px; left:200px; width:550px">
— основное содержание страницы (контент) —
</div>
</body>
</html>
П рим ер I . 1 .
Теги < d i v > используются для создания общей компоновки страницы и
применяют спецификации таблиц стилей для точного размещения
разделов на странице. Имеется три отдельных раздела, содержащие
заголовок, меню и контент, которые будут выводиться на странице.
Такая компоновка соблюдается для всех страниц сайта, единственное
различие будет в разделе, содержащем основной контент этой
страницы.
Использование файлов INCLUDE
Разделы Header и Menu не кодируются непосредственно на всех
страницах. Используемый код содержится в документах h e a d e r . i n c и
m e n u . i n c , которые импортируются (включаются) на все страницы,
когда к ним обращается браузер.
Код, содержащийся во внешних документах, копируется или включается
на страницу PHP с помощью одного из следующих операторов:
require('FileName')
include('FileN ame')
Оба оператора выполняют одно и то же действие, однако оператор
r e q u i r e () возвращает неисправимую ошибку при неудаче, в то время
как оператор i n c l u d e () возвращает только предупреждение.
К.С. Флойд
Введение в программирование на PHP5
В обеих конструкциях F i l e N a m e является именем файла, содержащим
код, который копируется в это место документа. Включаемые файлы
могут содержать код XHTML, код PHP, код JavaScript, спецификации
таблиц стилей или обычный текст.
При использовании такой техники нет необходимости дублировать
общий код на каждой странице. Код можно поместить в отдельный
файл, а затем копировать на страницы по мере необходимости.
Эта техника работает только для страниц . p h p (а не страниц . h t m ).
Возможно, имеет смысл задавать имена всех страниц с расширением
. p h p , независимо от того, содержат ли они сценарий или нет.
Кодирование документов INCLUDE
Документы, включаемые на страницу, являются простыми текстовыми
документами, содержащими вставляемый код. Имя файла и расширение
этого документа могут быть произвольными. Расширение " . i n c "
используется здесь для идентификации документов h e a d e r . i n c и
m e n u . i n c как файлов, которые вставляются на страницу. Такие имена,
как h e a d e r . t x t и m e n u . t x t или h e a d e r . p h p и m e n u . p h p ,
также будут работать. Мы рассмотрим кодирование этих документов
немного позже. Существует еще один включаемый файл с именем
j s c r i p t . i n c , который копируется в раздел < h e a d > каждой
страницы. Этот документ содержит код JavaScript для управления
поведением кнопок. Мы рассмотрим этот код при обсуждении
отдельных страниц.
Когда общая компоновка создана, остается побеспокоиться только о
реальном "содержимом" отдельных страниц. Все остальное будет
делаться автоматически с помощью файлов INCLUDE.
Использование таблиц стилей
Как отмечалось выше, таблицы стилей интенсивно используются для
управления форматированием страниц. Для этой цели для сайта
К.С. Флойд
Введение в программирование на PHP5
подготовлен внешний документ s t y l e s h e e t E C . c s s и сохранен как
стандартный текстовый документ. Каждая страница сайта применяет
стили, соединяясь с этим документом с помощью тега < l i n k > раздела
<head>:
<html>
<head>
<title>Page Title</title>
<link type='text/css" href="stylesheetEC.css" rel=stylesheet">
</head>
Общая таблица стилей, используемая сайтом e C o m m e r c e , показана
ниже, а остальные стили оформления применяются индивидуально к
элементам страницы по мере необходимости.
stylesheetEC.css
body
{margin:0px; background-colorwhite; font-family:arial; font-size:9pt}
td
{font-family:arial; font-size:9pt}
th
{font-family:arial; font-size:9pt; text-align:center;
background-color:seagreen; colorwhite}
.headl
{font-familytimes new roman;
color:seagreen}
.head2
{font-familytimes new roman;
color:seagreen}
.head3
{font-familytimes new roman;
color:seagreen}
.head4
{font-familytimes new roman;
color:seagreen}
a:link, a:active, avsited
font-size:18pt; font-weight:bold;
font-size:16pt; font-weight:bold;
font-size:14pt; font-weight:bold;
font-size:12pt; font-weight:bold;
К.С. Флойд
Введение в программирование на PHP5
(text-decoration:none; color:seagreen}
a:hover
{text-decoration:none; color:darkgreen; background-colordightgreen}
.buttonS
{width:35px; text-align:center; font-family:arial; font-size:9pt;
background-color:seagreen; colorwhite}
.buttonM
{width:70px; text-align:center; font-family:arial; font-size:9pt;
background-color:seagreen; colorwhite}
.buttonL
{width:100px; text-align:center; font-family:arial; font-size:9pt;
background-color:seagreen; colorwhite}
.textbox
{font-family:arial; font-size:10pt}
.qtybox
{font-family:arial; font-size:10pt; text-align:right}
.small
{font-family:arial; font-size:8pt}
П рим ер I . 2 .
Выбор категорий продуктов
Все страницы сайта eCommerce содержат раздел ссылок для поиска
информации о программном обеспечении, содержащейся в таблице
Products базы данных eCommerce.mdb.
К.С. Флойд
Введение в программирование на PHP5
Homs
Shopping Cart
Software Categories
Business Office
Database
Desktop Publishing
Graphics
Operating Systems
Web Development
Search for
Посетители сайта могут просматривать названия программных
продуктов двумя способами. Через множество ссылок на категории
продуктов посетитель может вывести все продукты, которые попадают
в эту категорию, а через поиск по ключевому слову пользователь может
вывести все продукты, которые содержат ключевое слово в одном из
полей в их записях в базе данных. Результат любого поиска создает
список подходящих кодов продуктов, названий и цен.
Файл menu.inc
Меню поиска сделано доступным на всех страницах с помощью файла
INCLUDE, который можно импортировать и поместить в разделе,
расположенном вдоль левого края страницы. Этот файл m e n u . i n c
содержит код, позволяющий посетителю выбрать категорию продукта
или ввести ключевое слово для поиска. Реальный поиск и вывод
подходящих продуктов происходит, однако, на странице s e a r c h . p h p .
Поэтому выбор категории или ключевого слова включает ссылку на
страницу s e a r c h . p h p , и искомое значение передается на эту
страницу в строке запроса.
К.С. Флойд
Введение в программирование на PHP5
m enu.inc
search.php
S e a ix li rasiitts
S c to it Calegorifu:
Business Office
—
-------------------------►
Di.lap.fse
?C ale go ry= D u; in e s s Office
Desktop Publishing
Graphics
Operating Systems
Wen Development
сй(ЙЯ¥ B u s iiif s н ОШ с t
omce 20-P0 Professional
*259-95
BU2232
vfOFdPeusei omte :сюз
БОЗЗЗЗ
Project 3D00
1264 96
Я39 96
S гi i n li results Torthteiion b u snirfis
?C cite rio rF b us i ness
BOl 111
Office 25 00 Prefessipna I
J?59 96
BU2222
WordPerfect Office 2000
*264 9$
визэзз
Pfijedjooo
1439 99
OS 2227
Windows 2£li>0 Professional
J269.96
/« 4 ^ 4
CaidFbisian. Studio 4 5
И T9 95
Сначала мы рассмотрим, как создать варианты выбора категорий
продуктов для поиска, а затем рассмотрим поиск по ключевым словам.
Оба эти метода содержатся в файле m e n u . i n c , который
импортируется на все страницы сайта eCommerce. После отдельного
рассмотрения кодирования этих методов поиска будет представлена вся
страница m e n u . i n c .
Создание ссылок на категории
Множество ссылок на страницу s e a r c h . p h p , через которые
передается выбранная категория, основывается на типе продукта.
I t e m T y p e является одним из полей таблицы P r o d u c t s . Поэтому эти
типы необходимо извлечь из таблицы, а затем форматировать как
ссылки на страницу s e a r c h . p h p . Следующий код в файле me n u . i n c
делает варианты выбора доступными на всех страницах.
<span dass="head4">Категории программ:</span>
<table>
<?php
//Создание соединения с данными
$conn = odbc_connect
К.С. Флойд
Введение в программирование на PHP5
(Driver={Microsoft Access Driver (*.mdb)}; DBQ=c\inetpub\wwwroot\PHPr
//Формирование оператора SQL SELECT
$sql = "SELECT DISTINCT ItemType FROM Products ORDER BY ItemTyp
//Выполнение оператора SQL и создание множества записей
$rs = odbc_exec($conn, $sql);
//Цикл по множеству записей и вывод необходимых записей
while($row = odbc_fetch_array($rs))
{
echo "<tr style=\"color:seagreen; line-height:8pt; font-size:9pt\"
onMouseOver=\"this.style.backgroundColor='lightgreen';
this. style.color-darkgreen'; this. style.cursor='hand'\"
onMouseOut=\"this.style.backgroundColor='white';
this.style.color='seagreen'\"
onClick=\"location.href='search.php?Category=$row[ItemType]'
<td>$row[ItemType]</td>
</tr>";
}
//Закрытие соединения с базой данных
odbc_close($conn);
?>
</table>
П рим ер I . 3 .
Здесь делается соединение с базой данных и извлекается множество
записей из таблицы P r o d u c t s . Это множество записей содержит
К.С. Флойд
Введение в программирование на PHP5
уникальные значения, которые находятся в поле I t e m T y p e ,
получаемые при использовании оператора SQL SELECT с параметром
D I S T I N C T . Каждая запись в множестве записей $ r s содержит одно
значение - один из типов объектов в поле. Теперь необходимо просто
выполнить итерации по множеству записей, форматируя ссылки для
значений категорий.
Выделение строки таблицы и соединение
Значения I t e m T y p e выводятся в таблице, чтобы воспользоваться
средствами таблицы стилей, которые предоставляют интересный метод
присвоения ссылок ячейкам таблицы, а не самим значениям. Значения
I t e m T y p e появляются в таблице в следующем виде и выделяются,
когда указатель мыши перемещается по записям (вокруг таблицы
показана граница, чтобы эффект был более заметен):
Business Office
Database
Desktop Publishing
Graphics
Operating Systems
jWeb Developmenl
Ссылки делаются из ячеек таблицы - на самом деле из строк таблицы а не из текстовых строк, появляющихся внутри ячеек. Это позволяет
присвоить выделение и визуальные индикаторы строкам, когда
указатель мыши перемещается по ним, а ссылки активируются при
щелчке на строках таблицы, содержащих данные, а не на самих данных.
Такой метод соединения из строк таблицы более четко иллюстрируется
списком продуктов, появляющимся на странице s e a r c h . p h p . Такая
же техника используется здесь, хотя эффект не такой впечатляющий, как
выделение и соединение из нескольких ячеек в строке.
Эти действия по выделению и соединению создаются следующим
кодом для строк таблицы. Особенно отметим, что код находится внутри
тега < t r > , так что результат проявляется во всех ячейках строки (хотя в
К.С. Флойд
Введение в программирование на PHP5
данном конкретном случае в строке имеется только одна ячейка).
<tr style="cobr:seagreen; ]ine-height:8pt; font-size:9pt"
onMouseOver="this.styb.backgromdCobr=']ightgreen';this.styb.rabr='darkgr
this.style.cursor='hand'"
onMouseOut="this.sty]e.backgroundCo]or='white';this.sty]e.color='seagreen'"
onC]ick="bcatbahref='search.php?Category=$row[ItemType]"'
>
<td>$row[ItemType]</td>
</tr>
Свойства таблицы стилей используются для создания начального вида
строк в ячейках. Свойство color задает цвет текста, выводимого в
ячейках, свойство
line-height
задает высоту текста (и
соответственно высоту самой ячейки), а свойство f o n t - s i z e задает
размер шрифта текста.
Кроме этих статических свойств необходимо добавить свойства,
которые изменяются, когда посетитель взаимодействует с ячейками. Мы
хотим, чтобы "что-то происходило", когда посетитель перемещает курсор
над ячейками, смещается с ячеек и щелкает в ячейке. Описанные
события являются фактически событиями сценариев, которые в языке
JavaScript называются o n M o u s e O v e r , o n M o u s e O u t и o n C l i c k .
Поэтому эти события можно использовать для включения изменений в
стилях оформления ячеек таблицы.
Теги XHTML со сценарием
Процедуры JavaScript добавляются в теги < t r > для задания различных
стилей и для включения ссылок, когда посетитель выполняет одно из
трех указанных выше действий. Эти события и действия перечислены в
следующей таблице.
Событие
Действие
this.style.backgroundC olor=']ightgreen'
onmouseover this.style.cobr-darkgreen'
К.С. Флойд
Введение в программирование на PHP5
this.style.cursor-hand'"
this.style.backgroundC olor-white'
onmouseout
onclick
this.style.color-'seagreen'
location.href='search.php...'
Когда мышь перемещается поверх строки таблицы, включается событие
o n m o u s e o v e r и выполняются три оператора JavaScript. Цвет фона
(свойство b a c k g r o u n d C o l o r ) строки задается как светло-зеленый (
l i g h t g r e e n ), цвет текста (свойство c o l o r ) задается как темно
зеленый ( d a r k g r e e n ), а форма курсора (свойство c u r s o r ) задается
в форме ладони. Когда курсор мыши смещается со строки таблицы,
включается событие onmouseout и свойства возвращаются к своим
исходным значениям.
Общий формат выполнения команд JavaScript внутри тега HTML имеет
вид
EventName = "statementl [; statement2] [; statement3]..."
То есть за именем o n m o u s e o v e r , o n m o u s e o u t , o n c l i c k или
другим таким именем события, для которого будет применяться
действие, следует знак равенства и в кавычках список операторов,
которые будут выполнены, когда произойдет событие. Несколько
операторов разделяются точкой с запятой.
Операторы, используемые для задания свойств, имеют следующий
формат,
this.style.property-'value'
где s t y l e является указанием на задание таблицы стилей, p r o p e r t y
является формальным именем задаваемого свойства, а значение v a l u e
(заключенное в кавычки) является конкретным значением для задания
этого свойства. Специальное ключевое слово s e l f является ссылкой
на себя объекта XHTML, содержащего это задание свойства, в данном
случае тег < t r > .
К.С. Флойд
Введение в программирование на PHP5
Когда происходит событие o n C l i c k , создается ссылка на страницу
s e a r c h . p h p . Соединение происходит при задании свойству
l o c a t i o n . h r e f (не тега < t r > , а текущего окна) имени страницы, на
которую указывает ссылка. Это задание свойства приводит к замене
URL в поле адреса браузера другим URL, в данном случае адресом
страницы s e a r c h . p h p .
Передача строк запроса
Когда делается ссылка из категории продуктов (в действительности из
строки таблицы) на страницу s e a r c h . p h p , то принимающая
страница должна знать, какая категория продуктов была выбрана, чтобы
создать список подходящих продуктов этой категории. Эта информация
передается на страницу s e a r c h . p h p
через строку запроса,
присоединенную к URL ссылки. Для каждой категории в списке меню
(для каждой строки таблицы), значением строки запроса будет то же
самое значение I t e m T y p e , которое выводится в ячейке таблицы:
onClick="bcationhref='search.php?Category=$row[ItemType]'"
Когда происходит щелчок на строке таблицы, создается URL в виде
search.php?Category=ItemType
Все строки таблицы содержат различные типы объектов, и это
конкретное значение I t e m V a l u e присоединяется к URL этой строки.
Одна из пар имя/значение
?Category=Business Office
?Category=Database
?Category=Desktop Publishing
?Category=Graphics
?Category=Operating Systems
?Category=Web Development
посылается на страницу s e a r c h . p h p , информируя эту страницу о
разыскиваемом типе для выполнения поиска программных продуктов,
попадающих в эту категорию.
Кроме выбора категорий продуктов для поиска названия программного
продукта, посетители сайта e C o m m e r c e могут использовать общий
поиск по ключевым словам.
Homs
Shopping Cart
Software Categories
Business Office
Database
Desktop Publishing
Graphics
Operating Systems
Web Development
Search for
Посетители могут ввести слово или фразу в текстовое поле, и
процедура поиска найдет все записи в таблице P r o d u c t , которые
содержат эту текстовую строку: Файл me n u . i n c поэтому содержит код
для представления этого текстового поля ввода и для передачи
введенного текста на страницу s e a r c h . p h p , где происходит реальный
поиск подходящих продуктов.
Текстовое поле ввода кодируется в форме, находящейся в файле
m e n u . i n c . Форма выводит текстовое поле вместе с кнопкой для
отправки информации формы на страницу s e a r c h . p h p .
<form action="search.php" method="get">
<span class="head4">Search for:</span><br>
<input type="text" name="Criterion" class="textbox" size="12"
value="<?php echo $_GET[Criterion]?>">
<input type="submit" class-buttonS" name="Submit" value="Go"
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
</form>
В этой форме необходимо обратить внимание, прежде всего, на атрибут
m e t h o d = " g e t " . До сих пор для передачи информации формы
использовался метод POST. Этот метод передает пары имя/значение из
формы на сервер как отдельный поток данных в URL запроса атрибута
ACTION. В данном случае метод GET передает пары имя/значение как
строку запроса, присоединенную к URL в параметре AC T I ON.
Причина применения метода GET в этом приложении состоит в
желании получить согласованность с предыдущими ссылками на
категории объектов. Эти ссылки передают выбранную категорию
продуктов на страницу s e a r c h . p h p как строку запроса. Эта форма
делает то же самое для поиска по ключевым словам. Когда посетитель
вводит слово или фразу в текстовое поле и нажимает кнопку отправки,
в форме создается URL
search.php?Criterion=value
и значение в текстовом поле соединяется с именем C r i t e r i o n для
передачи на сервер. Таким образом, когда страница s e a r c h . p h p
получает имя категории или ключевое слово, они будут получены в
форме строки запроса, различаясь только именами и значениями:
search.php?Category=value из ссылки
search.php?Criterion=value из формы
Отметим также, что текстовое поле имеет значение строки запроса
C r i t e r i o n , которая передается на сервер, когда посылается форма:
<input type='text" name="Criterion" dass="textbox" size="12"
value="<?php echo $_GET[Criterion]?>"
Когда посылается эта форма, создается URL для страницы
s e a r c h . p h p и в него добавляется строка запроса, содержащая
введенное в это поле значение. Помните также, что файл m e n u . i n c ,
частью которого является эта форма, появляется на всех страницах,
включая страницу s e a r c h . p h p . Поэтому когда загружается страница
К.С. Флойд
Введение в программирование на PHP5
s e r a c h . p h p , вместе с этой формой, содержащейся в файле
m e n u . i n c , текстовое поле отражает переданное на страницу значение
C r i t e r i o n . Поэтому значение присутствует в текстовом поле, хотя
оно находится в другой форме на другой странице.
Кнопки форматирования
Используемая на этой форме кнопка отправки отличается от
используемых обычно кнопок. Она имеет другой размер и цвет и
изменяет цвет, когда указатель мыши перемещается над ней.
Начальный вид кнопки задается спецификацией таблицы стилей.
Определяется класс таблицы стилей для задания ширины кнопки,
выравнивания текста, типа и размера шрифта, цвета фона и цвета
текста:
.buttonS {
width:35px;
text-align:center;
font-family:arial;
font-size:9pt;
background-colorseagreen;
colorwhite;
}
Эти настройки применяют, задавая атрибут
присваивается имя этого класса в теге кнопки:
CLASS,
которому
<input type="submit" class-buttonS" name="Submit" value-'Go"... >
Изменения в спецификациях стиля оформления происходят, когда
указатель мыши перемещается над кнопкой и когда он смещается с
кнопки. Эти изменения активируются операторами JavaScript,
кодируемыми в теге кнопки:
<input type="submit" class-buttonS" name="Submit" value="Go"
К.С. Флойд
Введение в программирование на PHP5
onMouseOver="OverMouse(this)" onMouseOut="OutMouse(this)">
События onMouseOver и onMouseOut активируют вызовы функций
O v e r M o u s e ( ) и O u t M o u s e ( ) , соответственно, передавая ссылку
s e l f на объект (эту кнопку), содержащий эти обработчики событий.
Эти функции затем получают ссылку на эту кнопку отправки для
применения сценария.
Кодирование сценария в функциях имеет две задачи. Первое: сценарии
содержат несколько операторов, что делает их неудобными для
кодирования внутри отдельных кнопок. Второе: функции можно
вызывать из любых кнопок, на которые нужно оказать воздействие. Это
означает, что функции должны быть доступны на всех страницах, чтобы
можно было применить любую кнопку на этих страницах.
Как было сделано для заголовка и меню, которые присутствуют на всех
страницах, код JavaScript для активации кнопок находится во
включаемом файле, который можно импортировать на любую страницу.
Обычный метод импортирования кода JavaScript состоит во включении
его в раздел <HEAD> страницы, чтобы процедуры загружались и были
доступны для активации до загрузки раздела <BODY>. Поэтому все
страницы сайта e C o m m e r c e включают директиву
require(jscript.inc)
в своих разделах <HEAD>. Код файла jscript.inc показан ниже:
jscript.inc
<script language="javascript">
function OverMouse(button)
{
button. style .backgroundC olor=' lightgreen"
button.style.color='darkgreen'
button. style.cursor-hand'
}
function OutMouse(button)
{
button. style .backgroundC olor-' 'seagreen"
button. style.color-white'
</script>
Вспомните, что обе функции получают ссылку на нажатую кнопку. Эта
ссылка будет получена как переменная b u t t o n , поэтому любая ссылка
на b u t t o n (кнопка) является ссылкой на реальную кнопку, которая в
данный момент находится под курсором мыши или с которой курсор
мыши был только что смещен. Две функции просто задают различные
стили для кнопки в зависимости от того, какое действие совершил
пользователь.
Кодирование файлов INCLUDE
Все страницы сайта e C o m m e r c e имеют одинаковый общий формат и
содержат одинаковую информацию, за исключением специфической
информации страницы. Это сходство достигается с помощью трех
файлов INCLUDE, которые копируются на все страницы. Здесь мы
рассмотрим эти файлы.
Форматы страниц
Следующий код воспроизводит общую компоновку всех страниц и
показывает, где и как размещаются включаемые файлы в
соответствующих местах страниц.
<html>
<head>
^ й ^ С а й т eCommerce</title>
<link href="stylesheetEC.css" rel="stylesheet">
<?php require(jscriptinc') ?>
</head>
<body>
<div style="position:absolute; top:0px; left:0px; width:780px;
background-colorseagreen; colorwhite; padding:5px">
<?php require('header.inc') ?>
</div>
<div style="position:absolute; top:75px; left:10px; width:175px">
<?php require('menu.inc') ?>
</div>
<div style="position:absolute; top:75px; left:200px; width:550px">
— основной контент страницы —
</div>
</body>
</html>
П рим ер I . 4 .
Файл header.inc
Файл h e a d e r . i n c импортируется в верхний раздел каждой
страницы. Код использует линейные спецификации стиля для создания
верхнего баннера. Файл содержит не слишком много кода, но его можно
расширить, чтобы включить многие другие свойства, которые могут
понадобиться в заголовке страниц.
header.inc
<span style="font-size:32pt; font-weight:bold">softWarehouse.com</span>
Файл menu.inc
Файл m e n u . i n c импортируется в крайний левый раздел всех страниц,
чтобы создать общедоступное меню поиска продуктов. Полный код
К.С. Флойд
Введение в программирование на PHP5
этого файла, различные части которого были рассмотрены ранее,
показан ниже.
menu.inc
<a href="home.php">Home</a>
<a href="shopcart.php">Shopping Cart</a>
<br>
<br>
<span dass="head4">Software Categories:</span>
<table>
<?php
//Создание соединения с данными
$conn = odbc_connect
(Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPr
//Формирование оператора SQL SELECT
$sql = "SELECT DISTINCT ItemType FROM Products ORDER BY ItemTyp
//Выполнение оператора SQL и создание множества записей
$rs = odbc_exec($conn, $sql);
//Цикл по множеству записей и ввод необходимых записей
while($row = odbc_fetch_array($rs))
{
echo "<tr style=\"color:seagreen; line-height:8pt; font-size:9pt\"
onMouseOver=\"this.style.backgroundColor='lightgreen';
this. style.color-darkgreen'; this. style.cursor='hand'\"
onMouseOut=\"this.style.backgroundColor='white';
this.style.color='seagreen'\"
onClick=\"location.href='search.php?Category=$row[ItemType]'
<td>$row[ItemType]</td>
</tr>";
}
//Закрытие соединения с БД
odbc_close($conn);
?>
</table>
<form action="search.php" method="get">
<span dass="head4">Search for:</span><br>
<input type="text" name="Criterion" class="textbox" size="12"
value="<?php echo $_GET[Criterion]?>">
<input type="submit" dass="buttonS" name="Submit" value="Go"
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
</form>
П рим ер I . 5 .
Файл jscript.inc
Наконец, ниже воспроизводится файл jscript.inc.
jscript.inc
<script language="javascript">
function OverMouse(button)
{
button. style .backgroundC olor=' lightgreen"
button.style.color='darkgreen'
button. style.cursor-hand'
}
function OutMouse(button)
{
button. style .backgroundC olor-' 'seagreen"
button. style.color-white'
</script>
Важно отметить, что файлы INCLUDE содержат только показанный
здесь код. В них нет тегов <HTML> или <BODY> либо какого-либо
другого кода, кроме того, который нужен для определенных целей
файла. Эти файлы импортируются в полностью сформированную
страницу HTML, и можно создать проблемы с выводом, если включить
в эти файлы больше информации, чем требуется.
Имея это общее представление и функции, теперь станет значительно
легче сконцентрироваться на кодировании основного контента каждой
страницы сайта.
Поиск продуктов
Страница s e a r c h . p h p вызывается для выполнения поиска в таблице
P r o d u c t s с помощью одного из двух методов. Поиск категории
продукта находит все названия программных продуктов в этой
категории на основе соответствующего значения I t e m T y p e в их
записях. Поиск по ключевым словам находит все названия программных
продуктов, содержащие ключевое слово в одном из своих полей. В
обоих случаях создается список из полей I t e m N u m b e r , I t e m T i t l e ,
и I t e m P r i c e соответствующих записей о продуктах. Список
продуктов соединяется также со страницей d e t a i l . p h p , где
представлена вся информация о продукте.
К.С. Флойд
?С ate до гу= Вus in ess Office
Получение строк запросов
Когда загружается страница s e a r c h . p h p она получает строку запроса
со страницы, на которой был сделан запрос поиска категории или
поиска по критерию. Возможны два вида строк запроса:
?Category=CategoryName
?Criterion=KeywordValue
Одной из первых задач на этой странице поэтому является получение
этого значения из массива строки запроса R e q u e s t . Q u e r y S t r i n g ,
который создается, когда пара имя/значение попадает на сервер.
Обычно в массиве доступно одно из двух значений. Однако в одном
случае нет ни одного значения. Это происходит, когда форма поиска
отправляется с пустым полем критерия поиска. В этом случае нет
имени категории или значения ключевого слова на этой странице. Все
эти ситуации учитываются в следующем сценарии, который появляется
в верхней части страницы s e a r c h . p h p .
<?php
$Category = $_GET[Category];
$Criterion = $_GET[Criterion];
К.С. Флойд
Введение в программирование на PHP5
if ($Category == "" && $Criterion == "")
{
header(' "Locationhome.php'');
}
?>
Значения строки запроса присваиваются переменным C a t e g o r y
(Категория) и C r i t e r i o n (Критерий). Отметим также, что если оба
эти значения будут n u l l , в соответствии с описанной выше ситуацией,
то посетитель немедленно перенаправляется на страницу h ome . p h p .
В этом случае нечего искать.
Структура страницы
Основное содержимое этой страницы кодируется внутри третьего
раздела страницы (напомним, что первый раздел включает файл
h e a d e r . i n c , а второй раздел включает файл m e n u . i n c ). Именно в
этом разделе используются две процедуры поиска. Страница поэтому
имеет следующую структуру:
<?php
$Category = $_GET[Category];
$Criterion = $_GET[Criterion];
if ($Category == "" && $Criterion == "")
{
header(' "Locationhome.php'');
}
?>
<html>
<head>
<Ше>Сайт eCommerce</title>
<link href="stylesheetEC.css" rel="stylesheet">
К.С. Флойд
Введение в программирование на PHP5
<<?php require("jscript.inc") ?>
</head>
<body>
<div style="position:absolute; top:0px; left:0px; width:780px;
background-color:seagreen; colorwhite; padding:5px">
<?php
require("header.inc")
?>
</div>
<div style="position:absolute; top:75px; left:10px; width:175px">
<?php
require("menu.inc")
?>
</div>
<div style="position:absolute; top:75px; left:200px; width:550px">
if ($Category != "') {
...code for category search
}
if ($Criterion != "") {
...code for keyword search
}
</div>
</body>
</html>
П рим ер I . 6 .
Если имеется значение C a t e g o r y , то это значение было передано на
К.С. Флойд
Введение в программирование на PHP5
эту страницу и должно использоваться для поиска категории. Если, с
другой стороны, на страницу было передано значение C r i t e r i o n , то
должен выполняться этот тип поиска.
Программирование поиска категории
Для продукта соответствующего значению C a t e g o r y , переданного на
эту страницу, подходящие записи представляют в таблице. Из
подходящих записей выводятся три поля: I t e m N u m b e r , I t e m T i t l e ,
и I t e m P r i c e . Код начинается с вывода заголовка таблицы и
заголовков столбцов над значениями таблицы. На следующем листинге
значение переменной C a t e g o r y выводится в заголовке, чтобы помочь
идентифицировать результаты поиска.
if ($Category != "") {
<span dass="head3">Поиск</span>результатов для категории
<span dass="head3"><?php echo $Category ?></span>:
<br>
<br>
<table border="0" cellpadding="3">
<tr>
<th>Item Number</th>
<th>Item Title</th>
<th>Item Price</th>
</tr>
Вслед за этим на странице выводятся результаты поиска. Каждая запись
таблицы P r o d u c t , которая имеет значение I t e m T y p e , совпадающее
со значением переменной C a t e g o r y , выбирается для вывода полей
I t e m N u m b e r , I t e m T i t l e , и I t e m P r i c e . Каждая запись продукта
появляется в отдельной строке таблицы вывода. Реализующий это код
показан ниже.
<?php
$conn = odbc_connect
('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c\inetpub\wwwroot\PHPr
//Формирование оператора SQL SELECT
К.С. Флойд
Введение в программирование на PHP5
$sql = "SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE Ite
//Выполнение оператора SQL для создания множества записей
$rs = odbc_exec($conn, $sql);
//Цикл по множеству записей и вывод необходимых записей
while($row = odbc_fetch_array($rs))
{
$ItemNumber = $row[ItemNumber];
$ItemTitle = $row[ItemTitle];
$ItemPrice = number_format($row[ItemPrice],2);
echo " <tr style=\"color:seagreen; line-height:8pt\"
onMouseOver=\"this.style.backgroundColor='lightgreen';this.style.color='di
this.style.cursor='hand'\"
onMouseOut=\"this.style.backgroundColor='white';this.style.color='seagree
onClick=\"location.href='detail.php?ItemNumber=$row[ItemNumber]\" .
\"&Category=$Category\">
<td>$ItemNumber</td>
<td>$ItemTitle</td>
<td a]ign=\"right\">$$ItemPrice</td>
</tr>";
}
odbc_close($conn);
?>
</table>
<?php
}
?>
П рим ер I . 7 .
Сценарий начинается с соединения с базой данных e C o m m e r c e . mdb
К.С. Флойд
Введение в программирование на PHP5
и создания объекта множества записей с именем R S C a t e g o r y для
извлечения подходящих записей из таблицы P r o d u c t s . Выбираются
записи, в которых значение I t e m T y p e совпадает со значением
переменной C a t e g o r y , содержащей значение строки запроса:
SQL="SELECT ItemNumber,Itemlitle,ItemPrice FROM Products
WHERE ItemType= ^Category1ORDER BY ItemNumber"
Сценарий выполняет итерации на множестве выбранных записей,
выводя каждую по очереди в строке таблицы. Значения множества
записей присваиваются переменным, чтобы упростить с ними работу.
$ItemNumber = $row[ItemNumber]
$ItemTitle = $row[ItemTitle]
$ItemPrice = number_format($row[ItemPrice],2)
<td>echo $ItemNumber</td>
<td>echo $ItemTitle</td>
<td align="right">$echo $ItemPrice</td>
Отметим, что для переменной $ I t e m P r i c e перед присваиванием
была использована функция PHP n u m b e r _ f o r m a t , чтобы вывод был
представлен в долларах и центах. Значение также выравнивается
вправо в ячейке таблицы.
Соединение из строк таблицы
В этой таблице, как и в таблице ссылок на категории в файле
m e n u . i n c , вся строка таблицы является ссылкой на страницу
d e t a i l . p h p , где приводится полное описание продукта. Эти ссылки
и их визуальные эффекты создают, программируя каждый тег < t r >
реагировать на события перемещения указателя мыши над строкой и на
щелчок мыши.
<tr style="color:seagreen; line-height:8pt"
onMouseOver="this.style.backgroundCobr-lightgreen';this.style.ralor-darkgr
this.style.cursor-hand'"
onMouseOut="this.style.backgroundCobr-white';this.style.ralor-seagreen'"
К.С. Флойд
Введение в программирование на PHP5
onClick="bcatioahref='detaiLphp?ItemNumber=echo $ItemNumber&Categor
>
Здесь также линейная спецификация стиля задает для строки
используемый по умолчанию цвет текста и толщину линий. Затем
встроенные обработчики событий JavaScript динамически изменяют
визуальные стили оформления строки на события перемещения курсора
мыши. Кроме того, событие o n C l i c k создает запрос URL для
страницы d e t a i l . p h p . Этот URL форматируется для передачи на
страницу d e t a i l . p h p строки запроса, содержащей I t e m N u m b e r
продукта этой строки, вместе с переменной C a t e g o r y , которая была
передана на эту страницу из меню поиска. Использование этого
последнего элемента строки запроса рассматривается при обсуждении
страницы d e t a i l . p h p .
После вывода всех строк таблицы множество записей и соединение
закрываются, и записывается закрывающий тег < / t a b l e > . Все
продукты запрошенной категории выводятся в таблице вместе со
ссылками на страницу d e t a i l . p h p , где предоставляется полная
информация о продукте.
Программирование поиска по ключевым словам
Поиск по ключевым словам действует почти таким же образом, как и
поиск по категории. Основное различие состоит в способе извлечения
записей о продуктах из таблицы P r o d u c t s . Первая часть сценария
будет идентичной, за исключением вывода значения C r i t e r i o n ,
переданного в строке запроса, а не значения C a t e g o r y .
<% If Criterion <> "" Then %>
<span class="head3">Search</span>results for criterion
<span class="head3">echo $Criterion</span>:
<br>
<br>
<table border="0" cellpadding="3">
<tr>
<th>Item Number</th>
<th>Item Title</th>
К.С. Флойд
Введение в программирование на PHP5
<th>Item Price</th>
</tr>
Следующий листинг кода показывает процедуру поиска всех продуктов,
содержащих значение в одном из своих полей, которое совпадает со
значением C r i t e r i o n , переданным на страницу из меню поиска.
<?php
$conn = odbc_connect
('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c\inetpub\wwwroot\PHPr
$sql = "SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE'
$sql = $sql . " ItemNumber LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemType LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemProducer LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItenflMe LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemDescription LIKE '%" . $Criterion . "%'";
$sql = $sql . " ORDER BY ItemNumber";
//Выполняется оператор SQL и создается множество записей
$rs = odbc_exec($conn, $sql);
//Цикл по множеству записей и вывод необходимых записей
while($row = odbc_fetch_array($rs))
{
$ItemNumber = $row[ItemNumber];
$ItemTitle = $row[ItemTitle];
$ItemPrice = number_format($row[ItemPrice],2);
echo "<tr style=\"color:seagreen; ]ine-height:8pt\"
onMouseOver=\"this.style.backgroundCobr-lightgreen';this.style.cobr-dar
this.style.cursor='hand'\"
onMouseOut=\"this.style.backgroundCobr-white';this.style.cobr-seagreen
К.С. Флойд
Введение в программирование на PHP5
onClick=Y location.href='detaiLphp?ItemNiimber=$ItemNumberY' .
Y'&Criterion=$Criterion'\">
<td>$ItemNumber</td>
<td>$ItemTitle</td>
<td align=\"right\">$$ItemPrice</td>
</tr>";
}
odbc_close($conn);
?>
</table>
<?php
}
?>
П рим ер I . 8 .
Как можно видеть, единственное реальное различие в двух сценариях
состоит в том, что поиск по ключевым словам использует более
сложную команду SQL SELECT для поиска подходящих продуктов:
$sql =
$sql =
$sql =
$sql =
$sql =
$sql =
$sql =
"SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE";
$sql . " ItemNumber LIKE '%" . $Criterion . "%'";
$sql . " OR ItemType LIKE '%" . $Criterion . "%'";
$sql . " OR ItemProducer LIKE '%" . $Criterion . "%'";
$sql . " OR ItemTitle LIKE '%" . $Criterion . "%'";
$sql . " OR ItemDescription LIKE '%" . $Criterion . "%'";
$sql . " ORDER BY ItemNumber";
Так как получается очень длинный оператор SELECT, то он составлен
из отдельных частей. Каждая последующая часть строки поиска
присоединяется в конце предшествующей строки для создания всего
оператора SELECT в переменной $ s q l .
К.С. Флойд
Введение в программирование на PHP5
Как и раньше, извлекаются только поля I t e m N u m b e r , I t e m T i t l e , и
I t e m P r i c e . Сам поиск совпадения со значением C r i t e r i o n
происходит по пяти полям записей. Строка критерия может
присутствовать в любом месте поля, так как для поиска используется
оператор L I K E .
Поэтому если происходит совпадение с частью содержимого полей
I t e m N u m b e r , I t e m T y p e , I t e m P r o d u c e r , I t e m T i t l e , или
I t e m D e s c r i p t i o n , то эта запись выбирается.
После извлечения множества записей отдельные поля выводятся как
строки таблицы, точно так же, как для поиска по категории. Из этих
строк также сделаны ссылки, чтобы передать URL на страницу
d e t a i l . p h p , добавляя строку запроса — она содержит I t e m N u m b e r
вместе со значением C r i t e r i o n , использование которого будет
рассмотрено при обсуждении страницы d e t a i l . p h p .
Давайте теперь посмотрим на законченную страницу s e a r c h . p h p .
search.php
<?php
$Category = $_GET[Category];
$Criterion = $_GET[Criterion];
if ($Category == "" && $Criterion == "")
{
header(' Location:home.php'');
}
?>
<html>
<head>
<Ше>Сайт eCommerce </title>
<link href="stylesheetEC.css" rel="stylesheet">
К.С. Флойд
Введение в программирование на PHP5
<?php
require("jscript.inc');
?>
</head>
<body>
<div style="position:absolute; top:0px; left:0px; width:780px;
background-color:seagreen; colorwhite; padding:5px">
<?php
require("header.inc")
?>
</div>
<div style="position:absolute; top:75px; left:10px; width:175px">
<?php
require("menu.inc")
?>
</div>
<div style="position:absolute; top:75px; left:200px; width:550px">
<?php If ($Category != "')
{
?>
<span dass="head3">Шиск</span>резулкгатов для категории
<span dass="head3"><?php echo $Category ?></span>:
<br>
<br>
<table border="0" cellpadding="3">
<tr>
<th>Item Number</th>
К.С. Флойд
Введение в программирование на PHP5
<th>Item T5tle</th>
<th>Item Price</th>
</tr>
<?php
$conn = odbc_connect
('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c\inetpub\wwwroot\PHPr
//Формирование оператора SQL SELECT
$sql = "SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE Il
//Выполнение оператора SQL и создание множества записей
$rs = odbc_exec($conn, $sql);
//Цикл по множеству записей и вывод необходимых записей
while($row = odbc_fetch_array($rs))
{
$ItemNumber = $row[ItemNumber];
$ItemTitle = $row[ItemTitle];
$ItemPrice = number_format($row[ItemPrice],2);
echo "<tr style=\"color:seagreen; ]ine-height:8pt\"
onMouseOver=\"this.style.backgroundColor='lightgreen';this.style.color='dar
this.style.cursor='hand'\"
onMouseOut=\"this.style.backgroundColor='white';this.style.color='seagreen
onCli^Ylocation.href^detaiLptq^ItemNumbe^row^temNumber^" .
\"&Category=$Category'\"
>
<td>$ItemNumber</td>
<td>$ItemTitle</td>
<td align=\"right\">$$ItemPrice</td>
</tr>";
}
odbc_close($conn);
?>
</table>
<?php
}
if ($Criterion != "")
{
?>
<span c]ass="head3">Шиск</span>резулкгатов для критерия
<span dass="head3"><?php echo $Criterion ?></span>:
<br>
<br>
<table border="0" cellpadding="3">
<tr>
<th>Item Number</th>
<th>Item Title</th>
<th>Item Price</th>
</tr>
<?php
$conn = odbc_connect
('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPr
$sql = "SELECT ItemNumberJtemTitle,ItemPrice FROM Products WHERE'
$sql = $sql . " ItemNumber LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemType LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemProducer LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemTitle LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemDescription LIKE '%" . $Criterion . "%'";
$sql = $sql . " ORDER BY ItemNumber";
//Выполнение оператора SQL и создание множества записей
$rs = odbc_exec($conn, $sql);
//Цикл по множеству записей и вывод необходимых записей
while($row = odbc_fetch_array($rs))
{
$ItemNumber = $row[ItemNumber];
$ItemTitle = $row[ItemTitle];
$ItemPrice = number_format($row[ItemPrice],2);
echo ”<tr style=\"cobr:seagreen; ]ine-height:8pt\"
onMouseOver=\"this.style.backgroundCobr-lightgreen';this.style.cobr-dar
this.style.cursor='hand'\"
onMouseOut=\"this.style.backgroundColor='white';this.style.color='seagreen
onClick=Ybcatbn.href='detaiLphp?ItemNiimber=$ItemNumberY' .
\"&Criterion=$Criterion'\">
<td>$ItemNumber</td>
<td>$ItemTitle</td>
<td align=\"right\">$$ItemPrice</td>
</tr>";
}
odbc_close($conn);
?>
</table>
<?php
}
?>
</div>
</body>
</html>
П рим ер I . 9 .
Вывод описания продукта
Когда
делается
соединение
со
страницей
d e t a i l . php,
соответствующая строка запроса предоставляет странице I t e m N u m b e r
продукта и значение C a t e g o r y или C r i t e r i o n из предшествующего
поиска. Страница d e t a i l . p h p
применяет I t e m N u m b e r для
извлечения всех связанных с ним полей из таблицы P r o d u c t и
выводит эту информацию на странице. Значение C a t e g o r y или
C r i t e r i o n используется для создания обратной ссылки на страницу
поиска.
softWarehouse.com
Ноте
Office 200ft Profession ill
SJiopp яд Carl
III'ITI HlimtiLM
BU1111
Software Caite^ories:
Business Office
Pries HS9.M
Database-
OesKlep Publishing
Graphics
Operating Systems
web Development
Powerful prndunNMnuls inc-luding VVom, Ejucel. Oi/inok, PowerPoint,
Puhilisner. ondAccess Nr^fs^lura? Intlinj*sorf-rejainn:] .snip!;rations,
helnwfln iderrfrfflna and гврз'лпв jrosiflemswilhflles. Г-soi inenu.ltms ms-laHed as neeced.
dijlcrnslic reading nfFowErPeim slides, end expanded HTML llle Tcmnais.
fteqrc'h for
-
■■ P iis ir n a f i^ ltir.r'
Программирование страницы достаточно просто. I t e m N u m b e r
используется для извлечения соответствующей записи из таблицы
P r o d u c t и для доступа к изображению продукта в папке P i c t u r e s .
Вся эта информация выводится затем на странице.
detalLphp
<%
$ItemNumber = $_GET[ItemNumber]__________________________________
К.С. Флойд
Введение в программирование на PHP5
$Category = $_GET[Category]
$Criterion = $_GET[Criterion]
%>
<html>
<head>
<title>Сайт eCommerce </title>
<link href="stylesheetEC.css" rel="stylesheet">
<?php require("jscript.inc") ?>
</head>
<body>
<div style="position:absolute; top:0px; left:0px; width:780px;
background-color:seagreen; colorwhite; padding:5px">
<?php require("header.inc") ?>
</div>
<div style="position:absolute; top:75px; left:10px; width:175px">
<?php require("menu.inc") ?>
</div>
<div style="position:absolute; top:75px; left:200px; width:550px">
<?php
$conn = odbc_connect
('Driver={Microsoft Access Driver (*.mdb)}; DBQ=..\Ecommerce\databases\e
//Формирование оператора SQL SELECT
$sql = "SELECT * FROM Products WHERE ItemNumber = '$ItemNumber'";
//Выполнение оператора SQL и создание множества записей
$rs = odbc_exec($conn, $sql);
//Присваивание записей
$ItemType = odbc_result($rs,Itemrype);
К.С. Флойд
Введение в программирование на PHP5
$ItemProducer= odbc_result($rs,ItemProducer);
$ItemTitle = odbc_resUt($rs,ItemT5tle);
$ItemDescription = odbc_result($rs,ItemDescription);
$ItemPrice = number_format(odbc_result($rs,ItemPrice),2);
?>
<img src="Pictures/<?php echo $ItemNumber; ?>.jpg" align="left" style="margin
<span class="head1"><?php echo $ItemTitle; ?></span><br/>
<span class="head4">Item Number: <?php echo $ItemNumber; ?></span><br/
<span class="head4">Producer: <?php echo $ItemProducer; ?></span><br/>
<span class="head4">Price: $<?php echo $ItemPrice; ?></span>
<p><?php echo $ItemDescription; ?></p>
<form>
<input type="submit" class="buttonL" name="BuyButton" value="Buy Now"
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
</form>
<a href="search.php?Category=<?php echo $Category; ?> &Criterion=<?php e
Back to <?php echo $Category; echo $Criterion; ?>
</a>
</div>
</body>
</html>
П рим ер I . 1 0 .
Как мы уже делали на предыдущих страницах, прежде всего необходимо
получить посланную на страницу строку запроса. В данном случае
имеется три значения строки запроса, которые могут быть посланы.
Будут получены значение I t e m N u m b e r вместе со значением
C a t e g o r y или C r i t e r i o n . Не имеет значения, что одно из двух
последних значений будет отсутствовать в зависимости от типа
выполненного на странице s e a r c h . p h p поиска. Присваивание все
равно можно выполнить, просто одно из значений будет n u l l .
К.С. Флойд
Введение в программирование на PHP5
$ItemNumber = $_GET[ItemNumber]
$Category = $_GET[Category]
$Criterion = $_GET[Criterion]
В основном разделе страницы извлекается информация о продукте.
Поиск записи о продукте основывается на значении I t e m N u m b e r ,
переданного со страницы поиска. Когда запись извлекается, ее значения
присваиваются переменным для упрощения записи. Сохраняются все
поля кроме I t e m Q u a n t i t y . Это поле используется в дальнейшем, а
не для вывода на этой странице.
Изображение, связанное с продуктом, выводится с помощью тега
<IMG>,
используя
ItemNumber
для
идентификации
соответствующего изображения. Все изображения именуются в
соответствии с регистрационными номерами соответствующих
продуктов. Затем форматируется последовательность заголовков, чтобы
представить данные о продукте, вместе с расширенным описанием
продукта. Никакое специальное форматирование не применяется.
Затем появляется кнопка " B u y Now” . Эта кнопка используется
посетителем для покупки продукта, добавляя позицию в корзину
покупателя. В данное время мы проигнорируем эту кнопку и обратимся
к ней и связанному с ней программированию в дальнейшем. Можно
отметить, однако, что эта кнопка имеет такие же характеристики стиля
оформления, как и кнопка " Go" в меню поиска. Ее обработчики
событий o n M o u s e O v e r и o n M o u s e O u t связываются с процедурами
JavaScript, импортированными на страницу в файле INCLUDE
j s c r i p t . inc.
Ссылка внизу страницы возвращает на предыдущую страницу
s e a r c h . p h p . Но не только это: URL возвращает назад строку запроса,
что приводит к повторному выводу результатов предыдущего поиска.
(Возврат URL без строки запроса не предоставит странице
search.php
значение C a t e g o r y или C r i t e r i o n . Страница
s e a r c h . p h p тогда по умолчанию вернется на домашнюю страницу (
h ome ), и результаты предыдущего поиска будут потеряны.)
Строка запроса передает оба значения C a t e g o r y и C r i t e r i o n , даже
если только одно из них было послано на эту страницу. Это означает
К.С. Флойд
Введение в программирование на PHP5
просто, что одно из значений строки запроса будет n u l l . Такая
ситуация не имеет значения для страницы s e a r c h . p h p . Она заново
выполняет поиск на основе возвращаемого значения.
Это отсутствующее значение C a t e g o r y или C r i t e r i o n также не
влияет на вывод внутри обратной ссылки.
Back to "<?php echo $Category; echo $Criterion; ?>"
Одно из этих двух значений будет n u l l , поэтому будет выводиться
имеющееся значение, а другое выводиться не будет.
Страница d e t a i l . p h p
имеет другое важно назначение, кроме
вывода информации о продукте. На этой странице посетитель покупает
продукты, заполняя свою корзину покупок с помощью кнопки " B u y
Now” . Мы вернемся к обсуждению сценария для этой задачи немного
позже.
Отслеживание заказчиков
Прежде чем следовать дальше, необходимо создать способ
идентификации посетителей сайта и отслеживания их, когда они
перемещаются со страницы на страницу. Когда посетители что-то
покупают, они становятся заказчиками с покупками, и необходимо
иметь возможность связать определенных заказчиков с определенными
покупками. Мы рассмотрим два способа присваивания уникальных
идентификаторов посетителям и два способа их отслеживания.
Генерация случайных чисел
Один метод создания уникального идентификатора состоит в генерации
случайного числа. В PHP это делают с помощью следующего кода:
$RandomNumber = rand(int min, int max)
где m in и m ax являются целыми значениями, которые определяют
диапазон
чисел,
в
котором
должно
находится
случайно
сгенерированное
число.
Результат
присваивается
переменной
К.С. Флойд
Введение в программирование на PHP5
R a n d o m N u m b e r . Поэтому, если требуется получить случайное число
между, скажем, 1111111111 и 9999999999, необходимо использовать
оператор:
$OrderNo = rand(1111111111, 9999999999)
В этом случае мы присвоили случайное число переменной с именем
O r d e r N o , то есть, если посетитель решит что-нибудь купить, мы будем
использовать это число в качестве номера заказа. Всегда существует
вероятность, какой бы ни была она маленькой, что сгенерированное
число совпадает с уже существующим номером заказа. Поэтому для
безопасности это число необходимо сравнить с использованными ранее
номерами заказов, прежде чем присваивать его посетителю.
Использованные ранее номера заказов появятся в двух местах. Они
будут храниться в таблице корзин покупателя посетителей, которые
покупают в данный момент; и они будут храниться в таблице заказов,
содержащей информацию о заказчиках предыдущих продаж. Эти
таблицы пока не обсуждались, поэтому подождем, когда они будут
рассмотрены, и затем вернемся к повторяющимся номерам заказов.
Итак, где же поместить процедуру генератор O r d e r N o ? Возможно на
начальной странице ( h ome . p h p ) сайта, так как мы хотим начинать
отслеживать посетителей немедленно при их появлении. В таком
случае можно ожидать, что можно будет отследить посетителей сайта,
даже если они ничего не будут покупать. Мы здесь не будем это делать,
но такая возможность существует.
Отслеживание заказчиков с помощью строки запроса
Однако возникает небольшая проблема. Всякий раз, когда пользователь
возвращается на домашнюю страницу, ему будет присваиваться новый
номер заказа. В этом случае необходимо проверять, не существует ли
уже номер заказа для этого посетителя, и не создавать новый номер,
если он уже существует.
Вспомните из предыдущего обсуждения,
информации при переходе со страницы
что для сохранения
на страницу можно
К.С. Флойд
Введение в программирование на PHP5
задействовать для передачи этой информации строки запроса. Мы
ранее показывали, как использовать строку запроса для передачи
информации
поиска
между
страницами
search.php
и
d e t a i l . p h p . То же самое можно делать со значением O r d e r N o .
Можно передавать его как строку запроса со страницы на страницу,
чтобы сохранить его и, для решения текущей проблемы, получить
способ узнать, что номер заказа уже был создан.
Каждой странице сайта необходимо будет получать строку запроса,
содержащую O r d e r N o вместе с любой другой информацией, которая
может передаваться на эту страницу. Так как страница home . p h p
также будет получателем строки запроса с O r d e r N o (когда посетитель
возвращается на домашнюю страницу с других страниц сайта), то
можно проверять присутствие этой строки запроса, чтобы убедиться,
что номер заказа уже был присвоен, и пропускать процедуру генерации
номера заказа.
Все эти объяснения сводятся к некоторому очень простому коду. Мы
помещаем процедуру генерации случайного числа внутри условного
оператора проверки значения строки запроса:
<?php
if ($_GET[O rderNo]) == "")
{
$OrderNo = rand(1111111111,9999999999);
}
?>
Если домашняя страница получает строку запроса со значением
O r d e r N o , равным n u l l , то будет создан новый номер заказа. Это
будет происходить при первом посещении домашней страницы, так как
на сайт в начале не передается никакой строки запроса. Однако, если
домашняя страница получает строку запроса с O r d e r N o , отличным от
n u l l (номер существует), то эта процедура пропускается. Это будет
происходить при всех последующих возвращениях на домашнюю
страницу с любой другой страницы сайта.
Конечно,
если посетитель покидает сайт и возвращается,
будет
К.С. Флойд
Введение в программирование на PHP5
создаваться новый номер заказа, так как внешний сайт не передает
строку запроса с O r d e r N o . Такая ситуация вызывает серьезные
проблемы при отслеживании заказов покупателя. Если человек уже
поместил товары в свою корзину покупателя под одним номером, а
затем покинул сайт и вернулся, то нет удобного способа узнать, что это
тот же самый человек, добавляющий новые товары в свою корзину
покупателя. Фактически первый вариант выбора товаров будет потерян.
Можно обойти эту проблему, требуя от всех посетителей регистрации
на сайте и присваивая им постоянный номер заказчика, который они
используют во время всех посещений. Таким образом, номер заказчика
будет всегда связан с одним и тем же человеком. Это неплохая идея, но
требует более сложного программирования, чем то, что мы хотим здесь
использовать. Для текущей задачи более удобным решение будет
соединение номера заказа с объектом сеанса ( S e s s i o n ).
Использование сеансов
В PHP посетители сайта Web создают " с е а н с ы " . Сеанс создается
автоматически, когда посетитель впервые появляется на любой
странице сайта. Сеанс автоматически завершается, если посетитель не
осуществляет обращение к странице в течение 20-минутного интервала
времени. Поэтому сеанс начинается, когда посетитель прибывает, и
заканчивается через 20 минут после того, как посетитель покидает сайт.
Этот 20-минутный интервал времени позволяет также посетителю
покидать сайт и возвращаться позже, не становясь новым посетителем.
(Между прочим, 20-минутный интервал времени можно увеличить,
если понадобится. Мы этого делать не будем.)
С сеансом посетителя связан ассоциативный массив $ _ S E S S I O N [ ] .
Можно считать $ _ S E S S I O N [ ] глобальной областью хранения, где
поддерживается относящаяся к посетителю информация. Все
посетители сайта имеют свой собственный индивидуальный объект
сеанса ( S e s s i o n ) для отслеживания индивидуальной активности.
Как можно было бы предположить, объект сеанса посетителя может
быть хорошим механизмом для отслеживания заказов покупателя, когда
человек перемещается со страницы на страницу, уходит на другой сайт и
возвращается. Если такое значение, как O r d e r N o , поместить в объект
сеанса посетителя, когда он впервые приходит на сайт, то это значение
будет доступно на любой странице, нет необходимости тащить это
значение со страницы на страницу с помощью строки запроса.
Идентификатор (ID) сеанса
PHP отслеживает посетителя с помощью уникального идентификатора,
который присваивается ему при создании сеанса. Это уникальное
значение хранится в свойстве сеанса s e s s i o n _ i d () объекта сеанса.
К этому значению можно обратиться после запуска нового сеанса:
<?php
session_start();
$_SESSION[OrderNo] = session_id();
?>
Функция s e s s i o n _ i d () автоматически генерирует i d сеанса. Если
желательно создать свой собственный случайный i d , можно
использовать функцию r a n d () для генерации значения, а затем
сохранить его в переменной сеанса:
<?php
session_start();
$_SESSION[OrderNo] = rand(1111111111,9999999999)
?>
Возвращаясь к вопросу присваивания уникальных значений O r d e r N o
для новых посетителей сайта и вопросу отслеживания этого номера
при перемещении со страницы на страницу, мы можем с помощью
переменной сеанса легко реализовать эти вещи. Делается это так: когда
посетитель впервые появляется на сайте, мы присваиваем
s e s s i o n _ i d ( ) (или случайным образом созданный ID ) как
O r d e r N o , и, чтобы сделать этот номер доступным всем страницам, мы
сохраняем его в $ _ S E S S I ON [ ] , где он будет оставаться еще 20 минут
после ухода посетителя с сайта. Конечно, когда посетитель решает стать
заказчиком и оформляет покупку, мы просто "разрушим" этот сеанс с
помощью s e s s i o n _ d e s t r o y ( ) , чтобы создать новый сеанс с
другим номером заказа.
К.С. Флойд
Отслеживание
$_SESSION[]
Введение в программирование на PHP5
заказчиков
с
помощью
массива
Итак, давайте применим все это для задачи присваивания уникального
ID (переменной O r d e r N o ) посетителю и отслеживания этого номера
при перемещении посетителя со страницы на страницу.
page1.php
<?php
session_startO;
$_SESSION[OrderNo] = session_id();
header("Location:page2.php");
?>
Значение i d сеанса доступно теперь на последующих страницах для
задач отслеживания и идентификации. К нему можно обратиться с
помощью $ _ S E S S I O N [ O r d e r N o ] . Следующий пример показывает,
как это значение будет извлекаться и выводиться на второй странице:
page2.php
<?php
session_start();
echo "Привет! Ваш идентификационный номер " . $_SESSION[OrderN
?>
Может показаться, что такая техника будет единственно разумным
способом поддержания состояния между различными страницами.
Однако, существуют потенциальные проблемы. Например, если во
время посещения заказчик будет неактивен в течение 20 минут, то PHP
автоматически завершит сеанс, и не будет никакой возможности
восстановить действия этого человека. Это может произойти,
например, если заказчика приглашают к телефону, он отвлекается на
другой сайт или просто уснул. Будет создан совершенно новый сеанс,
когда он вернется, и мы вынуждены будем искать способ удалить все
ожидающие объекты покупки, так как нет способа завершить
предыдущие транзакции.
К.С. Флойд
Введение в программирование на PHP5
Поэтому необходимо будет сопоставить преимущества использования
сеансов с неудобством наличия брошенных сеансов. Тем не менее,
разумно предположить, что большинство посетителей не будут
создавать перерывы активности, превышающие 20 минут, и что
простота программирования с помощью объекта сеанса превышает
другие соображения. Как отмечено выше, всегда можно изменить 20
минутный интервал, если он покажется слишком коротким.
ID посетителя и номер заказа
В предыдущем примере мы присваивали номера заказов посетителям
как способ уникальной идентификации посетителей, и, в конечном
счете, для уникальной идентификации их заказов. Мы отчасти
предполагаем, что все посетители станут заказчиками. Это не является
проблемой, если мы собираемся использовать случайные числа в обоих
случаях. Однако компания может иметь более систематический способ
присваивания номеров заказов. Номера заказов могут, например,
выбираться из последовательности предварительно определенных
номеров. В этом случае присвоенный заранее номер заказа для
посетителя, который не стал покупателем, оставляет пробел в
последовательности номеров заказов.
В такой ситуации необходимо присваивать сначала случайное число в
качестве "номера посетителя", чтобы отслеживать перемещения этого
человека по сайту, а затем присвоить окончательный "номер заказа",
когда будет принято решение о покупке. Из того, что можно увидеть в
Web, можно заключить, что номера заказов не имеют очевидной логики,
и поэтому можно использовать один и тот же номер для отслеживания
посетителей и для идентификации их заказов.
Подсчет посетителей
Пока мы обсуждаем тему объекта сеанса, давайте рассмотрим
процедуру, которая активно использует его возможности, - подсчет
посетителей. Объект сеанса в действительности предопределяет
"посетителя", поскольку поддерживает сеанс для каждого человека в
течение 20 минут с момента последнего обращения посетителя к
К.С. Флойд
Введение в программирование на PHP5
странице.
Поэтому
простое
существование
сеанса
является
доказательством присутствия посетителя. Итак, чтобы подсчитать
посетителей, необходимо только добавлять 1 к счетчику посетителей,
когда запускается сеанс.
Создание счетчика посетителей
Прежде всего,
необходимо
создать
счетчик посетителей
и
инициализировать его значение. Обычно начальное значение счетчика
задается как 0, но если есть желание произвести впечатление на
посетителей или инвесторов, то можно инициализировать его
значением 1000000. Счетчик может быть простым текстовым файлом,
содержащим значение счетчика. Так как мы работаем в среде базы
данных, то можно также создать таблицу. В этой таблице будет только
одна запись с одним полем, в котором накапливается счетчик
посетителей.
Здесь мы создаем таблицу с именем C o u n t e r s (так как необходимо
подумать о некоторых дополнительных счетчиках, которые понадобятся
позже). Таблица содержит одно поле с именем VisitorComter,
определенное как числовое поле. В таблице имеется только одна эта
запись. Теперь все готово к подсчету посетителей.
Увеличение значения счетчика посетителей
Когда посетитель прибывает на сайт, необходимо увеличить счетчик
посетителей на 1. Мы узнаем, что прибыл посетитель, когда PHP
создает сеанс и создает объект сеанса для этого человека. Поэтому мы
создаем глобальную переменную сеанса с именем " C o u n t " (
К.С. Флойд
Введение в программирование на PHP5
$ _ S E S S I O N [ C o u n t ] ) и будем увеличивать ее значение на 1 всякий
раз, когда запускается новый сеанс. Это значение будет использоваться
для увеличения V i s i t o r C o u n t e r .
Чтобы не считать дважды одного и того же пользователя во время
следующего сеанса, можно поместить код обновления счетчика внутрь
оператора i f , который проверяет, что переменной C o u n t уже было
присвоено значение. Если C o u n t не определено, то это указывает на
новый сеанс или на нового пользователя и удовлетворяется условие для
обновления счетчика V i s i t o r . Если C o u n t имеет значение, то
текущий сеанс пользователя уже был учтен и блок обновления
игнорируется.
Так как h o m e . p h p является "входом" на сайт, давайте вернемся к
файлу h ome . p h p и добавим необходимый код для учета посетителей:
session_startO;
if (!$_SESSION[Count])
{
$_SESSION[Count] = 1;
$conn = odbc_connect('Driver={Microsoft Access Driver
(*.mdb)};DBQ=c:\inetpub\wwwroot\PHPTutoria]\Ecommerce\databases\econ
$sql = "UPDATE Counters SET VisitorCounter = VisitorCounter + $_SESSIC
$rs = odbc_exec($conn, $sql)
odbc_close($conn);
}
Мы соединяемся и открываем таблицу C o u n t e r s и добавляем 1 в
поле V i s i t o r C o u n t e r . Это действие происходит всякий раз, когда
кто-то новый приходит на сайт. ПРИМЕЧАНИЕ: не забудьте сделать
вызов функции s e s s i o n _ s t a r t ( )
перед проверкой статуса
переменной
сеанса
Count.
Если
сеанс
не
запущен,
$ _ S E S S I O N [ C o u n t ] не будет опознаваться как переменная сеанса, и
оператор if будет выполняться каждый раз при перезагрузке страницы.
Другими словами счетчик будет увеличиваться всякий раз, когда
обновляется страница, а не тогда, когда создается новый сеанс.
Использованный выше оператор SQL UPDATE имеют следующую
общую форму:
UPDATE TableName SET FieldName1 = expression! [,FieldName2 = expressi
где T a b l e N a m e является именем таблицы, а F i e l d N a m e указывает на
поле таблицы, в которой происходит обновление. Выражения (
e x p r e s s i o n l , . . .) могут быть одиночными значениями или
арифметическими выражениями, создающими значение. Предложение
WHERE можно добавлять к этому оператору для ограничения
обновлений только определенными записями, соответствующими
заданному критерию.
Вывод счетчика посетителей
Счетчик посетителей выводится на странице h o m e . p h p . Для
считывания и вывода значения счетчика используется следующий
сценарий:
<?php
$conn = odbc_connect
('Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inelpub\wwwraot\PHPT
Ecommerce\databases\ecommerce.mdb',",M);
$sql = "SELECT VisitorCounter FROM Counters";
$rs = odbc_exec($conn, $sql);
$Counts = odbc_result($rs,VisitorCounter);
echo "Вы являетесь $Counts посетителем с 12/2006";
?>
При тестировании этой процедуры счетчика на странице помните об
одном важном факте. Счетчик не будет увеличиваться просто при
перезагрузке страницы. Счетчик увеличивается только при появлении
нового посетителя и создании нового сеанса. Поэтому, чтобы увеличить
счетчик, понадобится закрыть браузер (завершить текущий сеанс) и
снова его открыть (запуская новый сеанс).
Нам потребуется корзина покупателя, с помощью которой заказчики
могут выбирать продукты для покупки. Это делается с помощью кнопки
" B u y Now” (Купить), появляющейся на странице d e t a i l . p h p .
Когда происходит щелчок на кнопке, в корзину добавляется запись,
идентифицирующая выбранный продукт. Выбранные продукты
накапливаются, пока покупатель не оформит покупку, в этом случае
объекты из корзины покупателя используются для подготовки заказа на
покупку.
Создание таблицы корзины покупателя
Удобным
способом
создания
корзины
покупателя
является
использование таблицы базы данных. Записи добавляются в таблицу,
когда заказчик выбирает объекты для покупки; записи удаляются из
таблицы, когда заказчик решает не покупать выбранный ранее объект; и
запись изменяется, когда заказчик выбирает другое количество товара
для покупки. Таблица является динамической, ее записи добавляются,
изменяются и удаляются во время процесса покупки.
Запись корзины покупателя должна содержать только минимальное
количество информации. Она должна отслеживать заказчика, продукт и
выбранное количество. Можно добавить дополнительные поля для
поддержки других действий. Например, можно включить поле даты для
отметки времени покупки (хорошая идея для очистки таблицы при
отказе от покупки) и поле цены, если имеется риск, что цена объекта
может измениться до окончательного оформления. Для текущих задач
мы создаем следующую структуру таблицы S h o p C a r t , которая
добавляется в базу данных e C o m m e r c e . m d b .
ShopCart (таблица)
поле Название поле Тип поле Размер
поле Количество
OrderNo
Text
10
Номер заказа
OrderItem
Text
6
Код продукта
OrderDate
date/Time
Дата заказа продукта
К.С. Флойд
OrderQuantity
Введение в программирование на PHP5
Number
Long Integer Выбранное количество продукта
Добавление объектов в корзину покупателя
Выбор продукта и добавление его в корзину покупателя происходят на
странице d e t a i l . p h p . Когда покупатель щелкает на кнопке " B u y
Now” , информация о выбранном продукте записывается как новая
запись в таблицу S h o p C a r t . Объекты, накопленные в корзине
покупателя, записываются как дополнительные покупки. После
окончательного оформления и записи окончательного заказа корзину
покупателя можно очистить от этих объектов.
Прежде всего, мы должны рассмотреть кнопку " B u y Now" на
странице d e t a i l . p h p и запрограммировать ее для запуска процесса
покупки.
<form action="detaiLphp?OrderItem=<?php echo $ItemNumber ?>” method="p
<input type="submit" dass="buttonL" name='BuyButton" value='Buy Now"
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
</form>
Атрибут ACTION, конечно, указывает на текущую страницу
d e t a i l . p h p , кроме того, нам нужно передать на эту страницу, когда
она перезагружается, информацию об I t e m N u m b e r продукта,
добавляемого в корзину покупателя. Эта информация передается через
строку запроса ? O r d e r I t e m = < ? p h p e c h o $ I t e m N u m b e r ?>
(вспомните, что переменная I t e m N u m b e r доступна на этой текущей
странице). Для передачи используется метод POST.
Здесь есть над чем подумать. Обычно теги <FORM> окружают поля
данных, которые передаются, когда делается щелчок на кнопке
отправки. Однако в данном случае полей формы нет - только одна
кнопка. Поэтому, когда форма посылается, передаются только имя и
значение кнопки. Однако нам надо передать значение I t e m N u m b e r
продукта, выбранного на этой странице, чтобы его можно было
добавить в корзину покупателя. Поэтому мы просто добавляем его как
строку запроса в URL из ACTION. Теперь обе переменные,
К.С. Флойд
Введение в программирование на PHP5
POST [ B u y B u t t o n ]
(содержащая
BuyButton
)
и
$_GET[OrderItem]
(содержащая O r d e r l t e m
), становятся
доступными на получающей странице. Отметим, что мы использовали
имя строки запроса O r d e r l t e m для покупаемого продукта, чтобы
избежать путаницы с I t e m N u m b e r рассматриваемого продукта.
Когда форма посылается, сценарий в начале страницы d e t a i l . p h p
записывает объект в корзину покупателя.
<?php
session_startO;
$ItemNumber = $_GET[ItemNumber];
$Category = $_GET[Category];
$Criterion =$_GET[Criterion];
$OrderNo = $_SESSION[OrderNo];
$OrderDate = date('n/d/y);
if ($_POST[BuyButton] == 'Buy Now")
{
$OrderItem = $_GET[OrderItem];
$conn2 = odbc_rannect('Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\i
$sqlCart = "SELECT OrderNo,OrderItem FROM ShopCart WHERE OrderNo
$rsCart = odbc_exec($conn2,$sqlCart);
while ($row = odbc_fetch_array($rsCart))
{
if ($row[OrderNo] == $OrderNo && $row[OrderItem] == $O
{
$update = true;
}
}
if (!$update)
{
$sqlInsert = "INSERT INTO ShopCart (OrderNo,OrderItem,OrderDate,C
$rsInsert = odbc_exec($conn2,$sqlInsert);
}
else
{
$sqlUpdate = "Update ShopCart SET OrderQuantity = OrderQuantity +
OrderItem = '$OrderItem'";
$rsUpdate = odbc_exec($conn2,$sqlUpdate);
}
header("Location:shopcart.php");
}
?>
П рим ер I . 1 1 .
Новая запись S h o p C a r t заполняется четырьмя значениями. O r d e r N o
получают из объекта сеанса — $ _ S E S S I O N [ O r d e r N o ] . O r d e r I t e m
передается на эту страницу через строку запроса. O r d e r D a t e
определяется текущей датой системы, полученной с помощью функции
d a t e () . O r d e r Q u a n t i t y задается как 1. Когда объект выбирается в
начале для покупки, мы автоматически задаем заказанное количество
как 1. Покупатель может изменить это количество на странице корзины
покупателя.
Мы имеем здесь также дело с ситуацией, в которой заказчик может
попытаться купить один и тот же продукт несколько раз, намеренно или
по
неосторожности.
Наше
"бизнес-правило"
говорит,
что
единовременно может быть заказан только один объект (хотя
покупатели будут иметь возможность изменить заказанное количество
на странице корзины покупателя). Мы не хотим, чтобы один и тот же
объект появлялся несколько раз в корзине покупателя.
Такая ситуация легко решается начальной проверкой того, что запись
для этого продукта уже существует в таблице S h o p C a r t . Оператор
SQL SELECT и цикл по возвращаемому множеству записей выполняют
нужную проверку:
$sqlCart = "SELECT OrderNo,OrderItem FROM ShopCart WHERE OrderNo
$rsCart = odbc_exec($conn2,$sqlCart);
К.С. Флойд
Введение в программирование на PHP5
while ($row = odbc_fetch_array($rsCart))
{
if ($row[OrderNo] == $OrderNo && $row[OrderItem] == $O
{
$update = true;
}
}
Если найдены подходящие O r d e r N o и O r d e r l t e m , то потребуется
оператор SQL UPDATE для обновления существующей записи. Если
совпадений не найдено, требуется оператор SQL INSERT для создания
новой записи. Для этого создается переменная ( $ u p d a t e ), которой
присваивается значение t r u e , если будут найдены подходящие
O r d e r N o и O r d e r l t e m . Следующий блок кода содержит операторы
INSERT и UPDATE. Значение переменной $ u p d a t e зависит от
используемого оператора SQL:
if (!$update)
{
$sqlInsert = "INSERT INTO ShopCart (OrderNo,OrderItem,OrderDate,C
Values ('$OrderNo', '$OrderItem',$OrderDate,1)";
$rsInsert = odbc_exec($conn2,$sqlInsert);
}
else
{
$sqlUpdate = "Update ShopCart SET OrderQuantity = OrderQuantity +
= '$OrderNo' AND
OrderItem = '$OrderItem'";
$rsUpdate = odbc_exec($conn2,$sqlUpdate);
}
header("Location:shopcart.php");
После добавления новой записи множество записей и соединение
закрываются, и покупатель посылается прямо на страницу корзины
покупателя с помощью метода h e a d e r ( ” L o c a t i o n : u r l ” ) .
Предполагается, что покупатель захочет после выбора просмотреть
объекты
корзины
покупателя.
Дальше
мы
перейдем
к
Обслуживание корзины покупателя
Страница s h o p c a r t . p h p предоставляет заказчику доступ к объектам
корзины покупателя. Она суммирует его покупки, позволяет изменить
заказанное количество и является переходом к оформлению заказа. При
программировании этой страницы существуют некоторые сложности,
поэтому будьте внимательны.
softWarehouse.com
Ноте
Shopping Сiiг t
S h ip p in g СаП
Snftmre Сaft-punes
Jjusir-pis
tu-abdiH
Оег.!.™PrtiiSftlHS
GiephicS
Operalinj SY5^eTi4
WebDe.elupiyienl
Uf^4:r]l for:
f
Dnre 12/2^40
Мм]..i Mil hjsqjuss
ftfcnn Nuinbci
Til le
Ш Ш Й Ш Я 1 AmoUhl ]
359 E5
|
Г
BU1111
Office 2330 Frafaaeienal
OSH 11
YYlnUnwi Viler mum Edition (
г ими
3 99.»
Shipping
и :o
Order TOtel I (SWL&5
ш
On-Cat;
Cfcfc to щ ХО Д C hannel q irtfid ie S . БШйг n ew йм *«А у dr
enter f l to cancel purchase ol tern
f t c k So fn a k re о п- l r it p u d u s e through secu-e connection
Checkout to
CrecKP#,№ontSystems
Вывод корзины покупателя
Следующий код создает вывод корзины покупателя. Этот код появляется
в основном разделе страницы, чтобы создать приведенный выше
вывод. Отметим, что весь раздел включает форму, которая пересылается
снова на эту же страницу, чтобы можно было изменить заказанное
количество единиц товара.
<div style="position:absolute; top:75px; left:200px; width:550px">
<form name="ShopCart" action="shopcart.php" method="post">
<span class="head1">Shopping Cart</span><br>
К.С. Флойд
Введение в программирование на PHP5
<Ьг>
<span dass="head4">Date: </span><?php echo date('n/d/y)?><br>
<span dass="head4">Order No: </span><?php echo $_SESSION[OrderNo] ?
<table border="0">
<tr>
<th>Item Number</th>
<th>Title</th>
<th>Quantity</th>
<th>Price</th>
<th>Amount</th>
</tr>
<tr>
<td colspan="4" style="text-align:right">Shipping </td>
<td style='fext-align:right">$<?php echo number_format($OrderShipping,2) ?
</tr>
<tr>
<th colspan="4" style="text-align:right">Order Total </th>
<td style='border-style:soM"><b>$<?php echo number_format($OrderTotal,
</tr>
</table>
<?php if($OrderTotal != 0) { ?>
<div style="width:375px; line-height:8pt">
<input type="submit" name='UpdateButton" class='buttonM"
style="float:left; margin-right:5px" value='Update"
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
<span c]ass="small">Click to update changed quantities. Enter new quantity
or enter 0 to cancel purchase of item. (Щелкните, чтобы обновить измене:
</div>
<?php } ?>
</form>
<?php if ($OrderTotal != 0) { ?>
<div style="width:375px; ]ine-height:8pt">
<form action="http://.../creditcheck.php" method="post">
<input type="hidden" name="ReturnURL" value="http://.„/ordercapl:ure.php">
К.С. Флойд
Введение в программирование на PHP5
<input type="hidden" name="CompanyID" value="softWarehouse.com">
<input type="hidden" name="CustomerID" value="<?php echo $_SESSION[
<input type="hidden" name="Amount" value="<?php echo $OrderTotal ?>">
<input type="submit" name="CheckoutButton" class="buttonM"
style=' 'float:left;margin- right:5px'' value=' Checkout"
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
<span dass="small">Click to finalize on-line purchase through secure connecti
to Credit Payment Systems. Щелкните здесь, чтобы оформить онлайн п(
</form>
</div>
<?php } ?>
</div>
П рим ер I . 1 2 .
Первая часть кода создает заголовки страницы и заголовки таблицы для
списка корзины покупателя. Вместе с номером заказа покупателя,
который
содержится в
переменной
$_SESSION[OrderNo],
выводится текущая системная дата
Извлечение объектов корзины покупателя
Объекты в корзине покупателя заказчика соответствуют номеру заказа и
извлекаются с помощью следующей команды SQL:
$sql="SELECT Orderltem, OrderQuantity FROM ShopCart WHERE OrderNo
Получаемое множество записей $ r s C a r t содержит для каждой записи
два выбранных поля O r d e r l t e m и O r d e r Q u a n t i t y . Эти поля
присваиваются переменным. Два других поля в записях ( O r d e r N o и
O r d e r D a t e ) не требуются для нашей цели. Теперь необходимо
выполнить итерации по записям и создать таблицу строк с
выбранными объектами.
Однако мы еще не получили всю информацию, которая выводится в
строке. Кроме O r d e r l t e m и O r d e r Q u a n t i t y , содержащихся в
корзине покупателя, таблица выводит название товара и его цену. Эти
К.С. Флойд
Введение в программирование на PHP5
значения находятся в таблице P r o d u c t s . Поэтому эти поля
I t e m T i t l e и I t emP r i c e извлекают для соответствующего продукта,
создавая множество записей $ r s P r o d и выполняя оператор SQL.
$sq]Prod = "SELECT ItemTitle, ItemPrice FROM Products WHERE ItemNumt
Эти значения также присваиваются переменным.
Для каждой выводимой строки объекта выводится также объем
покупки.
Переменная
$OrderAmount вычисляется
умножением
заказанного количества ( $ O r d e r Q u a n t i t y ) на цену продукта (
$ O r d e r P r i c e ). Также, когда сценарий выполняет итерации по
записям корзины покупателя, значение $ O r d e r T o t a l накапливается
путем сложения по очереди всех $ I t e m A m o u n t . Отметим, что
переменная O r d e r T o t a l инициализируется как 0 перед началом
цикла вывода.
Теперь собрана вся информация, необходимая для вывода строки
таблицы:
echo "<tr>
<td>$OrderItem </td>
<td>$OrderTitle</td>
<td><input type=\"text\" name=\"Q$OrderItem\" size=\"2\" c]ass=\"qtybox\"
value=\"$OrderQuantity\"></td>
<td style=\"text-a]ign:right\">$$OrderPrlce</td>
<td style=\"text-align:right\">$$OrderAmount</td>
</tr>";
Мы выводим значения переменных, содержащих извлеченные из
таблиц S h o p C a r t и P r o d u c t s данные и вычисленный объем. В
случае объектов $ O r d e r P r i c e и $ O r d e r A m o u n t используется
функция PHP n u m b e r _ f o r m a t ( ) , чтобы вывести значения в формате
с двумя десятичными позициями после запятой. Теперь надо объяснить,
что происходит с полем O r d e r Q u a n t i t y .
Именование полей количества
К.С. Флойд
Введение в программирование на PHP5
Раздел страницы заключен в теги <FORM>, так как заказчику дается
возможность изменить заказанное количество товара и заново послать
форму, чтобы обновить это количество. Для этого необходимо
поместить $ O r d e r Q u a n t i t y для каждого покупаемого объекта в поле
формы, как это делается с помощью кода:
<input type="text" name="Q<?php echo $OrderItem ?>” size="2" class="qtybox
value="<?php echo $OrderQuantity ?>">
Ключом к тому, чтобы эта форма правильно работала, является
соглашение об именах, используемых для этого поля. Обратим
внимание, что этому текстовому полю присваивается имя " Q < ? p h p
e c h o $ O r d e r I t e m ? > " , то есть буква "Q" (которая выбрана просто
произвольно), — за ней следует код ( $ O r d e r I t e m ) продукта,
значение $ O r d e r Q u a n t i t y которого выводится в этом поле. Если
взять в качестве примера корзину покупателя, показанную выше, то
именем поля количества первого товара будет " Q B U 1 1 1 1 " , а именем
поля для второго товара будет " QOS1 1 1 1 " .
Для использования такого способа именования имеются две причины.
Прежде всего, мы не знаем, сколько различных полей количества
появится в форме. В ней будет столько полей, сколько будет купленных
продуктов. Поэтому в отличие от предыдущего опыта с формами, мы не
можем заранее определить и назвать эти поля. Во-вторых, мы не можем
использовать одно имя для всех полей. Если, например, мы бы назвали
поле просто " Q u a n t i t y " , то было бы столько полей Q u a n t i t y ,
сколько было бы купленных продуктов. Это могло бы создать реальные,
непреодолимые проблемы при попытке определить, какое поле
q u a n t i t y связано с каким продуктом. Поэтому требуется соглашение
об именах, которое, первое, позволяет определить по мере
необходимости неопределенное число полей количества, и, второе,
уникальным образом определяет продукт, связанный с количеством,
представленным в этом поле. Текущее соглашение об именах решает обе
проблемы достаточно хорошо. Символ "Q" испол ьзуется для
идентификации поля количества (важный идентификатор, который
будет использоваться ниже), а добавленное O r d e r l t e m предоставляет
уникальное имя, которое идентифицирует также продукт, связанный с
указанным в поле количеством. Мы обсудим ниже, как сценарий
сортирует эту информацию для обновления полей количества
измененными значениями.
Суммарные строки заказа и кнопки
После того как сценарий закончил итерации по объектам корзины
покупателя и перечислил все покупки, вычисляется стоимость доставки
( $ O r d e r S h i p p i n g ) как 2% от O r d e r T o t a l и выводится пара
суммарных строк.
$OrderShipping = number_format($OrderTotal * .02,2);
$OrderTotal = number_format($OrderTotal + $OrderShipping,2);
<tr>
<td colspan="4" style="text-align:right">Shipping </td>
<td style='text-a]ign:right"><?php echo $OrderShipping ?></td>
</tr>
<tr>
<th colspan="4" style="text-align:right">Order Total </th>
<td style="border-style:solid"><b><?php echo $OrderTotal ?></b></td>
</tr>
Наконец, выводятся две кнопки: кнопка " U p d a t e " для отправки всех
сделанных изменений количества продуктов, и кнопка " C h e c k o u t "
для оформления заказа. Последняя кнопка обсуждается дальше вместе с
оформлением покупки с помощью кредитной карты.
Заказчики могут посещать страницу s h o p c a r t . p h p в любое время,
даже до того, как будут сделаны какие-либо покупки. Однако, когда это
происходит, вывод кнопок или доступ к ним для посетителя не
обязателен. Они нужны только тем заказчикам, которые выбрали
продукты для покупки. Поэтому их вывод происходит только для тех
заказчиков, которые имеют объекты в своей корзине покупателя, т.е.
когда значение O r d e r T o t a l не равно $0.00. Это условие используется
для определения, будут или нет выводиться кнопки.
<?php if($OrderTotal != 0) {?>
<div style="width:375px; line-height:8pt">
<input type="submit" name="UpdateButton" class="buttonM"
style="float:left; margin-right:5px" value="Update"
К.С. Флойд
Введение в программирование на PHP5
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
<span dass="small">Щелкните, чтобы обновить измененные значения к
</div>
<?php } ?>
</form>
<?php if ($OrderTotal != 0) {?>
<div style="width:375px; line-height:8pt">
<form action="http://.../creditcheck.php" method="post">
<input type="hidden" name="ReturnURL" value="http://.../ordercapture.php">
<input type="hidden" name="CompanyID" value="WebWarehouse.com">
<input type="hidden" name="CustomerID" value="<?php echo $_SESSION[
<input type="hidden" name="Amount" value="<?php echo $OrderTotal ?>">
<input type="submit" name="CheckoutButton" class="buttonM"
style=' 'float:left;margin- right:5px'' value=' Checkout"
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
<span dass="smaIl">Щелкните, чтобы оформить онлайн покупку с пом
</form>
</div>
<?php } ?>
П рим ер I . 1 3 .
Итерации по отправленной форме
Когда пользователь изменяет значение количества одного или
нескольких продуктов и щелкает на кнопке " U p d a t e " для отправки
формы, то информация снова передается на страницу s h o p c a r t . p h p .
Страница s h o p c a r t . p h p содержит сценарий для обновления этих
изменений в таблице S h o p C a r t . Этот сценарий находится в начале
страницы для перехвата изменений, когда посылается форма.
Назначение этого сценария состоит в обновлении таблицы S h o p C a r t
значениями количества продуктов, переданных из формы. Мы знаем,
что имеется неопределенное число полей количества, имя каждого из
которых начинается с буквы " Q " , и мы знаем, что значения формы,
приходящие на страницу, могут быть в любом порядке.
К.С. Флойд
Введение в программирование на PHP5
До сих пор мы всегда знали имена и номера полей на формах. Это
связано с тем, что мы проектировали формы, именовали поля и
определяли, сколько будет полей. Но здесь это не так. Мы не знаем,
сколько имеется полей (это зависит от того, сколько объектов имеется в
корзине покупателя), и мы не знаем их имен (за исключением того, что
они начинаются с буквы "Q" ). Поэтому мы не можем выполнить
обработку формы, как это делалось ранее.
Однако с помощью PHP можно решить эту проблему. Можно выполнить
итерации по всем элементам $_REQUEST, чтобы определить имена
отправленных полей и соответствующие значения. Это реализуется с
помощью специального оператора цикла For Each...Next, общая
структура которого применительно к формам имеет следующий вид:
foreach($_REQUEST as $key => $value)
где $_REQUEST является ассоциативным массивом, содержащим все
пары имя/значение для элементов управления формы на странице. Этот
цикл выполняется для каждой пары имя/значение, присланной из
формы. На каждой итерации переменная $ k e y содержит имя из пары
имя/значение, а $ v a l u e указывает на значение, связанное с этим
именем. Массив имеет следующий формат $_REQUEST [ $ k e y ]
=
$ v a l u e для каждой пары имя/значение, связанной с формой.
Затем можно использовать эту итерационную структуру для просмотра
присланных позиций для обновления корзины покупателя и
определения имен полей и значений. Когда встречается поле с именем,
начинающимся с буквы " Q " , то мы знаем, что это поле количества,
содержащее значение для обновления таблицы S h o p C a r t . Мы можем
также определить из названия продукт, для которого задано значение
количества.
Обновление корзины покупателя
Ниже показан весь сценарий обновления корзины покупателя, когда
заказчик щелкает на кнопке формы " U p d a t e " .
if ($_POST[UpdateButton] == "Update")
{
$conn2 = odbc_rannect('Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\i
foreach($_REQUEST as $key => $value)
{
if (strpos($key,"Q") === 0 )
{
$OrderItem = substr($key,1);
$OrderQuantity = $value;
if (is_numeric($OrderQuantity))
{
if ($OrderQuantity == 0)
{
$sqlCartUpdate = "DELETE FROM ShopCart WHERE Order!
}
else
{
$sqlCartUpdate = "UPDATE ShopCart SET OrderQuantity='$OrderQua
AND OrderItem='$OrderItem'";
}
$rsCartUpdate = odbc_exec($conn2,$sqlCartUpdate);
}
К.С. Флойд
}
}
odbc_close($conn2);
}
П рим ер 1 . 1 4 .
Прежде всего, создается соединение с базой данных e C o m m e r c e . mdb.
Объект множества записей ( R e c o r d s e t ) здесь не требуется, так как
обновления
делаются
непосредственно
командами
SQL,
выполняемыми с помощью объекта соединения ( C o n n e c t i o n ) .
Затем применяется цикл f o r e a c h для итераций по именам и
значениям, помещенным в массив $_REQUEST[ ] после отправки
формы на сервер. Переменная с именем $ k e y используется для ссылки
на имена полей, находящиеся в массиве.
При просмотре элементов массива выполняется проверка того, что имя
поля начинается с буквы " Q " :
if (strpos($key,"Q") === 0 ) {
}
Функция P H P s t r p o s O применяется для проверки, что первый
символ (или символ в позиции 0) имени элемента управления формы
совпадает с "Q". Если первый символ "Q", то это буцет поле
количества, содержащее значение для обновления корзины покупателя.
Здесь важно отметить, что используется оператор сравнения РНР "==="
("идентично"), а не оператор сравнения "==" ("равно"). Это необходимо,
потому что функция s t r p o s i )
требует для проверки своих
возвращаемых значений "===".
Затем сценарий определяет, какую надо обновить запись о продукте и
каким является фактическое значение количества:
$OrderItem= substr($key,l);
$OrderQuantity = $value;
Мы знаем, что код продукта, связанный с полем количества, содержится
К.С. Флойд
Введение в программирование на РНР5
в переменной $ к е у . Фактически это будут шесть правых символов
имени поля. Поэтому эти шесть символов извлекаются из переменной с
помощью функции РНР s u b s t r ( ) и помещаются в переменную
$ O r d e r I t e m . Затем значение переменной $ v a l u e , связанное с этим
полем, присваивается переменной $ O r d e r Q u a n t i t y . Теперь у нас
есть два фрагмента информации, необходимых для обновления поля
$ I t e m Q u a n t i t y этого продукта в таблице S h o p C a r t .
Прежде чем обновлять количество продукта, необходимо проверить, что
заказчик ввел число. В поле можно случайно ввести недействительный
символ. Поэтому для $ O r d e r Q u a n t i t y выполняется числовая
проверка.
if (is_numeric($OrderQmntity))
{
}
Если в поле находится что-то отличное от числа, то обновление
количества для этого продукта пропускается и происходит обращение к
следующему полю формы.
Количества, присланные с помощью формы, могут представлять
дополнительные купленные количества, или они могут иметь значение
О, указывающее, что товар удален из корзины покупателя. Это значение
проверяется, и выполняется один из двух операторов SQL.
if ($OrderQuantity == 0)
{
SsqlCartUpdate = 'DELETE FROM ShopCart WHERE OrderNo$_SESSION[OrderNo]' AND OrderItem='$OrderIterri";
}
else
{
SsqlCartUpdate = "UPDATE ShopCart SET OrderQuantity^SOrderQuantity1
WHERE OrderNo='$_SESSION[OrderNo]' AND OrderItem='$OrderItem'";
}
SrsCartUpdate = odbc_exec($sqlCartUpdate,$conn2);
К.С. Флойд
Введение в программирование на РНР5
В случае удаления или обновления, действие применяется к записи
ShopCart
с
полем
OrderNo
соответствующим
текущему
$ _ S E S S I ON [ O r d e r N o ] , и с полем $ O r d e r I t e m соответствующим
$ O r d e r I t e m из отправленной формы. Оператор DELETE удаляет из
таблицы
всю
запись;
оператор
UPDATE
изменяет
поле
$ O r d e r Q u a n t i t y в таблице на значение $ O r d e r Q u a n t i t y из
отправленной формы.
Сценарий выполняет итерации по всем позициям, отправленным через
форму проверяя имя поля на наличие символа "Q". Если символ
найден, то из имени извлекается код продукта и присваивается вместе
со значением количества переменным, которые используются при
обновлении таблицы S h o p C a r t . После завершения обработки массива
$_REQUEST[ ] соединение с базой данных закрывается и сценарий
заканчивается.
Итерации по массиву $_REQUEST[]
Может быть полезно использовать пример с отправленными
значениями
для
визуализации
массива
R e q u e s t . Form.
Предположим, что корзина покупателя содержит объекты, показанные
на иллюстрации выше, тогда при нажатии кнопки " U p d a t e " будет
создан следующий массив R e q u e s t . Form.
Массив $_REQUEST[]
Имя
QOS1111
Значение
2
UpdateButton Update
QBU1111
1
Здесь необходимо отметить один принципиальный момент, а именно,
что элементы массива не обязательно находятся в том же порядке, в
котором они появляются в форме; кроме того, нажатая кнопка также
является частью массива. Рассмотрим теперь итерации по элементам с
помощью цикла f o r e a c h , в котором переменная $ к е у указывает имя,
а $ v a l u e указывает значение:
К.С. Флойд
foreach($_REQUEST as $кеу=> $value) {
$кеу = "QOS1111"
$value = "2"
$кеу = 'XJpdateButton"
$value = 'Update"
$key = "QBU1111"
$value = "1"
}
Здесь можно видеть элементы данных, с которыми должен иметь дело
сценарий, и можно лучше понять действие сценария по извлечению
кода продуктов и обработке количества продуктов.
Покупка онлайн
Когда заказчик завершил выбор программного обеспечения для покупки
и готов оплатить продукты, он нажимает кнопку " C h e c k o u t "
("Оплатить"), чтобы завершить свою покупку
softWarehouse.com
Нате
.Shopping Cart
Shapping Can
Software Categories
Su&iupSS£>ffire
Delabase
OeskionPupii$mng
Graphics
Date iml'c:
Mil]..I Hli 84303*66
BU1111
Office JDQG Profession-al
OperaUng Systems
web Development
osini
YYlnUnwi Wien mum Ediddn |
Itfcm Numbei
Spnrc]i for:
I
Til It
ЕЕЗЗЕШ 1 Amount ]
Г гичз 359 E5
|
i имя
299.И
Shipping
a :o
Order Total | (SWl&S
ш
Uptfate
Qtkto
cbirtfridqirtfiiiti.Е?Й*гnewCfjSrWyOr
■е-тйегfltocancelp-fchaceol tern
ftc k So fnakre оп-lrit p u d u se through seccre connection
CheurD-Jt to
p#,№ontsystems
Обычно заказчики соединяются с онлайновой процессинговой
компанией кредитных карт, которая получает информацию о кредитной
карте, санкционирует покупку и соединяется с национальной
банковской системой, чтобы дебетовать и кредитовать соответствующие
К.С. Флойд
Введение в программирование на РНР5
банковские счета. Когда эти транзакции завершаются, заказчик
возвращается на сайт магазина, где получает подтверждение своего
заказа.
В то же самое время компания по обслуживанию кредитных карт
возвращает на сайт полученную от заказчика несекретную информацию,
имеющую отношение к выставлению счета. Эта информация затем
может использоваться для создания постоянной записи заказа для этого
клиента для будущих ссылок и для воссоздания исходного заказа, если
потребуется. Возвращаемая информация может, на самом деле,
применяться для соединения с системами бухгалтерского учета и склада
компании. Хотя мы не можем соединиться с федеральной банковской
системой для этого модельного приложения, мы можем достаточно
точно промоделировать обработку в компании по обслуживанию
кредитных карт и можем архивировать информацию о заказе, даже хотя
и не будем соединяться непосредственно с какими-либо другими
системами.
Отправка информации о заказе
Страница s h o p c a r t . p h p
содержит кнопку " C h e c k o u t " в
отдельной форме, отличной от той, которая используется для
обновления покупаемого количества товара. Это связано с тем, что
форма оформления передается компании по обслуживанию кредитных
карт, в то время как форма обновления снова соединяется со страницей
s h o p c a r t . php.
<?php if ($OrderTotal != 0) {?>
<div style="width:375px; line-height:8pt">
<form a c tio n=' http s У/... /с re d itcheck.php'' method="post">
<input type="hidden" name="ReturnURL" value="httpsy/..../ordercapture.php'
<input type="hidden" name="CompanyID" value="Webwarehouse.com">
<input type="hidden" name="CustomerID" value="<?php echo $_SESSION['
<input type="hidden" name="Amount" value="<?php echo $OrderTotal ?>">
<input type="submit" name="CheckoutButton" dass='buttonM"
style=' 'float:left;margin- right:5px'' value=' 'Checkout''
onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)">
К.С. Флойд
Введение в программирование на РНР5
<span c]ass="smaU">UI,enKHHTe, чтобы оплатить онлайн покупку через
</span>
</form>
</div>
<?php }
П рим ер 1 . 1 5 .
Для целей этого примера ACTION URL формы буцет
. ,/php/ecommerce/creditcheck.php
Этот адрес соединяется с модельной компанией обслуживания
кредитных карт, которая является просто страницей в каталоге сайта. Но
можно точно так же просто соединиться с реальной компанией.
Обычный метод взаимодействия с компанией по обслуживанию
кредитных карт состоит в передаче информации, связанной с текущей
покупкой с помощью множества скрытых полей формы. Как минимум
компании необходимо знать: 1) общую стоимость покупки, 2)
идентификатор сайта, присылающего информацию ( ID счета в
компании по обслуживанию кредитных карт), и 3) URL страницы, на
которую буцет возвращено подтверждение о выполнении транзакции.
Сайту продаж необходимо также отправить 4) идентификатор заказчика,
который может возвращаться вместе с подтверждением. Эти четыре
скрытых поля содержатся в форме с кнопкой " C h e c k o u t " .
Поле R e t u r n U R L используется для предоставления адреса, в который
возвращается информация компании кредитных карт. В данном примере
информация возвращается на страницу o r d e r c a p t u r e . p h p по
адресу
. ./php/ecommerce/ordercapture.php
Заказчик возвращается из компании кредитных карт на эту
промежуточную страницу прежде чем попасть на страницу
s a l e s o r d e r . p h p , на которой представляется окончательный заказ на
покупку и подтверждающее сообщение.
На этой
странице
К.С. Флойд
Введение в программирование на РНР5
o r d e r c a p t u r e . p h p мы получаем возвращаемую из компании
кредитных карт информацию для создания записи о заказе на продажу и
очистки корзины покупателя. Заказчик не видит эту страницу Она
содержит только сценарий РНР для обработки возвращаемой
информации и затем автоматически переадресуется на страницу
s a l e s o r d e r . p h p для вывода заказчику Позже мы рассмотрим это
подробнее.
Поле C o m p a n y ID содержит идентификатор счета сайта, отправившего
заказ.
В
качестве
такого
идентификатора
мы
применяем
" W e b w a r e h o u s e . com" . При использовании этого URL для проверки
кредитных карт можно ввести в это поле любую текстовую строку.
Поле C u s t o m e r ID содержит идентификатор заказчика. Это значение
возвращается компанией кредитных карт, чтобы мы знали, какому
заказчику или какому заказу соответствует возвращаемая информация.
Здесь
для
идентификации
заказчика
используется
значение
$_SESSION[OrderNo] .
Поле A m o u n t содержит общую стоимость заказа. Значение этого поля
задается с помощью переменной O r d e r T o t a l , которая доступна на
этой странице.
После отправки формы остается только подождать. Компания
кредитных карт выполняет в это время обработку Когда компания
завершит обработку она автоматически создает адрес R e t u r n U R L для
возврата на страницу o r d e r c a p t u r e . p h p , где продолжается
обработка.
Обработка кредитных карт
Когда заказчик направляется в компанию кредитных карт, первая
представленная форма появляется в следующем виде:
Credit Payment System s, Inc.
Please enlti efl tfto v u ttti tartfkHiito complete .our liafiSacflon
U
Anwwit
Webw a rehouse*.tom
144&Г5
Ассиг* На
и н ю докдо
OtottGJf'd
Ancriciir* E x p re ss
v
ЕдагаЬов О Л Hcrth W v real 300В v
Mama
Kevin Floyd
W
Macsrt
1uruCcilege Staton Cir.v
Siitt
CA
a*
31Ж
Phone.
in -W l
Emai
Заказчик заполняет информацию о кредитной карте и выставленном
счете и щелкает на кнопке " C o n t i n u e
P u r c h a s e " . Форма
проверяется, чтобы убедиться, что имеется вся информация, и затем
выводится страница подтверждения:
C redit Payment System s, Inc.
РЗыд* ifinlj the loflowuig s-L&nfled «ЛигпХЯМ rf anp saJuo is in «rrar return la 0ie
previous f4Q« to
4 anoгмшМ Фе
Ylfctowai uhous-ejccm
I444TS
лгтнчяН:
ChilliC*-l] «щадяЕда#»
|1111№Я№Н
Е д а и Н о л p a fifj
02
@ WH
Ч ате
Kevin Fleet!
Addmsa
1ЙОCelk-эе Slrtan Dims
StsKя:
|№
СЦг
Щс
№en*
Em*
Мкоп
лж
II■:.cgmлитй£спя1д1рtdu
j4.71-21»
Когда заказчик проверяет информацию, щелкая на кнопке " V e r i f y
I n f o r m a t i o n " , проверяется информация о кредитной карте.
К.С. Флойд
Введение в программирование на РНР5
Используется следующая процедура: если первые четыре цифры номера
счета ( A c c o u n t ) будут "0000", то заказ отвергается, если первые
четыре цифры будут любыми другими цифрами, то заказ принимается.
После обработки заказчик видит экран с подтверждением или отказом:
Credit Payment Systems, Inc.
.'•Л. . |М: $443.75
к
•appH'MU«
Curftrnuc
Когда заказчик щелкает на кнопке " C o n t i n u e " , делается обратная
ссылка на страницу определенную в отправляемой форме как
R e t u r n U R L . Эта страница, в примере o r d e r c a p t u r e . p h p ,
получает информацию о заказе и выставленном счете, которая была
получена от заказчика. Ее получение и обработка обсуждаются далее.
Запись информации о продажах
Подтверждение покупки и информация о выставленном заказчику счете
возвращается из компании кредитных карт на страницу указанную в
R e t u r n U R L , представленной формы. Это будет в нашем случае
страница o r d e r c a p t u r e . p h p . Информация посылается как скрытые
поля и доступна на этой странице в массиве $ _ POS T [ ] с помощью
следующих имен:
$_POST[Approval] true (заказ принят) или false (заказ отвергнут)
$_POST[Amount]
Общая сумма заказа в долларах
$_POST[CustomerID] Номер заказа заказчика
$_POST[Name]
Имя в счете к оплате заказчика
$_POST[Address]
Адрес в счете к оплате заказчика
$_POST[City]
Город в счете к оплате заказчика
$_POST[State]
Штат в счете к оплате заказчика
$_POST[Zip]
Zip-код в счете к оплате заказчика
К.С. Флойд
Введение в программирование на РНР5
$_POST[Phone]
$_POST[Email]
Номер телефона заказчика
Адрес e-mail заказчика
Страница o r d e r c a p t u r e . p h p является страницей на РНР без
какого-либо кода XHTML. Эта страница не выводится заказчику но
используется для выполнения фоновой обработки возвращаемой
информации, прежде чем направить заказчика на страницу
salesorder.php.
Существенная часть работы, которая должна быть выполнена на этой
странице, состоит в фиксации информации о заказа на продажу чтобы о
нем существовала постоянная запись. Эту запись можно использовать
для восстановления заказа, если понадобится, и для предоставления
информации для взаимодействия с системами бухгалтерии и склада
(если они существуют, так как в данном примере они отсутствуют).
Записи заголовка заказа и деталей заказа
Традиционный способ отслеживания заказов на продажу состоит в
создании двух типов записей о продажах. Запись заголовка заказа
содержит идентификационную информацию заказа, такую как номер
заказа, дату заказа, и информацию о счете к оплате заказчика. Для
каждого заказа существует одна запись заголовка заказа. Запись деталей
заказа содержит детали о купленных товарах - код товара, количество, и
цену Существует одна запись деталей заказа для каждого купленного
товара. Такая информация поддерживается в этих файлах, чтобы можно
было восстановить исходный заказ.
Файлы заголовка заказа и деталей заказа являются таблицами базы
данных, содержащимися в базе данных e C o m m e r c e . m d b . Их формат
показан ниже.
OrderHeader (таблица)
Имя поля
Тип поля Размер поля
OrderNo
Text
OrderDate
Date/Time
CustomerName
Text
10
50
CustomerAddress Text
50
CustomerCity
Text
50
Customer State
Text
2
CustomerZip
Text
10
CustomerPhone
Text
15
CustomerEmail
Text
50
OrderDetail (таблица)
Имя поля Тип поля
OrderNo
Text
Размер поля
10
ItemNumber Text
6
ItemTitle
Text
50
ItemPrice
Валюта
с 2 знаками после запятой
ItemQuantity Числовое long integer
Получение информации заказа
Первая часть сценария на странице o r d e r c a p t u r e . p h p собирает
информацию, посланную из компании кредитных карт через массив
$ _ POS T[ ] и присваивает ее переменным для упрощения записи кода.
<?php
'— Сбор информации, возвращаемой компанией кредитных карт
$Approval= $_POST[Approval];
$Amount = $_POST[Amount];
$OrderNo = $_POST[CustomerID];
$Name = $_POST[Name];
$Address = $_POST[Address];
$City = $_POST[City];
$State = $_POST[State];
$Zip = $_POST[Zip];
$Phone = $_POST[Phone];
$Email= $_POST[EuHil];...
Компания 1федитных карт посылает флаг A p p r o v a l , задаваемый как
К.С. Флойд
Введение в программирование на РНР5
" T r u e " или " F a l s e " в зависимости от того, был подтвержден заказ
или нет. Если заказ подтвержден, необходимо сохранить информацию о
заказе в таблицах O r d e r H e a d e r и O r d e r D e t a i l ; если заказ не был
подтвержден, то информация не сохраняется, так как продажа не была
сделана. В любом случае, однако, необходимо очистить корзину
покупателя этого заказа. Не существует пока никаких ожидающих
заказов.
Общая логика сценария для обработки этих задач обработки показана
ниже.
if ($Approval) {
'— Создать запись OrderHeader
'— Создать запись OrderDetail
}
'— Создать таблицу ShopCart
Создание записи OrderHeader
Сценарий начинается с открытия соединения с базой данных
e C o m m e r c e . Это соединение необходимо для очистки корзины
покупателя, независимо от того, будут или нет созданы записи заказа.
Затем, если было получено подтверждение от компании кредитных
карт, сценарий создает запись O r d e r H e a d e r .
$conn= odbc_connect('Driver= {Microsoft Access Driver
(*.mdb)};DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\
databases\ecommerce.mdb',",");
if ($Approval)
{
$sqllnsert= 'INSERT INTO OrderHeader (OrderNo,OrderDate,CustomerNar
C ustomerAddress, C ustomerC ity, Customer State,
CustomerZip,CustomerPhone,CustomerEmail)
Values('$OrderNo','$Date','$Name',
К.С. Флойд
'$Address','$City7$State','
$ZipV$Phone','$Ermil')''; $rslnsert = odbc_exec($conn,$sqlInsert);
}
Этот процесс состоит просто в создании новой записи в таблице
O r d e r H e a d e r и копировании полей, посланных из компании
кредитных карт в новую запись. Поле O r d e r D a t e заполняется текущей
системной датой. После того как запись заполнена и обновлена,
множество записей закрывается.
Создание записей OrderDetail
Затем сценарий создает одну или несколько записей в таблице
O r d e r D e t a i l . Информация для этой таблицы, однако, приходит не из
компании кредитных карт. Часть ее находится в таблице S h o p C a r t , а
часть — в таблице P r o d u c t s . Мы, фактически, переносим детали
текущего заказа в подобное множество записей O r d e r D e t a i l . Мы
начинаем сценарий с создания трех множеств записей, необходимых
для работы: множество записей $ R S D e t a i l для доступа к таблице
O r d e r D e t a i l , множество записей $RS ShopCart для доступа ктаблице
S h o p C a r t и множество записей $ R S P r o d u c t s для доступа к
таблице P r o d u c t s .
'— Создание записи OrderDetail
SsqlDetail ="SELECT * FROM OrderDetail WHERE NULL";
SrsDetail = odbc_exec($conn,$sqlDetail);
SsqlShopCart ="SELECT * FROM ShopCart WHERE OrderNo ='$OrderNo'
SrsShopCart = odbc_exec($conn,$sqlShopCart);
while ($row = odbc_fetch_array($rsShopCart))
{
$sq!Prod = "SELECT IternT5tle,IternPrice FROM Products WHERE ItemNumt
$rsProd = odbc_exec($conn,$sq!Prod);
К.С. Флойд
$ProdTitle = о db e r e sult($ rsP ro d, Ite mTitle);
$ProdPrice = odbc_result($rsProd,ItemPrice);
SsqUnsertDetail = 'INSERT INTO OrderDetail(OrderNo,ItemNumber,Ite
SrsInsertDetail = odbc_exec($conn, SsqUnsertDetail);
}
П рим ер 1 . 1 6 .
Сценарий выполняет итерации по записям корзины покупок в поиске
соответствующих O r d e r N o , копирует поля O r d e r N o , O r d e r l t e m и
O r d e r Q u a n t i t у в соответствующие поля записи O r d e r D e t a i l .
Затем поле O r d e r l t e m используется для извлечения I t e m T i t l e и
I t e m P r i c e для этого продукта из таблицы P r o d u c t s и копирования
их в поля t h e I t e m T i t l e и I t e m P r i c e записи O r d e r D e t a i l .
Подготовленная запись обновляется в таблице O r d e r D e t a i l , и
начинается обработка следующей записи корзины покупок. В конце мы
будет иметь запись в таблице O r d e r D e t a i l для каждой записи
корзины покупателя.
Очистка корзины покупателя
Конечная часть сценария очищает корзину покупок от купленных
товаров. Эти записи идентифицируются наличием O r d e r N o ,
соответствующим O r d e r N o подтвержденного или отвергнутого заказа.
'— Очистка ShopCart
SsqlDelete = 'DELETE FROM ShopCart WHERE OrderNo='$OrderNo'";
SrsDelete = odbc_exec($conn,$sqDelete);
header("Location:salesorder.php?Approval=$Approval")
Когда эта "фоновая" обработка завершается (вспомните, что на этой
странице нет кода XHTML), происходит немедленная переадресация на
страницу s a l e s o r d e r . p h p . Подтверждающее уведомление также
передается на эту страницу для управления обработкой, которая там
происходит.
Создание заказа на продажу
Мы приходим теперь на первую страницу которую видит заказчик, когда
покидает компанию кредитных карт. Эта страница s a l e s o r d e r . p h p
представляет сводку подтвержденного заказа (или сообщение "простите"
при отвергнутом заказе), которую заказчик может распечатать для
справки. Также, поскольку заказ был завершен, выводится новый номер
заказа, на тот случай, если заказчик захочет продолжить покупки.
webWarehouse.com
KirtiS
Snapping Cart
Сап*
РаВДмя
СмНар PuflliHvg
Gtiiifna
Qp«ra3n£SrbsamE
Web D-evelортит!
Sulen O r d e r
Dal*: Ш М И
OrHi’t
ЩЛПННПВ
Квил Fh4U
IMCefleflaSHBWiOin*
ЫИФП.СА.313К
1 llem IliirCwr 1
5U222?
Srarch for:
GR5555
Flash 5
l№
1 2 ^9500
W K
1 M i. M M
M * 96
13.1Q
Sftttprag
J
ftd n
T o te
ИНТн
l
Thartr ■sj Гсг tctir cedm Fleas? pnnlfras page and гаПотрпед .c-jr rndflr nuTiL-rn on an, injuries
:--dcr mil to shipped mrreojrjch
Tv j
Основной раздел этой страницы начинается с заголовка страницы и
получения строки запроса A p p r o v a l , переданной со страницы
o r d e r c a p t u r e . p h p . Если подтверждение заказа будет " t r u e " , то
начинается процесс вывода информации о заказе.
<div style="position:absolute; top:75px; left:200px; width:550px">
<span class="headl">Sales Order</span><br>
<span class="head4">Date: </span><?php echo dateCn/d/y1) ?><br>
<span class="head4">Order No: </span><?php echo $_SESSION[OrderNo] 1
<br>
<?php
$Approval = $_GET[Approval]
К.С. Флойд
if ($Approval)
{
$conn = odbc_connect('Driver= {Microsoft Access Driver (*.mdb)};DBQ=c:\
$sql = "SELECT * FROM OrderHeader WHERE OrderNo='$_SESSION[0
$rsHeader = odbc_exec($conn,$sql);
if (odbc_result($rsHeader,OrderNo) == "")
{
odbc_close($conn);
ob_flush();
header('Locationiiome.php")
}
$slqOrders = "SELECT * FROM OrderDetail WHERE OrderNo='$_SESSIC
$rsOrder = odbc_exec($conn,$sqlOrders);
?>
П рим ер 1 . 1 7 .
Создается объект соединения для связи
с базой данных
e C o m m e r c e . m d b и используется оператор SQL для извлечения
информации из таблиц O r d e r H e a d e r и O r d e r D e t a i l . Эти
множества записей имеют общий номер заказа, который находится в
глобальной переменной
$ _ S E S S I ON [ O r d e r N o ] . Тогда будет
доступна вся информация для восстановления заказа, начиная с
информации о выставленном счете к оплате, извлеченной из таблицы
OrderHeader.
Стоит обратить внимание на небольшой раздел кода, следующий за
открытием таблицы O r d e r H e a d e r .
if (odbc_result($rsHeader, OrderNo) == "")
{
odbc_close($conn);
ob_flush();
header('Locationiiome.php")
К.С. Флойд
Введение в программирование на РНР5
}
Этот сценарий проверяет условие EOF на множестве записей, которое
означает, что для O r d e r N o не было найдено подходящего значения. Как
это может случиться, и зачем проверять? Это может случиться, если
заказчик использует кнопку браузера " B a c k " ("назад") для возврата на
предыдущую страницу (страница подтверждения компании кредитных
карт), а затем снова нажимает кнопку " в п е р е д " ( " f o r w a r d " ).
Когда данная страница загружается впервые для представления заказа
на продажу конечная часть сценария создает для заказчика новый номер
заказа (см. ниже). Поэтому если заказчик возвращается на страницу
назад, а затем снова перемещается вперед, номер заказа, вновь
посланный компанией кредитных карт, не будет совпадать с номером
текущего заказа, и будет порождаться ошибка сценария. Данный раздел
кода позволяет избежать этой проблемы, перенаправляя заказчика на
страницу h o m e . p h p , если отсутствует совпадение. Невозможно
запретить использовать кнопку браузера для возврата на предыдущую
страницу но можно перехватывать все проблемы, которые возникают
при перемещении вперед.
Сценарий затем продолжает создание заказа на продажу выводя
информацию о счете платежа и деталях покупки.
<?php echo odbc_result($rsHeader,CustomerName) ?><br>
<?php echo odbc_result($rsHeader,CustomerAddress) ?><br>
<?php echo odbc_result($rsHeader,CustomerCity) ?>,
<?php echo odbc_result($rsHeader,CustomerState) ?>
<?php echo odbc_result($rsHeader,CustomerZip) ?><br>
<br>
<table border="0" cellpadding="3">
<tr>
<th>Item Number</th>
<th>Title</th>
<th>Quantity</th>
<th>Price</th>
<th>Amount</th>
</tr>
<?php
К.С. Флойд
$OrderTotal = О
while ($row = odbc_fetch_array($rsDetail) {
$ItemNumber = $row[ItemNumber]
$ItemTitle = $row[ItemTitle]
$ItemPrice = $row[ItemPrice]
$ItemQuantity = $row[ItemQuantity]
$ItemAmount = $ItemPrice * $ItemQuantity
$OrderTotal = $OrderTotal + $ItemAmount
echo "<tr>
<td>$ItemNumber</td>
<td><$ItemTitle</td>
<td style=\"text-a]ign:right\">$ItemQuantity</td>
<td style=\"text-a]ign:right\">$number_forrmt($ItemPrice,2)</td>
<td style=\"text-a]ign:right\">$number_forrmt($ItemAmount,2)</td>
</tr>";
}
odbc_close($conn);
$OrderShipping = number_forrmt($OrderTotal * .02,2);
$OrderTotal= number_forrmt($OrderTotal + $OrderShipping,2);
echo "<tr>
<td colspan=\"4\" style=\"text- align:right\">Shipp ing </td>
<td style=\"text-a]ign:right\">$OrderShipping</td>
</tr>
<tr>
<th сокрап=\"4\" style=\"te xt- a 1ign:right\"> О rd e r Total </th>
<td style=\"border-style:solid\"><b>$OrderTotal</b></td>
</tr>";
?>
</table>
<br>
Спасибо за ваш заказ. Пожалуйста, распечатайте эту страницу и указы
<?php }
else
{
К.С. Флойд
Введение в программирование на РНР5
echo "Простите, но вы не можете завершить свой заказ. Когда вы решит
возвращайтесь, пожалуйста, на <span c]ass=\'head4\">WebWarehouse.con
}
?>
П рим ер 1 . 1 7 .
Форматирование этого заказа на продажу аналогично тому которое
использовалось при выводе корзины покупателя. Сценарий выполняет
цикл по записям, извлеченным из таблицы O r d e r D e t a i l , создавая
строку для каждой записи. Как и раньше, вычисляется каждое значение
$ I t e m A m o u n t , накапливается общая сумма O r d e r T o t a l
и
вычисляется $ O r d e r S h i p p i n g на $ O r d e r T o t a l .
(Здесь снова возникает тот случай, когда можно подумать о том, чтобы
хранить плату за доставку в записи O r d e r H e a d e r , а не вычислять ее
во время создания заказа. Позже, когда этот заказ будет восстановлен,
скорее всего, будет изменение в проценте оплаты и общая стоимость
заказа будет отличаться от текущей. Здесь эта проблема рассматриваться
не будет.)
Сброс номера заказа
Теперь важная часть этой обработки. Заказ клиента завершен. Поэтому
необходимо присвоить новое значение O r d e r N o на тот случай, если
заказчик захочет продолжить покупку Если он сделает это без нового
номера, то в результате получится дублирование номера заказа и
возникнет путаница при попытке разделить заказы клиента. Конечный
шаг обработки на этой странице состоит тогда в присваивании нового
номера с помощью той же процедуры, которая использовалась, когда
клиент впервые прибыл на сайт.
<?php
Assign new OrderNo
SOrderNo = r a n d ( l l l l l l l l l l , 9999999999)
$_SES S ION [OrderN o] =$OrderNo
?>
</div>
Все прошло полный круг. В этой точке бывший заказчик становится
новым заказчиком и может начинать покупку с самого начала.
На этом завершается обсуждение базовых механизмов работы
онлайнового сайта е C o mme r c e . Можно, конечно, добавить еще
множество свойств и функций. Мы рассмотрим еще одно автоматическое создание подтверждения заказа по e-maiL
Отправка подтверждения по E-mail
Обычно компании посылают подтверждение по e-mail заказов, когда
они приняты к выполнению. С помощью сценария множено создавать
автоматические сообщения e-mail, и такая возможность будет добавлена
в приложение е C o mme r c e . Следующая иллюстрация показывает
формат подтверждающего сообщения, которое получит заказчик.
\\'е1Д\ лгсЬпцнс.сиш
Pitt ItfIMK
с.jr, tfy
К«via Fbyd
]QO
E№ii Drnff
Млten. С-Л 3120S
TT-j i J c. jhu Гот you- w-itr
iffT 'o rte y v a drop-pne sc^’Si'erlwypc с-лп II у "** b n * «гг до б Ьсш
■;т 'й ff.£iW« Ь д « Ь ? upj i ; *od jei'rr trite <±jt w i t f itja h tt b ie d Above
[|*л .Niiinbpi
WM+И
TilJp
i..'ii.mlily
CT-,IdFuBJiiShfic.^5
у-:*я «rder. у!? as? «ые! « jk
Fiwp .Ajmmcrl
1 47* S3 47? 95
ilxf'pau;
9.60
Функция mail()
В PHP имеется функция mail(), предназначенная для создания сообщений
К.С. Флойд
email под управлением сценария.
mail() содержит параметры для создания и отправки email, по большей
части также, как это происходит в обычной почтовой программе. Среди
свойств и параметров нам понадобятся следующие:
Свойство
Описание
to
Строка, представляющая адрес e-mail получателя сообщения
subject
Строка, представляющая строку тему сообщения
message
Строка, представляющая основное тело сообщения
headers
Строка, представляющая дополнительную информацию,
которая включается в начале сообщения e-mail
В простейшем виде сценарий e-mail может выглядеть следующим
образом:
<?php
$to
= 'youraddress@domain.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com'. "\r\n".
'Reply-To: webmaster@example.com'. "\r\n".
'X-Mailer: P H P /'. phpversion();
mail($to, $subject, $message, $headers);
?>
Конечно необходимо еще с ним поработать, чтобы составить сообщение
о подтверждении заказа, особенно если оно форматируется для
представления в виде формы заказа.
Размещение сценария
Лучшим местом для сценария подтверждения заказа по email является
страница o r d e r c a p t u r e . p h p . Эта страница получает информацию
от компании кредитных карт и создает для заказчика записи
К.С. Флойд
Введение в программирование на РНР5
O r d e r H e a d e r и O r d e r D e t a i l , а также содержит всю информацию,
необходимую для составления сообщения e-maiL Размещение сценария
показано на следующем эскизе страницы:
<div style="position:absolute; top:75px; left:200px; width:550px">
<?php
$Approval= $_POST[Approval];
if ($Approval)
{
$sqllnsert= 'INSERT INTO OrderHeader (OrderNo, OrderDate,CustomerNc
CustomerCity,CustomerState,CustomerZip,CustomerPhone,CustomerEmail) Vi
$rslnsert = odbc_exec($conn,$sqlInsert);
//Создание записи OrderDetail
$sq!Detail ="SELECT * FROM OrderDetail WHERE NULL";
$rsDetail = odbc_exec($conn,$sqlDetail);
SsqlShopCart ="SELECT * FROM ShopCart WHERE OrderNo ='$OrderNo'
SrsShopCart = odbc_exec($conn,SsqlShopCart);
while ($row = odbc_fetch_array($rsShopCart))
{
SsqlProd ="SELECT ItemTitle,IternPrice FROM Products WHERE ItemNuml
SrsProd = odbc_exec($conn,SsqlProd);
SProdTitle = odbcjesult($rsProd,ItemTitle);
SProdPrice = odbc_result($rsProd,ItemPrice);
SsqllnsertDetail = "INSERT INTO OrderDetail (OrderNo,ItemNurnber,ItemQr
ItemT5tle,ItemPrice) Values ('$row[OrderNo]','$row[OrderItem]',
К.С. Флойд
'$row[OrderQmntity]','$ProdTitle','$ProdPrice')'';
SrsInsertDetail = odbc_exec($conn,$sqUnsertDetail);
}
//ВСТАВЬТЕ СЮДА СЦЕНАРИЙ E-MAIL
$to
= 'youraddress@dormin.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webrmster@example.com'. "\r\n".
'Reply-To: webrmster@example.com'. "\r\n".
'X-Mailer: P H P /'. phpversion();
mail($to, $subject, $message, $headers);
/Л^даление корзины покупателя
$sq!Delete = 'DELETE FROM ShopCart WHERE OrderNo='$OrderNo'";
$rsDelete = odbc_exec($conn,$sqlDelete);
odbc_close($conn);
//echo $sqlInsertDetail;
header('Location:salesorder.php?Approval=$Approval");
}
?>
Пример 1.18.
Программирование сообщения E-mail
Начнем теперь программирование сценария, который вставляется на
страницу Необходимо сделать так, чтобы поле e-mail было не
обязательным на форме проверки кредитной карты. Некоторые
К.С. Флойд
Введение в программирование на РНР5
заказчики могут не предоставлять адрес e-mail, и мы не сможем послать
им подтверждающее сообщение. Поэтому весь сценарий находится
внутри условного оператора.
if ($Email) {Then
'— Послать подтверждение заказа по e-mail
$to = $Email
$subject = "Order $OrderNo Confirmation"
Прежде всего, необходимо инициализировать параметры mail() — $ t o и
$ s u b j e c t . Параметру $ t o присваивается один из элементов
информации, посланной из компании кредитных карт и полученной в
начале этой страницы. Переменная содержит адрес e-mail заказчика. Это
должен быть реальный, действительный адрес e-mail
Присваивание $ s u b j e c t использует текстовую строку которая
включает для идентификации значение переменной $ O r d e r N o .
Теперь необходимо составить тело сообщения, форматируя его с
помощью HTML для создания общей компоновки и внешнего вида.
Вспомните из сказанного ранее, что тело должно быть одной строкой
текста. Поэтому нельзя написать последовательность отдельных строк
HTML и присвоить их параметру $message. Необходимо представить их
в виде одной строки. Мы делаем это, задавая переменную $message, а
затем помещаем в нее одну длинную строку собирая ее из отдельных
подстрок. Такой подход можно видеть в следующем фрагменте кода.
$message=""
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
& "<html>"
& "<$message>"
& "<h2>WebWarehouse.com</h2>"
& 'Date: dateCn/d/y1) "<br>"
& "Order No.: $OrderNo "<br>"
& "<br>"
& Name & "<br>"
& Address & "<br>"
& City & "," & State & "" & Zip & "<br>"
& "<p>"
К.С. Флойд
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
$message=$message
Введение в программирование на РНР5
& "Thank you for your order. We appreciate your shopp
& 'WebWarehouse.com. If you have any questions abor
& "please email us a t "
& "<a href=mailto:orders@WebWarehouse.com>orders
& "and reference the order number listed above."
& "</p>"
& "<table border=0 cellpadding=3>"
& "<tr>"
& " <th>Item Number</th>"
& " <th>Title</th>"
& " <th>Quantity</th>"
& " <th>Price</th>"
& " <th>Amount</th>"
& "</tr>"
Пример 1.19.
Каждая подстрока текста соединяется с переменной $ m e s s a g e ,
создавая постепенно в переменной одну текстовую строку Эта строка
содержит также теги XHTML для форматирования вложенного текста.
Отметим, что переменные $ D a t e , $ O r d e r N o , $Name, $ A d d r e s s ,
$ C i t y , $ S t a t e , и $ Z i p , полученные из информации 1федитной
компанией, встраиваются в увеличивающуюся строку. Конечная часть
кода создает заголовки таблицы для информации заказа на продажу
которая форматируется далее.
Затем необходимо собрать информацию заказа на продажу из таблицы
O r d e r D e t a i l и сформатировать ее как строки таблицы.
$sqlMail= "SELECT * From OrderDetail WHERE OrderNo = '$OrderNo'";
$rsMail = odbc_exec($conn,$sqlMail);
while ($row = odbc_fetch_anay($rsMail))
{
$ItemN umber =$row[ItemNumber];
$ItemTrtle =$row[ItemTitle];
$ItemQuantity = $row[ItemQuantity];
К.С. Флойд
$ItemPrice = $row[ItemPrice];
$ItemAmount = $ItemQuantity * $ItemPrice;
$OrderTotal = $OrderTotal + $ItemAmount;
$message = $message . "<tr>";
$message = $message <td>". $ItemNumber . "</td>";
$message = $message ." <td>". $ItemTitle . "</td>";
$message = $message ." <td align=right>". $ItemQuantity. "</td>";
$message = $message ." <td align=right>". number_format($ItemPrice,2).
$message = $message ." <td align=right>". number_fonmt($IternAmount,i
$message = $message . "</td>"
}
Это делается здесь в цикле w h i l e : значения полей помещаются в
переменные, которые форматируются в ячейки таблицы и соединяются
со строкой $ m e s s a g e . По мере выполнения цикла накапливается
значение переменной $ O r d e r T o t a l .
$ShippingCharge = $OrderTotal * .02;
$OrderTotal = $OrderTotal + $ShippingCharge;
$message = $message . "<tr>";
$message = $message . "<td colspan=4 align=right>Shipping</td>";
$message = $message ." <td align=right>". nurnber_forrmt($ShippingCharge
$message = $message . "</tr>";
$message = $message . "<tr>";
$message = $message . "<td colspan=4 align=right>Order Total</td>";
$message = $message . "<td align=right>". number_forrnat($OrderTotal,2). '
$message = $message . "</tr>";
$message = $message . "</table>";
$message = $message . "</body>";
$message = $message . "</html>";
$headers = 'From: sales@webwarehouse.com'. "\r\n".
'Reply-To: sales@webwarehouse.com'. "\r\n".
'Content-Type:text/html;charset=us-ascii'. "\r\n".
'X-Mailer: P H P /'. phpversion();
mail($to, $subject, $message, $headers);
К.С. Флойд
Введение в программирование на РНР5
После того как сценарий выполнил итерации на множестве записей,
форматируя отдельные строки таблицы для купленных продуктов,
вычисляется и форматируется $ S h i p p i n g C h a r g e , вместе с
$ O r d e r T o t a l , как две последние строки таблицы. Закрывающие теги
HTML присоединяются в конце строки $ m e s s a g e , и сообщение e-mail
завершается.
После завершения формирования сообщения e-mail мы создаем
переменную $ h e a d e r s для хранения заголовочных данных, которые
нужны для описания сообщения. В данном случае мы добавляем
заголовочные сообщения F r o m (указывает адрес e-mail, откуда было
прислано сообщение), R e p l y - Т о (адрес e-mail, который появится в
поле ТО получателя, если он будет отвечать на автоматическое
сообщение), C o n t e n t - T y p e (определяет формат сообщения) и XM a i l e r (определяет версию РНР, используемую для генерации
сообщения). Хотя заголовочные сообщения являются необязательными,
рекомендуется всегда их включать.
Если
сообщение
e-mail содержит
HTML,
который должен
интерпретироваться соответствующим образом, то необходимо
использовать следующее значение заголовка.
' С ontent- Type:text/html; charset=us- ascii'
Последний шаг состоит в вызове встроенной функции mail().
Необходимо упомянуть попутно, что прежде чем можно будет послать
сообщение e-mail через сценарий РНР, сервер Web должен иметь
выполняющуюся службу SMTP (Простой протокол пересылки почты), и
может понадобиться внести изменения в файл РНР . i n i . Особенности
настроек различных серверов можно найти на сайте РНР.
К.С. Флойд
Введение в программирование на PHP5
Справочник SQL
Оператор SELECT
Системы управления базами данных предоставляют для работы с
информацией в базе данных язык структурированных запросов SQL.
При использовании SQL всю работу выполняет система управления
базой данных. Вместо программирования серверных сценариев для
доступа к таблицам или для обслуживания данных в базе данных,
можно передать эту работу СУБД. Сценарий просто создает запрос SQL
для СУБД, которая самостоятельно выполняет задачу. Такой метод
способствует использованию трехслойных, клиент-серверных систем,
где доступ к данным и обработка базы данных локализованы на сервере
базы данных.
Оператор SELECT
Наиболее часто используемым оператором SQL является оператор
SELECT. Как предполагает его имя, этот оператор используется для
выбора записей из таблицы базы данных. Выборка может охватывать
всю таблицу со всеми полями, или она может быть ограничена
определенными полями определенных записей, которые соответствуют
заданным критериям поиска. При желании выбранные записи можно
упорядочить или отсортировать по определенным полям. Группа
выбранных записей сама становится множеством записей, которое
можно обрабатывать таким же образом, как и при работе со всей
таблицей.
Общий формат оператора SELECT показан ниже:
SELECT [TOP n | [PERCENT]] * | [DISTINCT] field1 [,feld2]„. FROM Tabl
WHERE criteria
ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...
За ключевым словом SELECT следует одна или две спецификации,
определяющие поля данных, которые будут выбраны из таблицы.
Звездочка (*) означает, что для каждой записи будут выбраны все поля.
К.С. Флойд
Введение в программирование на PHP5
Иначе можно определить список имен полей, разделенных запятыми, и
будут выбраны только эти поля данных. Предложение FROM
определяет таблицу из которой эти записи и поля будут выбраны.
Например, оператор
SELECT * FROM MyTable
выбирает все записи из таблицы M y T a b l e и включает все поля (*),
которые составляют запись. Получаемое множество записей идентично
тому, которое будет получено при открытии всей таблицы. В
противоположность этому, оператор
SELECT LastName, FirstName FROM MyTable
выбирает все записи из таблицы, но предоставляет только поля с
именами L a s t N a m e и F i r s t N a m e из всех полей записей. В этом
случае получаемое множество записей содержит столько строк, сколько
имеется записей в таблице, но только с двумя столбцами.
Ключевое слово DISTINCT
Некоторые поля таблицы, вполне вероятно, содержат не уникальные
значения данных. То есть, одно и то же значение может появляться
более чем в одной записи. Чтобы извлекать только уникальные значения
из этих полей, надо перед именем поля поставить ключевое слово
D I S T I N C T . Например, следующий оператор извлекает один столбец
данных, содержащий только уникальные значения в поле с именем
ItemType:
SELECT DISTINCT ItemType FROM Products
Предложение WHERE
В обоих приведенных выше случаях из таблицы извлекаются все
записи. Различаются только поля, которые составляют запись. Однако
могут быть ситуации, когда не требуется извлекать все записи из
К.С. Флойд
Введение в программирование на PHP5
таблицы. Может быть желательно выбрать только те записи, которые
удовлетворяют определенному критерию. Для этих целей оператор
SELECT предоставляет дополнительное предложение WHERE.
За ключевым словом WHERE следует один или несколько критериев
выбора. Распространенный способ использования этого свойства
состоит в проверке равенства, то есть поиска совпадающего значения в
одном из полей записи. Например, если множество записей заказчиков
обрабатывается на основе штата, в котором они расположены, то может
быть желательно выбирать только те записи, где поле S t a t e содержит
значение " GA" . Для этого можно использовать оператор SQL,
SELECT * FROM Customers WHERE State='GA'
а система управления базой данных предоставит только те записи,
которые имеют совпадающий код штата. Фактически для определения
критерия выбора можно выбрать любой из обычных операторов
сравнения
= (равно)
<> (не равно)
< (меньше)
> (больше)
<= (меньше или равно)
=> (равно или больше)
Кроме того, можно объединять критерии, используя логические
операторы AND, OR и NOT для расширения или сокращения области
выбора:
SELECT * FROM Customers WHERE State='GA' OR State='KY'
Отметим в этих примерах, что значения критерия выбора заключаются
в одиночные кавычки (апострофы). При любом поиске в текстовых
полях базы данных значение критерия должно заключаться в одиночные
кавычки ( WHERE S t a t e = ' GA' ). Если тестируется числовое поле,
значение данных в кавычки не заключается ( WHERE N u m b e r > 10 ).
Если тестируется поле даты/времени, то значение критерия окружается
Предложение ORDER BY
Оператор SELECT может включать также предложение ORDER BY,
чтобы организовать или отсортировать извлеченное из таблицы
множество записей.
Предложение ORDER BY идентифицирует имена полей, по которым
сортируются записи. Если используется более одного имени поля, то
сортировка происходит в том порядке, в котором появляются
разделенные запятыми имена. Первое поле становится основным
полем сортировки, второе поле становится промежуточным полем
сортировки, а третье поле — младшим полем сортировки. Поэтому
можно упорядочить имена по фамилии, затем по имени, и затем по
отчеству, применяя оператор SELECT следующего вида:
SELECT * FROM Customers ORDER By LastName,FirstName,MiddleInitial
Можно также определить, будет ли упорядочивание происходить в
возрастающей или убывающей последовательности, задавая ASC или
DESC вслед за именем поля. По умолчанию используется
возрастающий порядок ( ASC ), который можно не задавать.
SELECT * FROM Customers ORDER By LastName(DESC),FirstName(ASC
Предложение WHERE и ORDER BY являются необязательными в
операторе SELECT, но также могут появляться. Однако, если
применются оба, предложение WHERE должно предшествовать
предложению ORDER BY.
Предикат TOP n
Если поставить перед выбранным полем TOP n , то будет возвращено n
записей, которые будут находиться вверху или внизу диапазона,
определенного предложением ORDER BY. При упорядочивании по
К.С. Флойд
Введение в программирование на PHP5
возрастанию ( DESC ) извлекается верхняя часть диапазона, при
упорядочивании по убыванию ( ASC ) — нижняя часть диапазона.
SELECT TOP 10 ItemName, ItemPrice FROM Products ORDER BY ItemPric
Этот оператор выбирает 10 самых дешевых продуктов из таблицы.
Можно использовать также зарезервированное слово PERCENT, чтобы
возвращать определенный процент записей, которые попадают в
верхнюю или нижнюю часть диапазона, определенного предложением
ORDER BY.
Создание строк SQL
Иногда операторы SELECT могут стать достаточно сложными со всеми
полями выбора, критериями выбора и предложениями упорядочивания.
Поэтому часто удобно сначала создать оператор в переменной
сценария, а затем выполнить оператор с помощью имени переменной.
SQLString = "SELECT * FROM Customers WHERE State='GA' ORDER BY
Здесь
строка
символов,
составляющих
оператор
SELECT,
присваивается переменной S Q L S t r i n g . Затем эта переменная
используется для выполнения оператора SQL.
Если оператор SELECT является особенно длинным или сложным, то
можно составить его по частям, соединяя отдельные строки:
SQLString = "SELECT * FROM Customers "
SQLString &= "WHERE State='GA' OR State='KY' "
SQLString &= "ORDER BY LastName(DESC), FirstName, MiddleInitial"
или применив символ продолжения строки:
SQLString = "SELECT * FROM Customers " _
& "WHERE State='GA' OR State='KY' " _
& "ORDER BY LastName(DESC), FirstName, MiddleInitial"
Здесь последующие предложения соединяются, чтобы создать строку
SQL (не забывая добавлять необходимые пробелы для разделения
К.С. Флойд
Введение в программирование на PHP5
предложений).
Апострофы в текстовых полях
Текстовые значения часто содержат апострофы, например, имена
( O’ R e i l l y ) , притяжательный падеж ( B i l l ’ s ), сокращения ( i t ’ s
) и тому подобное. Однако оператор SQL вида
SELECT * FROM Customers WHERE LastName = 'O'Reilly1
будет вызывать ошибку, так как не разрешается кодировать апостроф
внутри значения, которое само заключено в апострофы. Решение
проблемы состоит в применении двойного апострофа ('') вместо любого
одиночного апострофа внутри значения:
SELECT * FROM Customers WHERE LastName = 'O'Reilly1
Интегрирование данных переменной
Обычно в операторах SQL используются порождаемые сценарием
данные, а не строковые или числовые константы. В этом случае
сценарий должен создать соответствующий оператор SELECT,
соединяя фиксированную часть оператора SELECT с переменными
данными:
SQLString = "SELECT * FROM Customers WHERE State = '$TheState'"
Если переменная T h e S t a t e имеет значение ” GA” , то S Q L S t r i n g
будет содержать оператор SQL:
SQLString = "SELECT * FROM Customers WHERE State = 'GA'"
Отметим, что апострофы, включенные в литеральные текстовые строки,
окружают переменную, так что значение T h e S t a t e равное ” GA”
интерпретируется как строка ( ’ GA ’ ) в операторе SELECT.
При извлечении числовых данных апострофы не требуются:
К.С. Флойд
Введение в программирование на PHP5
SQLString = "SELECT * FROM Customers WHERE Age = $TheAge"
Значение переменной T h e A g e добавляется в конце литеральной
строки, создавая оператор SELECT следующего вида:
SQLString = "SELECT * FROM Customers WHERE Age = 30"
При создании операторов, включающих дату, переменная должна быть
заключена в специальные символы " # " :
SQLString = "SELECT * FROM Orders WHERE OrderDate = #$TheDate#"
Получающая строка в переменной S Q L S t r i n g представляет оператор
SELECT следующего вида:
SQLString = "SELECT * FROM Orders WHERE OrderDate = #07/15/04#"
Поэтому как общее правило, операторы SQL SELECT для трех типов
данных имеют следующие общие конструкции:
SQLString =
"SELECT * FROM Table WHERE StringField = '$StringVariable'"
"SELECT * FROM Table WHERE NumericField = $NumericVariable
"SELECT * FROM Table WHERE DateField = #$Date Variable#"
Оператор INSERT
Оператор INSERT используется для добавления записей в таблицу
базы данных. Его общий формат для добавления одной записи показан
ниже:
INSERT INTO TableName
[(FieldName1 [,FieldName2]...)]
VALUES (Value1 [,Value2]...)
После ключевых слов INSERT INTO следует имя таблицы, в которую
будет добавлена новая запись. При желании за именем таблицы может
следовать заключенный в скобки и разделенный запятыми список имен
полей, для которых задаются значения. Предложение VALUES задает, в
К.С. Флойд
Введение в программирование на PHP5
скобках, разделенный запятыми список соответствующих значений
данных для добавленных полей. Оператор INSERT не возвращает
никакого множества записей.
Обычно все поля именуются и для них задаются значения, но это не
обязательно. Те поля, имена и соответствующие значения которых
указаны, вводятся в добавляемую запись, неопределенные поля
добавляются, но не имеют присвоенных значений. Если имена полей
не задаются, все значения присваиваются, начиная с первого поля.
Наиболее распространенный и простой способ определить новую
запись состоит в указании имен всех полей и задании для каждого из
них значения:
INSERT INTO MyTable
(Field! Field2, Field3, Field4, Field5)
VALUES('a text field value', 'a memo field value', 100, 3000, #01/01/04#)
В этом примере в таблицу M y T a b l e добавляется новая запись,
содержащая пять полей. Имена полей задаются вместе со значениями
присваиваемых данных, соответственно, для каждого поля. Значения
для полей, которые определены как текстовые поля в таблице, должны
быть помещены в одиночные кавычки (апострофы); значения для
числовых полей не заключаются в одиночные кавычки; значения для
полей даты/времени заключаются в символы #. Однако, вполне
допустимо вставлять новую запись только с некоторыми полями,
имеющими значения, если эти значения соответствуют именам полей и
типам данных:
INSERT INTO MyTable
(Field! Field5)
VALUES('a text field value', #01/01/04#)
Если вставляемое текстовое поле содержит апострофы, они должны
быть заменены двойными апострофами. Смотрите обсуждение
использования апострофов в значениях данных при рассмотрении
оператора SELECT.
Вставка переменных в операторы INSERT
К.С. Флойд
Введение в программирование на PHP5
Как и в случае оператора SELECT, обычно операторы SQL INSERT
создаются сценарием, который вставляет переменные данные в
операторы.
SQLString = "INSERT INTO Products (ItemNo, ItemName, ItemPrice, ItemQt
VALUES ('$ItemNo', '$ItemName', $ItemPrice,$ItemQuantity#$PurchaseDate#
Эта конструкция создает оператор INSERT следующего вида:
SQLString = "INSERT INTO Products (ItemNo, ItemName, ItemPrice, ItemQt
VALUES ('AAA111', 'Software', 100.00, 15, #07/15/04#)"
Оператор DELETE
Оператор DELETE используется для удаления записей из таблицы базы
данных. Обычный формат оператора для удаления одной записи
показан ниже:
DELETE FROM TableName
WHERE criteria
За ключевыми словами DELETE FROM следует имя таблицы, из
которой будет удалена запись. Предложение WHERE задает
идентификацию записи. Оператор DELETE не возвращает никакого
множества записей.
Предложение WHERE
За ключевым словом WHERE следует одно или несколько критериев
выбора. Обычно запись для удаления определяют через равенство
значению ее уникального "ключевого" поля.
DELETE FROM Products WHERE ItemNo = '99999'
Однако можно применять для идентификации записи любой из
существующих условных операторов:
= (равно)
К.С. Флойд
Введение в программирование на PHP5
<> (не равно)
< (меньше)
> (больше)
<= (меньше или равно)
=> (равно или больше)
Кроме того, можно объединять условия, используя логические
операторы AND, OR и NOT для расширения или сужения области
выбора:
DELETE FROM Products WHERE ItemQuantity = 0 AND NOT ItemType = '
В этом случае можно удалить больше одной записи. Если предложение
WHERE отсутствует, удаляются все записи в таблице.
При сравнении с текстовым полем значение критерия должно быть
заключено в одиночные кавычки; при тестировании числового поля
значение данных в кавычки не заключается; при тестировании поля
даты/времени значение критерия окружается символами #.
Если сравниваемое текстовое поле содержит апострофы, они должны
быть заменены двойными апострофами. Смотрите обсуждение
использования апострофов в значениях данных при рассмотрении
оператора SELECT.
Как и в случае операторов SELECT и INSERT оператор DELETE
обычно создается сценарием с помощью объединения литеральных
строк и переменных.
SQLString = "DELETE FROM Products WHERE PurchaseDate < #$TheDate#
Этот код разрешается в оператор DELETE следующего вида:
SQLString = "DELETE FROM Products WHERE PurchaseDate < #07/15/02#
Оператор UPDATE
Оператор UPDATE используется для изменения записей в таблице базы
К.С. Флойд
Введение в программирование на PHP5
данных. Общий формат оператора для обновления одной записи
показан ниже.
UPDATE TableName
SET (FieldName1=value1 [,FieldName2=value2]...)
WHERE criteria
За ключевым словом UPDATE следует имя таблицы, которая будет
обновлена. За ключевым словом SET в скобках следует разделенный
запятыми список имен полей и связанных с ними значений данных,
которые изменяют текущие значения, указанной записи в таблице.
Предложение WHERE задает критерий для поиска определенной записи
для обновления. Не требуется изменять значения всех полей в записи;
определяют только те поля и значения, которые будут изменены.
UPDATE MyTable
SET Field2 = 'new text value', Field3 = 200, Field5 = #02/02/04#
WHERE Field1 = 'KEY001'
В этом примере три поля изменяются в записи, которая определяется
значением ' K E Y 0 0 1 ' в F i e l d l в таблице M y T a b l e . Значения для
полей, которые определяются как текстовые поля в таблице, должны
заключаться в одиночные кавычки (апострофы); значения для числовых
полей не заключаются в одиночные кавычки; значения для полей даты/
времени заключаются в символы #.
Предложение WHERE
За ключевым словом WHERE следует один или несколько критериев
выбора. Обычно запись для изменения выбирают, сравнивая со
значением ее уникального "ключевого" поля.
Можно, однако, использовать для идентификации записи любые
принятые условные операторы:
= (равно)
<> (не равно)
< (меньше)
К.С. Флойд
Введение в программирование на PHP5
> (больше)
<= (меньше или равно)
=> (равно или больше)
Кроме того, можно объединять различные проверки с помощью
логических операторов AND, OR и NOT для расширения или сужения
области выбора:
UPDATE Products
SET ItemQuantity = 0
WHERE ItemQuantity < 10 AND NOT ItemType = 'Software'
В этом случае может обновляться более одной записи. Если
предложение WHERE не включено в оператор, то все записи в таблице,
имеющие указанные поля, будут изменены.
Если текстовое поле содержит апострофы, то они должны быть
изменены
на
двойные
апострофы.
Смотрите
обсуждение
использования апострофов в значениях данных при рассмотрении
оператора SELECT.
Как и в случае операторов SELECT, INSERT и DELETE, оператор
UPDATE создается обычно в сценарии с помощью объединения
литеральных строк и переменных.
SQLString = "UPDATE Products SET ItemQty = 0 WHERE ItemQuantity < $T
Этот код разрешается в оператор UPDATE следующего вида:
SQLString = "UPDATE Products SET ItemQty = 0 WHERE ItemQuantity < 10
Встроенные функции
Математические функции
ceil(fraction)
большего целого числа.
округляет
дробное
число
до
ближайшего
К.С. Флойд
Введение в программирование на PHP5
floor(fraction) меньшего целого числа.
округляет дробное число до ближайшего
num ber_format("number",
"decim als",
”decimal
p o i n t ",
" t h o u s a n d s _ s e p " ) - возвращает форматированную
версию указанного числа ( " n u m b e r " ) .
pow(number,
e x p o n e n t ) - возвращает результат возведения
заданного числа number в степень exponent.
rand(m in,
диапазона.
max)
-
порождает случайное число из заданного
r o u n d ( f r a c t i o n ) - округляет дробное число до ближайшего целого
числа.
s q r t (number)
number.
- возвращает квадратный корень заданного числа
Строковые функции
s t r l e n ( s t r i n g ) - определяет длину строки.
l t r i m ( s t r i n g ) - удаляет пробелы в начале строки.
r t r i m ( s t r i n g ) - удаляет пробелы в конце строки.
strpbrk (string,
c h a r ) - ищет в строке s t r i n g символ
( c h a r ) . Возвращает f a l s e или строку, начинающуюся с найденного
символа.
s t r t o u p p e r ( s t r i n g ) - преобразует строку в верхний регистр.
s t r t o l o w e r ( s t r i n g ) - преобразует строку в нижний регистр.
s t r r e v ( s t r i n g ) - записывает строку в обратном порядке.
eregi(string
pattern,
string
s u b j e c t ) - выполняет
независимый от регистра поиск выражения. Выполняет поиск в
К.С. Флойд
Введение в программирование на PHP5
s u b j e c t на основе регулярного выражения, заданного в p a t t e r n .
Функции ошибок
e x i t ( " m e s s a g e " ) - выводит сообщение об ошибке и прекращает
выполнение текущего сценария.
d i e ( " m e s s a g e " ) - выводит сообщение об ошибке и прекращает
выполнение текущего сценария.
Функция Email
m ail("recipient","subject",
"message",
"mail
h e a d e r s " ) - посылает сообщение e-mail указанному получателю.
Функции HTTP/сеанса
h e a d e r () — выводит строку заголовка HTTP, такую, как место
переадресации.
setcookie("nam e",
"value",
"expire",
"path",
" d o m a i n " , " s e c u r e " ) - посылает пользователю cookie.
session_start("nam e",
"value",
"expire",
"path",
" d o m a i n " , " s e c u r e " ) - посылает пользователю cookie.
s e s s i o n _ s t a r t () - инициализирует данные сеанса. Эта функция
вызывается перед созданием новой переменной сеанса с помощью
$_SESSION.
s e s s i o n _ d e s t r o y () - разрушает все данные, зарегистрированные
за текущим сеансом сценария.
Функции работы с файлами
К.С. Флойд
Введение в программирование на PHP5
f o p e n ( f i l e n a m e , mo d e ) — используется для открытия файла.
Функция требуется имя файла f i l e n a m e и режим m o d e . Она
возвращает указатель на файл, который предоставляет информацию о
файле и используется в качестве ссылки.
f r e a d ( r e s o u r c e _ h a n d l e , l e n g t h ) - используется для чтения
содержимого файла. Читает l e n g t h байтов из файла, задаваемого
r e s o u r c e _ h a n d l e . Чтение прекращается, когда будет прочитано
l e n g t h байтов или будет достигнут EOF ( e n d o f f i l e ) . Функция
требует два параметра - указатель файла, который создается при
открытии файла с помощью f o p e n ( ) , и длины l e n g t h ,
определяющей объем считываемого содержимого файла.
fgetcsv(resource_handle,
length,
delim iter)
используется для чтения содержимого файла и анализа данных для
создания массива. Данные разделяются параметром d e l i m i t e r ,
задаваемым в функции.
f i l e s i z e ( f i l e n a m e ) - возвращает размер файла. Если возникает
ошибка, то функция возвращает значение f a l s e .
f c l o s e ( r e s o u r c e _ h a n d l e ) - используется для закрытия файла.
Функции требуется указатель файла, созданный при открытии файла с
помощью функции f o p e n () . Возвращает TRUE при успехе или FALSE
при отказе.
f w r i t e ( r e s o u r c e _ h a n d l e , s t r i n g ) - записывает содержимое
строки s t r i n g в указанный поток файла. Если задан аргумент длины
l e n g t h , запись будет остановлена после записи l e n g t h байтов или
при достижении конца строки.
copy(original_filenam e,
new_filename)
копирует
содержимое файла, заданного первым параметром, в новый файл,
определенный вторым параметром. Функция возвращает значение
t r u e или f a l s e .
u n l i n k ( f i l e n a m e ) - удаляет файл, определенный параметром.
Функция возвращает значение t r u e или f a l s e .
К.С. Флойд
Введение в программирование на PHP5
renam e($orig_filenam e,
$new_filename)
переименовывает файл, определенный первым параметром, задавая для
него имя, определенное вторым параметром. Функция возвращает
значение t r u e или f a l s e .
Функции ODBC
odbc_connect(dsn/dsn-less
connection
s t r i n g , u s e r n a m e , p a s s w o r d ) - эта функция используется для
соединения с источником данных ODBC. Функция получает четыре
параметра: имя источника данных или строку соединения без d s n , имя
пользователя, пароль и необязательный параметр, задающий тип
курсора. В тех случаях, где имя пользователя, пароль и тип курсора не
требуются, параметры можно заменять пустой строкой - ''. i d
соединения, возвращаемый этой функцией, необходим другим функциям
ODBC. Можно иметь одновременно открытыми несколько соединений,
если они используют различные базы данных или различные имена
пользователей и пароли.
o d b c _ e x e c ( c o n n e c t i o n _ i d , S Q L _ q u e r y _ s t r i n g ) - функция,
используемая для выполнения оператора SQL. Функция получает два
параметра: объект соединения, созданный с помощью функции
o d b c _ c o n n e c t () и оператор SQL. Возвращает FALSE при ошибке.
Возвращает множество записей, если команда SQL была выполнена
успешно.
odbc_fetch_array(recordset_nam e)
- используется для
извлечения записей или строк из множества записей, как из
ассоциативного массива. Эта функция возвращает TRUE, если может
вернуть строки, иначе FALSE.
o d b c _ n u m _ r o w s ( r e c o r d s e t _ n a m e ) - возвращает число строк в
множестве результатов ODBC. Функция возвращает -1, если возникает
ошибка. Для операторов INSERT, UPDATE и DELETE функция
o d b c _ n u m _ r o w s () возвращает число затронутых строк. Для
предложения SELECT это может быть число доступных строк.
Примечание: использование функции o d b c _ n u m _ r o w s ()
для
К.С. Флойд
Введение в программирование на PHP5
определения числа доступных строк после выполнения оператора
SELECT будет возвращает -1 для драйверов MS Access.
odbc_close(connection_id)
закрывает соединение
с
сервером базы данных, связанным с данным идентификатором
соединения.
Функции MySQL
mysql_connect(MySQL
server
n a m e , u s e r n a m e , p a s s w o r d ) - открывает соединение с сервером
MySQL.
m ysql_select_db(database_nam e,connection_identifie
- выбирает базу данных, расположенную на сервере MySQL. Параметр
d a t a b a s e _ n a m e указывает на активную базу данных на сервере
MySQL, которая была открыта с помощью функции m y s q l _ c o n n e c t .
Параметр c o n n e c t i o n _ i d e n t i f i e r является ссылкой на текущее
соединение с MySQL.
m y s q l_ q u e ry (s q l
момент базе данных.
q u e r y ) - посылает запрос активной в данный
m y s q l _ f e t c h _ a r r a y ( r e s o u r s e r e s u l t ) - возвращает массив,
который соответствует извлеченной строке, и перемещает внутренний
указатель данных вперед.
m y s q l _ a f f e c t e d _ r o w s ( r e s o u r s e r e s u l t ) -определяет число
строк, затронутых предыдущей операцией SQL.
m ysql_close(link_identifier)
MySQL.
-
закрывает соединение
с