Введение в программирование на PHP5

Язык PHP

Язык PHP

PHP означает Препроцессор гипертекста PHP. Это серверный язык программирования, созданный специально для динамических страниц Web. Язык был первоначально разработан в 1994 г. Расмусом Лердорфом и был с тех пор расширен, чтобы стать одним из наиболее популярных языков сценариев WWW. Согласно статистике Netcraft в 2005 г. PHP использовался более чем 23000000 доменов. Подобно другим типам серверных языков, таких, как ASP, ASP.NET и JSP, код PHP обрабатывается на сервере Web и создает код XHTML или другой вывод, который можно увидеть в браузере. В отличие от других серверных языков, PHP является продуктом с открытым исходным кодом — это означает, что каждый имеет доступ к исходному коду и может использовать, изменять и распространять его полностью бесплатно.
Текущая версия PHP, рассматриваемая в учебнике, имеет номер 5. Этот учебник, несомненно, не является полным изложением языка PHP. Он должен только продемонстрировать некоторые наиболее широко используемые свойства и приложения PHP.
Систему PHP5 можно применять практически с любым типом операционной системы и сервера Web. Однако, чтобы сценарии PHP были обработаны, должен быть установлен интерпретатор PHP. Это программное обеспечение доступно в двух формах – полный исходный код и исполняемые двоичные файлы. Большинство систем Linux поставляются с исходным кодом PHP. Для систем, отличных от Unix/Linux, двоичные файлы можно загрузить по адресу http://www.php.net/downloads.php.
Дополнительную информацию о PHP можно найти на сайте http://www.php.net.

Контекст разработки Web

Многие люди являются "авторами" страниц Web, немногие являются "разработчиками" сайтов Web. Возможно, вы также присоединитесь к сообществу разработчиков.

Модель доставки информации

При функционировании в качестве системы доставки информации деятельность по разработке 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 и составляющие ее сайты и страницы необходимо воспринимать как механизмы для выполнения полного набора действий по вводу, обработке, выводу и хранению, требуемых для создания динамического, активного контента, – короче, для обеспечения основных функций системы обработки информации.
Модель обработки информации
Рис. 1.2.  Функции системы обработки информации
В модели информационной обработки четыре базовые функции ввода, обработки, вывода и хранения имеют специфическое значение.
  • Функция ввода позволяет пользователям взаимодействовать с системой, запрашивая параметры обработки, управляя информационным доступом и определяя методы доставки. Кроме того, пользователь может стать источником данных, которые обрабатывает система и которые она поддерживает в своих репозиториях хранимой информации.
  • Функция обработки относится к деятельности по манипуляции данными и логике обработки, необходимых для выполнения работы системы. Этот термин предполагает, что система может "программироваться" для выполнения арифметических и логических операций, необходимых для манипуляции данными ввода и для создания выводимой информации.
  • Функция вывода доставляет результаты обработки пользователю в правильном, своевременном и соответствующим образом форматированном виде.
  • Функция хранения гарантирует продолжительность существования и целостность обрабатываемой информации, поддерживая ее в течение длительного периода времени и позволяя добавлять, изменять или удалять систематическим образом. В конечном счете, хранимая информация становится основным контентом страниц Web, отражая самую современную и точную информацию, появляющуюся на этих страницах.

  • С точки зрения обработки информации сама сеть Web функционирует как гигантская открытая компьютерная система, и фактически такой и является. Деятельность по обработке информации происходит на различных аппаратных и программных компонентах, расположенных в одном месте или разбросанных по всему миру.
    При принятии модели обработки информации можно начинать применять технологию Web для создания сайтов Web, которые являются действительно динамичными, интерактивными и современными – сайты Web, на которых информационный контент всегда самый современный, персонализирован в соответствии с потребностями пользователя, автоматически изменяется в ответ на запросы пользователя, и когда изменяется сама информация, пользователь может взаимодействовать со страницей Web, добавляя или изменяя информацию в системе. Дополнительное преимущество состоит в том, что сайты можно создавать таким образом, что не потребуется постоянно переписывать или переформатировать страницы Web. Сами страницы изменяются динамически, отражая изменение информации или изменение предпочтений пользователей.

    Модели систем Web

    Исторически Всемирная паутина WWW функционировала просто как "система доставки информации". Люди привыкли использовать ее для сбора информации по всевозможным вопросам, для которых миллионы сайтов Web предоставили доступ. Однако со временем Web стала чем-то большим, чем просто электронной библиотекой информации. Она стала платформой коммуникации, информации и транзакций, на которой реализуется экономическая, социальная, политическая, образовательная и культурная деятельность.

    На основе Web

    Термин "на основе Web" относится к тому факту, что системы обработки информации полагаются на технологию Интернет, в частности, на так называемую Всемирную паутину (WWW). Поэтому системы на основе Web действуют в технологических рамках со следующими характеристиками.
    Первое: системы действуют в публичных, а не в частных сетях данных. Они осуществляют коммуникацию через Интернет, т.е. через распространенные по всему миру, взаимосвязанные сети компьютеров, которые являются публично доступными.
    Второе: коммуникационные сети основываются на открытых и публичных технических стандартах, таких, как архитектуры Ethernet, протоколы передачи TCP/IP и протоколы приложений HTTP и FTP. Они не являются частными или патентованными стандартами, но являются принципиально открытыми и свободными для публичного использования.
    Третье: системы обработки на основе Web используют широко распространенное, часто бесплатное, программное обеспечение для разработки и работы. Деятельность по обработке происходит с помощью браузеров Web, а не специально написанного программного обеспечения для интерфейса пользователя и для внешнего сбора данных и обработки. Браузеры Microsoft Internet Explorer, Mozilla Firefox, Opera, Netscape Navigator и другие являются средством взаимодействия пользователей с системами обработки информации. Также широко распространенные компьютеры серверов Web выполняют основные функции бизнес-обработки, а серверы баз данных обеспечивают хранение информации, доступ к ней и извлечение.
    Поэтому общедоступные, не являющиеся специализированными, не являющиеся патентованными оборудование и системы программного обеспечения предоставляют техническую среду для разработки систем обработки информации и для управления этой деятельностью.

    Навыки разработки Web

    Разработка Web относится к использованию технологий Web для создания клиентских и серверных компонентов обработки, к интеграции их в качестве приложений в системах обработки интранет, интернет или экстранет, и к развертыванию их в Web для реализации частной и публичной деятельности организаций. Набор навыков для реализации этих задач простирается далеко за пределы способности сохранить страницы Web из программы текстового процессора, за пределы создания простого сайта Web с помощью буксировки в программном пакете настольного компьютера или даже за пределы жестко закодированных с помощью XHTML страниц c вкраплениями подключаемых модулей.
    При окончательном анализе разработчику Web необходимо проникновение в сущность операционных и управленческих процессов организации, понимание того, каким образом производственные процессы создаются и опираются на информационные потоки при производстве товаров и услуг, и способность абстрагироваться и моделировать эти бизнес системы на доступном оборудовании и программных технологиях, а также навыки использования этих технологий для создания систем на основе Web, которые реализуют эти модели.
    Один учебник не может вместить все это. Он может, однако, предоставить основные знания и навыки для решения существующих проблем и использования возможностей, сопровождающих системы обработки на основе Web. Он охватывает основные технические средства для интеграции клиентского и серверного оборудования и программного обеспечения для создания систем по сбору, обработке, управлению и распространению информационного содержания, которое оживляет современные организации. Попутно вы получите надежное понимание той критической роли, которую системы на основе Web могут играть в создании операционного и управленческого успеха различных организаций.

    Присваивание функций компонентам

    Возвращаясь к понятию трехслойной, клиент/серверной системы, посмотрим, как аппаратные компоненты, программные компоненты, и функции обработки связаны друг с другом с точки зрения обработки информации. Вспомните, что аппаратные компоненты в трехслойной среде состоят из компьютера клиента Web (настольного ПК), компьютера сервера Web, и сервера базы данных. Каждый из этих трех аппаратных компонентов выполняет соответствующее программное обеспечение. Теперь можно отобразить функции обработки информации на эти три слоя оборудования/программ.
    Присваивание функций компонентам
    Рис. 1.3.  Функции системы обработки информации, отображенные в трехслойную систему клиент/сервер
    Все функции ввода и вывода попадают в основном в клиентскую машину Web. Такая деятельность интерфейса пользователя, как ввод данных, проверка данных, управление обработкой и форматирование вывода, выполняются на клиенте Web.
    Основная деятельность по обработке информации падает на сервер Web, называемый иногда сервером приложений Web. Здесь программируются арифметические и логические процедуры для выполнения задач системы по бизнес обработке.
    Наконец, хранение данных и функции доступа выполняются на сервере базы данных. Этот компонент управляет хранением информации и функциями извлечения, необходимыми для выполнения бизнес-обработки, и позволяет осуществлять долгосрочное обслуживание хранимой информации посредством добавления, изменения и удаления файлов и баз данных.
    Как можно видеть на иллюстрации, системные функции "передаются" различным отдельным компонентам, хотя все они действуют совместно, как интегрированные системы различных видов деятельности. Основная идея заключается в том, что специализированные компоненты выполняют специализированную работу, для которой они лучше всего подходят. Справедливо также то, что системные функции "не привязаны к месту". То есть деятельность ввода, обработки, вывода и хранения могут происходить там, где расположены компоненты. Они могут быть заключены в одной машине на одном рабочем столе, распределены между двумя или несколькими машинами в отделе или компании либо широко разбросаны по всему земному шару. Во всех этих случаях используемые технологии и методы являются практически одинаковыми, делая достаточно рутинной разработку приложений Web для любой физической или географической среды, с которой столкнется разработчик.

    Программное обеспечение учебника

    В этом учебнике представлено основное подмножество инструментов, необходимых для создания динамических, интерактивных сайтов Web. На стороне браузера применяются и описываются XHTML, CSS, JavaScript для редактирования данных, и динамический HTML. В качестве языка сценариев сервера используется PHP. Также описываются встроенные функции PHP, необходимые для выполнения функций ввода, обработки, вывода и хранения. На стороне базы данных представлены примеры для Microsoft Access, и описаны основные принципы использования языка SQL.
    Даже при отсутствии достаточного доступа к этим технологиям, необходимо уметь следовать инструкциям и начать создавать свои собственные динамические приложения Web. Необходимо, конечно, разбираться в программировании: разработчик Web, прежде всего, является программистом. Предполагается, что читатель хорошо знаком с Visual Basic. Необходимо также иметь навыки работы с XHTML и быть знакомым с каскадными таблицами стилей.

    Разработка приложений Web

    Рассмотрение Web как трехслойной, клиент/серверной системы обработки информации имеет важные последствия для разработки приложений Web. Вчерашний "создатель страницы Web" становится сегодня "разработчиком системы Web". Теперь недостаточно иметь пакет разработчика, состоящий из редактора WYSIWYG и базовых навыков XHTML. Необходимо стать широко образованным в более разнообразном множестве технологий. Внизу на следующей расширенной схеме трехслойной системы указаны некоторые навыки и инструменты, необходимые для проектирования и программирования систем на основе Web, которые обслуживают деятельность по обработке информации.
    Разработка приложений Web
    увеличить изображение
    Рис. 1.4.  Навыки разработки Web, требуемые для создания трехслойных клиент/серверных приложений на основе Web

    Разработка Web

    "Разработка" Web, в противоположность "созданию" страниц Web, выходит далеко за пределы использования кодов разметки и нескольких подключаемых модулей или метода сценариев для создания привлекательных или информативных страниц Web. Этот термин относится к использованию специальных стратегий, инструментов и методов для создания страниц Web и сайтов Web, характеризуемых как трехуровневые, клиент/серверные системы обработки информации. Давайте рассмотрим эти термины более подробно, чтобы понять разнообразие задач, для которых разрабатываются страницы и сайты Web.

    Системная обработка

    На стороне сервера Web необходимо иметь возможность писать приложения для выполнения основных задач системы по обработке. Для кодирования этих процедур используются серверные языки, такие, как PHP. С одной стороны, эти языки применяются как полноценные языки программирования для кодирования арифметических и логических операций обработки, с другой — они используют встроенные компоненты серверной обработки для выполнения основных и вспомогательных задач системы. PHP является широко распространенным языком сценариев общего назначения, который особенно хорошо подходит для разработки Web и может встраиваться в XHTML.

    Системный ввод и вывод

    Так как функция интерфейса пользователя осуществляется через браузер Web, выполняющийся на клиентском ПК, необходимо использовать инструменты разработки приложений, которые позволяют программировать браузер для выполнения задач форматирования вывода, ввода данных и проверки данных. Для этого требуются, конечно, языки разметки, такие, как XHTML и CSS (Каскадные таблицы стилей), для структуризации и представления системного ввода и вывода. Растет важность расширений языков разметки, например, DHTML (Dynamic HTML) для взаимодействия пользователей со страницей Web и XML (Расширяемый язык разметки) для представления структур данных, которые доставляются сервером для обработки в браузере. Также основным языком программирования для браузера является JavaScript, который используется для манипуляции языками разметки и структурами данных для выполнения задач браузера по обработке.

    Системы интернет

    Системы интернет являются публичными информационными системами. Они включают в себя публичные сайты, которые предоставляют новости, информацию, и развлечения; сайты электронной коммерции для маркетинга и продажи продуктов и услуг; правительственные сайты для информирования или обслуживания широкой публики; и образовательные сайты для предоставления локального и удаленного доступа к образованию и знаниям. Всем частям общества публичные системы интернет предоставляют товары, услуги и информацию посредством Всемирной паутины WWW и связанных с ней сетей и услуг.

    Системы интранет

    Системы интранет являются частными, внутренними системами, помогающими выполнять повседневную обработку информации, управленческо-информационную и производственную деятельность организаций. Системы интранет на основе Web обслуживают стандартные внутренние функции бизнеса, оказывая тем самым влияние на основные организационные системы, такие, как бухгалтерский учет и финансовая отчетность, маркетинг и отдел продаж, системы закупок и сбыта, производственные системы, системы трудовых ресурсов и другие. Со временем системы интранет на основе Web станут основными техническими средствами, посредством которых будет осуществляться внутренняя деятельность организаций по выполнению бизнес-процессов.

    Системы экстранет

    Системы экстранет являются системами бизнес-для-бизнеса (B2B), которые управляют электронным обменом данными (EDI) между деловыми предприятиями. Эти системы обеспечивают информационный поток между организациями – между компанией и ее поставщиками и между компанией и ее сбытовыми организациями – чтобы помочь в координации последовательности закупки, производства и распространения. Электронный обмен данными помогает исключить бумажный поток, сопровождающий бизнес-транзакции, используя технологии Web для пересылки электронных документов между компьютерами, а не между людьми.
    Как системы на основе Web приложения EDI устраняют трудности передачи информации между различными программными и аппаратными платформами с изначально различными информационными форматами и различными протоколами обмена информацией.
    Web становится основным технологическим базисом, электронной магистралью для сбора информации, обработки и распространения во всех типах организаций – в коммерческих и финансовых предприятиях, образовательных учреждениях, правительственных агентствах, учреждениях здравоохранения, агентствах новостей и отрасли развлечений и в большинстве других формальных организаций, как больших, так и маленьких. Это всепроникающая технология для разработки систем работы с информацией во всех частях общества.

    Системы обработки информации

    Технологии Web используются не только для создания персональных или рекламных сайтов Web, содержащих информативный, интересный или развлекательный материал для публичного потребления. Скорее они становятся важным средством поддержки фундаментальных "бизнес-процессов" современных организаций — поддерживающие операционные и управленческие функции. Технические инфраструктуры поддержки этих задач упрощенно делятся на три типа систем на основе Web, называемых системами интранет, интернет и экстранет.

    Создание страницы Web

    Сегодня создание страницы Web является не слишком трудной задачей. Многие стандартные программные пакеты персональных компьютеров обладают встроенными средствами для преобразования документов текстовых процессоров, электронных таблиц, баз данных и т.д. в специально кодированные документы, которые могут быть доступны в Web. Специальные пакеты для создания страниц Web, такие, как Microsoft FrontPage и Macromedia Dreamweaver, позволяют легко создавать страницы Web с помощью технологии буксировки. В большинстве таких случаев даже не нужно знать о существовании специального языка кодирования HTML (язык разметки гипертекста), который неявно все это обеспечивает.
    Если вы знаете язык XHTML, то страницы Web можно создавать с помощью простого текстового редактора, получая в этом случае значительно больше контроля над их структурой и форматированием, чем это возможно с помощью методов буксировки. Кроме того, появляется возможность легко интегрировать существующий код XHTML, апплеты Java, встраиваемые модули мультимедиа и языки сценариев браузера, чтобы создать на странице некоторое взаимодействие с пользователем. Независимо от содержания или привлекательности страниц, их назначение обычно ограничено представлением интересного или информативного текста и графики для персонального потребления. Маловероятно, что кто-то будет заниматься задачей создания основной бизнес-системы с помощью HTML и нескольких подключаемых модулей.

    Трехслойная, клиент/серверная архитектура

    Термин "клиент/сервер" относится к применению сетей на основе серверов для управления общим доступом к ресурсам и для распределения задач между аппаратными и программными компонентами. В клиент/серверных сетях на основе Web распределение задач обработки происходит в трех слоях, которые соответствуют трем основным компонентам оборудования/программного обеспечения системы.
    Трехслойная, клиент/серверная архитектура
    Рис. 1.1.  Аппаратные и программные слои трехслойной системы обработки информации
    В первом слое (Tier 1) клиентский настольный ПК выполняет работу интерфейса пользователя системы; во втором слое (Tier 2) сервер Web выполняет основные функции системы по обработке; и в третьем слое (Tier 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. При просмотре корзины покупателя другие процедуры извлекают выбранные товары и вычисляют общую стоимость заказа. При оплате заказа исполняются специальные программы для соединения с системой проверки кредитной карты и банковскими системами, так что соответствующие счета дебетуются и кредитуются. Множество задач обработки, связанных с перемещением в сети и покупкой, происходят на серверах Web скрыто от пользователя, но они критически важны для осуществления покупки и для осуществления бизнес-транзакций, которые с этим связаны.
    Большая часть информации, которая собирается и генерируется во время покупки, хранится в базах данных, которые находятся на отдельных серверах баз данных. Вся информация, которая выводится на экран, извлекается из таблиц базы данных. Выбранные товары хранятся в таблицах базы данных. Практически каждый фрагмент информации о просматриваемых продуктах и транзакциях при покупке сохраняется в больших базах данных в самой системе е-коммерции или в связанных базах данных, которые находятся в центре окружающих ее систем бухгалтерского учета, закупок и дистрибуции.
    Даже в самых маленьких коммерческих системах на основе Web присутствуют такие же функции. Браузер Web предоставляет интерфейс пользователя с системой, специальные страницы обрабатывают бизнес транзакции, а одна или несколько баз данных поддерживают информацию, перемещающуюся в системе. Главное состоит в том, что в системах на основе Web любого размера существуют три основных слоя функциональности. Поэтому, с точки зрения разработчика Web, задача состоит в создании трех отдельных компонентов – интерфейса пользователя, процедур обработки бизнес-операций, и компонентов поддержки базы данных — и последующей интеграции в полностью функциональную систему обработки информации.

    Управление базой данных

    На стороне сервера базы данных такие языки, как SQL (Язык структурированных запросов), выполняют функции сохранения данных, их обслуживания и доступа. Кроме того, языки программирования базы данных используются для кодирования командных процедур, которые являются функциями обработки, хранимыми в базах данных, для извлечения, обновления и создания отчетов о содержимом баз данных. Серверные языки могут вызывать эти встроенные процедуры баз данных для выполнения соответствующей обработки, а не кодировать их непосредственно. Все большую важность в хранении данных и электронном обмене данными приобретают структуры данных XML.
    Иногда на разработку Web смотрят упрощенно с чисто технической точки зрения, забывая, что это является также разработкой системы. Разработчик должен понимать организационные структуры и процессы. Прежде всего, система на основе Web является бизнес-процессом. Если не понимать суть процессов, то маловероятно, что можно будет разработать системы для их реализации или поддержки. Разработка Web является также реализацией некоторой интеграции. Задача состоит в том, чтобы объединить совокупность оборудования, программного обеспечения, людей и процедур для выполнения некоторой деятельности. Поэтому системный подход является критически важным для соединения всех частей вместе во что-то функциональное, продуктивное, экономичное и дружественное. Наконец, разработка Web является в большой степени творческим предприятием. Очень часто работа состоит в разработке чего-то нового там, где ничего перед этим не существовало. Вместо следования директивам хорошо продуманных планов, ваше воображение создает эти планы, а художник внутри вас их воплощает. Управляемый полет фантазии хорошо служит разработке Web.
    Разработчику Web требуется поэтому творческое воображение, организаторское чутье и обширный набор навыков для создания приложений Web, которые обслуживают потребности информационной обработки. Разработчик не обязан быть экспертом высокого уровня во всех языках и программных инструментах; но необходимо иметь хорошее представление об их использовании.

    Комментарии в коде

    Комментарии применяются в PHP для записи собственных замечаний во время процесса разработки кода. Такие комментарии могут определять назначение сегмента кода или их можно использовать для исключения блоков кода во время тестирования и отладки сценариев.
    Синтаксический анализатор PHP игнорирует комментарии. Комментарии в PHP можно определить одним из следующих способов:
    // — простой комментарий PHP;
    # — альтернативный простой комментарий PHP;
    /*...*/ — многострочные блоки комментариев.

    Страница Web

    // Простой комментарий PHP # Другой тип простого комментария PHP
    /* Многострочный блок комментария PHP Он может занимать любое необходимое количество строк */
    ?>



    Соединение XHTML и PHP

    Код PHP обычно объединяется с тегами XHTML. PHP является встраиваемым языком — это означает, что можно перемещаться между чистым кодом HTML и PHP, не жертвуя возможностью чтения текста.
    Чтобы встроить код PHP в XHTML, PHP должен задаваться обособленно, с помощью начального и конечного тегов PHP. Теги PHP говорят серверу Web, где начинается и заканчивается код PHP. Анализатор PHP распознает три варианта начального и конечного тегов.
  • Стиль XML

    Первый вариант тегов PHP называется тегами в стиле XML и является предпочтительным стилем. Он работает в документах Расширяемого языка разметки (XML). Этот метод должен использоваться при соединении PHP с документами XML и XHTML. Примеры в этом учебнике применяют этот формат тегов XML.
  • Сокращенный стиль

    Сокращенный стиль является самым простым, однако, он не рекомендуется, так как вступает в противоречие с объявлениями документов XML.
  • Стиль сценария (script)

    Этот стиль использует самую длинную запись и похож на стиль тегов, применяемых с JavaScript. Этот стиль является предпочтительным при использовании редактора HTML, который не распознает другие стили тегов. Так как большинство новых редакторов XHTML распознают стиль тегов XML, то использование этого стиля не рекомендуется.

  • Блоки сценария могут размещаться в любом месте документа XHTML, в том месте, где сценарий создает и показывает свой вывод. Следующий пример страницы XHTML иллюстрирует использование трех форматов тегов сценария.

    Страница Web














    В предыдущем примере три блока PHP включены в документ XHTML. Первый блок использует открывающий и закрывающий теги . Сегмент кода использует оператор PHP echo для вывода строки "Это основной документ PHP" в окне браузера.

    Второй блок применяет теги для пометки начала и конца кода PHP. Этот раздел применяет оператор PHP print (другое имя оператора echo) для вывода на экране текста "PHP – это здорово!".

    Наконец, третий блок использует блок сценария для определения начала и конца кода PHP. В коде строка "Hello World" присваивается переменной $myvar, а оператор echo выводит значение $myvar в окне браузера.

    Это базовая страница PHP.

    PHP – это здорово!

    Hello World

    Пример показанного выше кода включает теги XHTML, теги PHP, операторы PHP и разделители. Когда пользователь запрашивает страницу PHP, сервер обрабатывает весь код PHP. Когда страница PHP просматривается в окне браузера, выводится только текст между открывающим и закрывающим тегами XHTML или PHP. Никакой реальный код PHP не виден при просмотре исходного кода в окне браузера. Причина в том, что интерпретатор PHP выполняет сценарий на сервере и заменяет код результатом вывода работы сценария. Только этот вывод передается браузеру. Это одна из характеристик, которая делает PHP серверным языком сценариев, в отличие от JavaScript, языка сценариев клиента.

    Терминатор инструкции

    Каждая строка кода PHP должна завершаться терминатором инструкции (признаком конца), в качестве которого используется точка с запятой (;). Терминатор инструкции применяется для отделения одного множества инструкций от другого.
    Отсутствие терминатора инструкции может приводить к ошибкам в работе интерпретатора PHP и выводу ошибок в окне браузера. Следующий фрагмент кода показывает распространенную ошибку отсутствия терминатора инструкции.

    Страница Web

    echo "Это строка порождает ошибку" echo "В предыдущей строке отсутствует терминатор инструкции";
    ?>


    В этом примере в первом операторе echo пропущен терминатор инструкции. Так как интерпретатор PHP не может определить конец первого оператора echo и начало второго, то происходит ошибка. В зависимости от настроек Обработки ошибок (Error Handling) интерпретатора, будет выводиться сообщение об ошибке или браузер выведет просто пустую страницу.
    Далее показано типичное сообщение об ошибке, которое выводится, когда пропущен терминатор инструкции:
    Parse error: syntax error, unexpected T_PRINT in C:\ApacheRoot\test.php on line 11 Ошибка при разборе: синтаксическая ошибка, непредвиденный T_PRINT в ... в строке 11
    Как можно видеть, сообщения об ошибках PHP достаточно загадочны по своей природе. Отсутствие терминатора инструкции является распространенной ошибкой среди новичков PHP. Со временем появится привычка проверять каждую строку на наличие терминатора инструкции.

    Вывод контента

    PHP содержит два основных оператора для вывода текста в браузере Web: echo и print.
    Оба оператора, echo и print, кодируются между открывающим и закрывающим тегами блока кода PHP и могут находиться в любом месте в документах XHTML.
    Операторы echo и print используют следующий формат:
    echo – используется для вывода одной или нескольких строк.
    echo "Выводимый текст"
    print – используется для вывода строки. В некоторых случаях оператор print предлагает большую функциональность, чем оператор echo. Это будет рассмотрено далее в учебнике. Пока print можно считать другим именем оператора echo.
    print " Выводимый текст"
    Следующие примеры демонстрируют использование и размещение команд echo и print в документе XHTML.

    Страница Web





    В большинстве случаев необходимо выводить целые параграфы в окне браузера или создавать переносы строк при выводе контента. По умолчанию операторы echo и print не создают автоматические переносы строк, необходимо использовать тег или
    для создания параграфов или переносов строк. Разделители, создаваемые в редакторе XHTML с помощью возврата каретки, пробелов и табуляции, игнорируются процессором PHP.
    В следующем примере тег параграфа XHTML включается в оператор PHP echo . В PHP теги XHTML можно применять в операторах print и echo для форматирования вывода. В этих случаях вывод необходимо заключать в двойные кавычки (""), чтобы гарантировать, что браузер не интерпретирует тег буквально и не выводит его как часть строки вывода.
    echo "Параграф 1
    " echo "Параграф 2
    "
    Без использования тега параграфа XHTML предыдущие операторы echo будут выводить контент в следующем виде:
    Параграф 1 Параграф 2
    При включении тегов параграфов операторы выводятся как два отдельных параграфа.
    Параграф 1
    Параграф 2

    Ассоциативные массивы

    Ассоциативные массивы позволяют использовать более полезные значения индекса. Для массивов с числовыми индексами значения индекса создаются автоматически, начиная с 0. Ассоциативные массивы допускают применение числовых и строковых значений индекса. Символ между индексом и значениями (=>) является знаком равенства, за которым сразу следует символ больше.
    $members = array('FName' => John, 'LName' => Smith, 'Age' => 50)
    В этом примере члены массива содержат три элемента, однако используются строковые индексы — FName, LName и Age.
    $members['FName'] = 'John' //индекс FName соответствует элементу John $members['LName'] = 'Smith' // индекс LName соответствует элементу Smith $members['Age'] = '50' // индекс Age соответствует элементу 50
    Для доступа к содержимому массива используется имя массива и индекс. Следующий код применяется для вывода значений переменной $members.

    Страница Web

    $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'];
    ?>


    The user's first name is John The user's last name is Smith The user's age is 50

    случайным образом перемешиваем элементы массива



    Страница Web




    //Созданы два массива

    $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,30,50)

    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);

    ?>


    Пример 3.1.
    Закрыть окно

    Форматирование вывода валюты

    Кроме вывода стандартного текста можно применять для вывода форматированного текста вариант конструкции print с именем sprintf. Оператор требует задания форматирующей строки и значения для форматирования.
    sprintf("%01.2f", $var) - formats and prints the value of '$var' as currency.
    Оператор sprintf показан ниже:

    A Web Page



    Вывод валюты показан ниже:
    $37.50

    Функции даты и времени

    Базовые функции PHP для даты и времени позволяют форматировать отметку времени для применения в запросах базы данных или просто для вывода даты и времени в окне браузера. PHP включает следующие функции даты и времени:
    date(format) – возвращает текущее время сервера, форматированное согласно заданному множеству параметров format.
    checkdate(month, day, year) – проверяет заданную дату. Успешная проверка означает, что год year находится между 0 и 32767, месяц month – между 1 и 12, и правильное количество дней каждого месяца.
    time() – возвращает текущее время сервера, измеренное в секундах начиная с 1 января 1970 г.
    Следующая таблица содержит допустимые форматы date():
    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)
    y год двумя цифрами (05)
    s порядковые английский суффиксы (th, nd, st)

    Следующая страница использует функцию PHP date() для определения и вывода текущего времени сервера и даты:
    Today is date('lFjY')"; echo "
    "; echo "The current time is: date('g:i:s a')"; ?>
    Формат даты/времени, выводимый с помощью функции date(), зависит от типов параметров формата, подставленных в функцию. Параметры функции date() можно объединять, разделяя запятой ",", двоеточием ":" или другими знаками пунктуации, в зависимости от желаемого формата вывода. Все параметры, однако, должны быть заключены в одиночные кавычки. В примере выше время выводится с помощью параметров формата времени g, i, s, и a. Двоеточия и пробелы также вставляют для разделения часов, минут, секунд и признаков am/pm.
    Функции checkdate() и time() обычно используются в процессах принятия решений. Поэтому они подробнее будут рассмотрены в дальнейшем.

    Функции для работы с массивами

    Кроме функции array() система PHP включает множество других функций для работы с массивами. Следующий раздел описывает некоторые из наиболее часто используемых функций. Более обширный список доступен на Web-сайте PHP.
    count() – функция count используется для подсчета числа элементов в массиве.
    sort() – функция sort используется для сортировки элементов существующего массива.
    shuffle() – функция shuffle используется для случайного перемешивания элементов в заданном массиве.
    sizeof() – функция sizeof является синонимом (алиасом) функции count().
    array_slice($array_name,offset, length) – функция array_slice используется для извлечения части существующего массива. $array_name является именем разрезаемого массива, offset указывает позицию, где будет начинаться разрез, length указывает число элементов, которое будет вырезано из массива.
    array_merge($array_name, $array_name) – функция array_merge используется для объединения или слияния двух или большего количества существующих массивов. Имена массивов разделяются запятыми.
    Следующий код показывает, как применяется каждая из функций для работы с массивами.
    Пример 3.1.
    (html, txt)
    PHP включает также ряд предопределенных или глобальных массивов. Их называют также суперглобальными переменными, так как они всегда присутствуют и доступны для всех блоков сценария PHP. Ниже показаны обычно используемые суперглобальные переменные PHP.
    $_GET[] $_POST[] $_REQUEST[] $_COOKIE[] $_FILES[] $_SERVER[] $_ENV[] $_SESSION[]
    Суперглобальные переменные PHP будут описаны в дальнейшем. Массивы имеют много применений в PHP и программировании в целом. Этот раздел представил некоторые базовые вопросы массивов PHP и описал некоторые базовые функции: это понадобится при рассмотрении более развитых свойств массивов в следующих разделах.

    Функции для работы со строками

    Система PHP содержит ряд функций для работы со строками. Следующий список содержит некоторые из наиболее распространенных строковых функций.
    strlen(string) – определяет длину строки string.
    ltrim(string) – удаляет символы разделители в начале строки string.
    rtrim(string) – удаляет символы разделители в конце строки string.
    strpbrk(string, char) – ищет в строке string символ char. Возвращает false или строку, начинающуюся с найденного символа.
    strtoupper(string) – преобразует строку в верхний регистр.
    strtolower(string) – преобразует строку в нижний регистр.
    strrev(string) – возвращает строку string в обратном порядке.
    eregi(pattern, subject) – выполняет независимое от регистра символов сравнение с выражением. В строке subject происходит поиск регулярного выражения, заданного строкой pattern.
    Следующий блок кода демонстрирует, как использовать строковые функции PHP.
    $string = "Hello World"; $another_string = "Welcome to PHP";
    echo strlen($string); echo strtoupper($another_string); echo strrev($another_string); echo strpbrk($string, "W");
    ?>
    11 WELCOME TO PHP PHP ot emocleW World
    Первая строка выводит длину строки "Hello World", равную 11. Затем строка "Welcome to PHP" преобразуется в верхний регистр и выводится в окне браузера. Эта строка используется также с функцией strrev для изменения порядка символов строки на обратный. Наконец, в строке происходит поиск символа "W". Так как первое появление символа происходит в тексте "World", выводится эта строка.

    Интерполяция

    PHP поддерживает также процесс, называемый интерполяцией – замену переменной в строке ее содержимым. Вместо соединения переменных и литералов, их можно объединять внутри двойных кавычек (""). Интерполяция является свойством только двойных кавычек. Переменные и литералы нельзя объединить внутри одиночных кавычек. При использовании двойных кавычек значение переменной выводится вместе с литералом. При использовани одиночных кавычек выводится "буквально" имя переменной вместе с остальной строкой. Следующий пример иллюстрирует свойство интерполяции PHP.

    A Web Page

    $fname = "John"; $lname = "Doe";
    echo "The user's name is $fname $lname";
    ?>


    Этот код создает такой же вывод, как и предыдущий пример. Здесь переменные объединяются с помощью литеральной строки, заключенной в двойные кавычки. Соединение (конкатенация) не требуется.

    Константы PHP

    Константы, как и переменные, являются временным хранилищем значений в памяти. В отличие от переменных значение константы никогда не изменяется. При объявлении константы используется функция define(), которая требует задать имя константы и значение этой константы.
    Константам можно присваивать следующие типы данных.
    Целые – целые числа или числа без десятичной точки (1, 999, 325812841).
    Числа с плавающей точкой — числа, содержащие десятичную точку (1.11, 2.5, .44).
    Строки – текстовая или числовая информация. Строковые данные всегда заключаются в кавычки ("Hello World", "478-477-5555").
    Имена констант PHP в отличие от переменных не начинаются со знака "$". Имена констант обычно записывают в верхнем регистре. Имена констант могут содержать буквы, цифры и символ подчеркивания (_); они не могут, однако, начинаться с цифры. Объявление констант показано ниже.
    define("STRING_CONSTANT", "This is my string.");
    define("NUMERIC_CONSTANT", 5);

    Массивы с числовыми индексами

    $my_array = array('red', 'green', 'blue')
    Этот код создает массив с числовым индексом с именем $my_array. Массиву присваивается три элемента — red, green, и blue. Каждый элемент идентифицируется числовым индексом.
    $my_array[0] = 'red' // индекс 0 соответствует элементу red $my_array[1] = 'green' // индекс 1 соответствует элементу green $my_array[2] = 'blue' // индекс 2 соответствует элементу blue
    Чтобы получить доступ к содержимому массива, используется имя массива и индекс. Следующий код применяется для вывода значений переменной $my_array.

    Страница Web

    $my_array = array('red', 'green', 'blue');
    echo "Первое значение массива — " . $my_array[0]; echo "Второе значение массива — " . $my_array[1]; echo "Третье значение массива — " . $my_array[2];
    ?>


    Первое значение массива — red Второе значение массива — green Третье значение массива — blue

    Операторы PHP

    Операторы применяются для выполнения операций или действий с переменными. Они могут включать присваивание значения переменной, выполнение сложения переменных, сравнение значений переменных и определение состояния условия.
    Арифметические операторы
    Операторы присваивания
    Операторы сравнения
    Логические операторы
    Арифметические операторы используются для выполнения основных математических операций. В следующей таблице представлены арифметические операторы, которые применяются в PHP.
    Оператор Описание
    + сложение
    - вычитание
    * умножение
    / деление
    % сравнение по модулю (возвращает остаток от деления)
    ++ увеличивает значение
    -- уменьшает значение

    Пример 3.3.
    (html, txt)
    The sum is 11 The difference is 9 The product is 27 The quotient is 3 4 3

    Переменные массивы

    В то время как скалярная переменная PHP хранит одно значение, переменную массива можно использовать для хранения множества или последовательности значений. Система PHP поддерживает массивы с числовыми индексами и ассоциативные массивы. Массив в PHP является фактически упорядоченным отображением. Отображение является типом, который отображает значения в ключи. Переменные массивов состоят из двух частей – индекса и элемента. Индекс массива, иногда называемый ключом массива, является значением, применяемым для идентификации или доступа к элементам массива. Индекс массива помещается в квадратные скобки. Большинство массивов используют числовые индексы, которые обычно начинаются с 0 или 1. В PHP ассоциативные массивы могут использовать строковые индексы. Оба типа массивов создаются с помощью конструкции array().

    Порядок выполнения операций

    Когда вычисляется арифметическое выражение, существует заданный порядок, в котором выполняются операции. Этот порядок называется приоритетом операций. Умножение и деление имеют преимущество (и выполняются первыми) перед сложением и вычитанием, при движении в выражении слева направо. Этот порядок имеет важное влияние на то, будут ли получены ожидаемые результаты. Рассмотрим следующие объявления и присваивания.
    $answer = $num1 * $num2 - $num3;
    echo $answer; ?>
    Получающееся значение будет равно 18. Сначала $num1 умножается на $num2, чтобы получить 20; затем $num3 вычитается из 20, чтобы получить 18. Предположим, однако, что в действительности надо сначала вычесть $num3 из $num2, а затем умножить на $num1, чтобы получить 12. Показанное выше выражение не создаст этот результат, потому что умножение имеет приоритет перед вычитанием и выполнится первым.
    Поэтому часто необходимо переопределить порядок выполнения операций и явно управлять порядком вычисления выражения. Для этого используют скобки (), которые могут помочь изменить порядок выполнения арифметических операций. Приведенный выше пример можно переписать следующим образом.
    $answer = $num1 * ($num2 - $num3);
    echo $answer;
    ?>
    В этот раз $answer равно 12. $num3 вычитается из $num2, чтобы получить 3. Затем 3 умножается на $num1.
    Операторы присваивания используются для изменения значения текущей переменной на значение справа от оператора. В следующей таблице представлены операторы присваивания языка PHP.
    Оператор Описание
    =Переменной слева присваивается вычисленное справа значение
    +=Складывает значение слева со значением справа и присваивает результат переменной слева
    -=Вычитает значение справа из значения слева и присваивает результат переменной слева
    *=Умножает значение справа на значения слева и присваивает результат переменной слева
    /=Делит значение слева на значение справа и присваивает результат переменной слева
    %=Делит значение слева на значение справа и присваивает остаток (по модулю) переменной слева
    .=Значение слева соединяется (конкатенация) со значением справа, и результат присваивается переменной слева


    Операторы сравнения используются для сравенения значений. В следующей таблице представлены операторы сравнения языка PHP.

    Оператор Описание
    == равно
    != не равно
    > больше
    < меньше
    >= больше или равно
    <= меньше или равно
    Логические операторы позволяют определять состояние условий. В зависимости от условия переменной в сценарии могут происходить различные действия. Логические операторы широко используются в управляющих структурах PHP. В следующей таблице представлены логические операторы языка PHP.

    Оператор Описание
    && AND (И)
    || OR (ИЛИ)
    ! NOT (НЕ)

    Скалярные переменные

    Переменные являются временным местом хранения, используемым для представления значений в сценарии PHP. В PHP имеется два основных типа переменных: скалярные и массивы. Скалярные переменные содержат только одно значение в данный момент времени, а переменные массивы — список значений. Переменные массивы обсуждаются в следующем разделе. Скалярные переменные PHP содержат значения следующих типов.
    Целые – целые числа или числа без десятичной точки (1, 999, 325812841).
    Числа с плавающей точкой – числа, содержащие десятичную точку (1.11, 2.5, .44).
    Строки – текстовая или числовая информация. Строковые данные всегда определяются с помощью кавычек ("Hello World", "478-477-5555").
    Булевы значения – используются для значений true (истина) или false (ложь).
    Имена переменных PHP всех типов начинаются со знака "$". Имена переменных могут содержать буквы, числа, и символ подчеркивания (_); они не могут, однако, начинаться с цифры. В PHP имена переменных различают регистр символов. Следующие переменные в PHP интерпретируются как две различные переменные.
    $myvar $MYVAR
    Допустимые имена переменных:
    $myvar $F_Name $address1 $my_string_variable
    Недопустимые имена переменных:
    Myvar $1stvar $&62##
    Скалярным переменным PHP присваивают значения в следующем формате:
    $username = "jdoe" $first_name = "John" $Last_Name = "Doe"
    Переменная username содержит значение jdoe.

    Соединение переменных

    Оператор точки можно использовать также для соединения строк и переменных:
    Сообщение — The user's name is Joe Doe — выводится в окне браузера.
    Строка "The user's name is " соединяется со значением $fname (John), за которым следует пробел " ", и значением $lname (Doe).

    A Web Page

    $fname = "John"; $lname = "Doe";
    echo "The user's name is " . $fname . " " . $lname;
    ?>


    The user's name is John Doe

    Строки PHP

    Строки являются последовательностями символов. В PHP символ соответствует байту, т.е. существует точно 256 возможных различных символов. Строки могут быть очень большими. В PHP не существует практического ограничения на размер строк, поэтому вообще нет причин беспокоиться об их длине. Строковые значения могут использоваться буквально или присваиваться переменным.
    В PHP строковый литерал можно представлять тремя способами.
    строки в одиночных кавычках
    строки в двойных кавычках
    строки в синтаксисе heredox
    В этом учебнике представлено использование строк в одиночных и двойных кавычках. Синтаксис heredox не рассматривается. Подробная информация об этом синтаксисе имеется в документации PHP.

    Строки в двойных кавычках

    Строки PHP можно выводить также с помощью двойных кавычек (""). Если строки PHP помещаются в двойные кавычки, то можно применять интерполяцию. Для строк в двойных кавычках PHP поддерживает также больше экранированных символов. Эти символы представлены в таблице ниже.
    Символ Описание
    \n перенос строки
    \r возврат каретки
    \t горизонтальная табуляция
    \\ обратная косая черта
    \$ знак доллара
    \" двойная кавычка

    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. The user's name is John. My favorite fruit is grapes.
    Первая строка выводит строку в двойных кавычках с помощью оператора echo. Вторая вывода создается строкой с включенной переменной. Переменная расширяется, и ее содержимое выводится вместе со строкой. Затем расширяется переменная массива и выводится вместе со строкой.

    Строки в одиночных кавычках

    Одиночные кавычки предоставляют самый простой метод для работы со строками. При использовании этого метода строки заключаются в одиночные кавычки (''). Если одиночные кавычки требуются как часть строки, они должны быть экранированы символом обратной косой черты ("\"). Хотя одиночные кавычки предоставляют простой способ работы со строками, одиночные кавычки не поддерживают применение интерполяции (см. раздел 3-1, Скалярные переменные). Примеры ниже иллюстрируют использование одиночных кавычек.
    //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 ';'
    Первая строка вывода является результатом работы оператора echo, который выводит литеральную строку в одиночных кавычках в окне браузера. Вторая строка выводится после присваивания строки в одиночных кавычках переменной. Переменная затем выводится с помощью оператора echo. Следующая строка вывода демонстрирует использование экранирующего символа. Строка в одиночных кавычках содержит множество одиночных кавычек, используемых для выделения элементов массива. Наконец, порождается ошибка синтаксического анализа, когда внутри строки в одиночных кавычках кодируется переменная.

    Вывод констант

    Следующий фрагмент кода демонстрирует объявление константы, присваивание константе значения и вывод результатов в окне браузера.
    Пример 3.2.
    (html, txt)
    My PHP program 500 2.25
    В этом примере объявляются значения трех констант: STRING_CONST, INTEGER_CONST и FLOAT_CONST. Затем используется оператор echo для вывода содержимого констант в окне браузера. Кроме вывода в окне браузера, константы можно использовать при выполнении математических и строковых операций PHP.

    Вывод переменных

    Следующий фрагмент кода демонстрирует, как объявить скалярную переменную, присвоить скалярной переменной значение и вывести результаты в окне браузера:

    Страница Web

    $string_var = "Моя программа PHP"; $integer_var = 500; $float_var = 2.25;
    echo $string_var; echo $integer_var; echo $float_var;
    ?>


    Переменные массивы PHP можно создавать и присваивать им значения с помощью конструкции array() или явным образом.
    Переменную можно соединять с другими переменными или тегами XHTML с помощью оператора PHP — точки (.). В предыдущем блоке кода значения переменных выводятся в следующем формате:
    Моя программа PHP5002.25
    Чтобы создать возврат каретки или перенос строки, можно присоединить тег XHTML
    в конце каждой пременной:
    $string_var = "My PHP program" . "
    "; $integer_var = 500 . "
    "; $float_var = 2.25;
    echo $string_var; echo $integer_var; echo $float_var;
    ?>
    Теперь после каждой переменной вставляется перенос строки, что приводит к выводу каждого значения на отдельной строке.
    My PHP Program 500 2.25

    Оператор If

    При создании кода часто требуется выполнять различные действия на основе некоторого выбора. В PHP это можно делать с помощью условных операторов – оператора if, оператора if … else и оператора elseif.
    if – этот оператор используется для выполнения блока кода, когда выполняется условие (true).
    if...else – этот оператор используется для выполнения блока кода, когда условие выполняется (true), или для выполнения другого блока кода, когда условие не выполняется (false).
    elseif – комбинация if и else. Оператор расширяет оператор if, чтобы выполнялся другой оператор в случае, если исходное выражение if оценивается как FALSE. В отличие от else он будет выполнять альтернативное выражение, только если условное выражение elseif оценивается как TRUE.
    В том случае, когда необходимо выполнить блок кода, если выполняется некоторое условие (true), можно использовать оператор if.
    Ниже представлен синтаксис оператора if:
    if (условие) { выполняемый код }
    Строки кода оператора if заключаются в фигурные скобки ({}). Эти скобки определяют начало (открывающая скобка {) и конец (закрывающая скобка }) оператора If. Следующий пример демонстрирует использование оператора if.
    $number = 5;
    if ($number <= 10) { echo "Число меньше или равно 10."; } ?>
    Число меньше или равно 10.
    В приведенном выше примере число 5 присваивается переменной $number. Затем сценарий PHP использует оператор сравнения "<=" (меньше или равно) для сравнения значения $number с числом 10. Если значение меньше или равно 10, оператор echo выводит сообщение " Число меньше или равно 10" в окне браузера. Можно видеть, что скобки применяются для ограничения блока оператора if. Открывающая скобка { появляется сразу после оператора условия, а закрывающая скобка } — в конце оператора if.
    Вспомните, что все операторы PHP должны завершаться с помощью терминатора инструкции (;): echo "Число меньше или равно 10.";
    В некоторых случаях может понадобиться предоставить альтернативное сообщение. В приведенном выше примере предположим, что переменная $number содержит число 15, которое больше 10. Альтернативное сообщение должно выводиться, чтобы пользователь знал: число больше 10. Это можно выполнить с помощью оператора if … else.


    $number = 15;

    if ($number <= 10) { echo "Число меньше или равно 10."; }

    else { echo "Число больше 10"; } ?>

    Число больше 10.

    В приведенном выше примере число 15 присваивается переменной $number. Затем сценарий PHP использует оператор сравнения "<=" (меньше или равно) для сравнения значения $number с числом 10. Если это значение меньше или равно 10, оператор echo выводит сообщение "Число меньше или равно 10" в окне браузера. Теперь в код добавлен оператор else, чтобы выводить альтернативное сообщение, если условие в операторе if не выполняется. Альтернативное сообщение "Число больше 10" выводится в окне браузера, если оператор условия возвращает false. Здесь также используются скобки для ограничения блока оператора if. Открывающая скобка { появляется сразу после оператора условия, а закрывающая скобка } — в конце оператора if. Скобки также используются для ограничения альтернативного блока оператора else.

    Третий тип условного оператора является структурой elseif. Оператор elseif является комбинацией if и else. Подобно else он расширяет оператор if, чтобы выполнить другой оператор, если условное выражение исходного if оценивается как FALSE. Однако в отличие от else он будет выполнять это альтернативное выражение, только если условное выражение в elseif оценивается как TRUE. В одном операторе if может быть несколько структур elseif. Первое выражение elseif (если такое имеется), которое оценивается как TRUE, будет выполнено.


    $number = 15;

    if ($number < 10) { echo "Число меньше 10."; } elseif ($number == 10) { echo "Число равно 10."; }

    else { echo "Число больше 10."; } ?>

    Число больше 10.

    В этом примере числовое значение переменной $number сравнивается с 10. Сперва оператор if проверяет, что $number меньше 10. Если этот оператор выполняется (true), выводится сообщение "Число меньше 10". Затем оператор elseif используется для проверки, что $number равно 10. Если этот оператор оценивается как true, выводится сообщение "Число равно 10". Оператор elseif выполняется, ТОЛЬКО если оператор if возвращает FALSE. Наконец, если операторы if и elseif возвращают FALSE, выполняется оператор else и выводится сообщение "Число больше 10". В то время как оператор if позволяет проверить только одно условие, структуру if можно применять для проверки множества условий.

    Следующий пример использует функцию checkdate() (раздел 3-6), функцию explode() (раздел 3-2) и оператор if … else для проверки правильности строки даты.


    $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 "Неправильная дата!"; } ?>

    Правильная дата

    Операторы if можно использовать "в одиночку" либо как часть оператора if...else или if...elseif...else. В любом случае вы обнаружите, что эта структура будет важным элементом в любой программе.

    Оператор switch

    В дополнение к операторам if, рассмотренным в предыдущем разделе, PHP включает четвертый тип условного оператора, называемый оператором switch. Оператор switch очень похож или является альтернативой для команд if...else if...else. Оператор switch проверяет условие. Результат этой проверки определяет, какой case выполняется. switch используется обычно, когда ищут точный (равенство) результат, вместо условия больше или меньше. При проверке диапазона значений должен применяться оператор if.
    switch – используйте этот оператор для выбора одного из нескольких блоков кода для выполнения.
    Ниже представлен синтаксис оператора switch.
    switch (выражение) {
    case "значение1": код, который будет выполнен, если выражение = значение1; break;
    case "значение2": код, который будет выполнен, если выражение = значение2; break;
    default: код, который будет выполнен, если выражение не равно ни значение1, ни значение2; } ?>
    Подобно оператору if строки кода в операторе switch заключаются в фигурные скобки.
    Эти скобки определяют начало и конец оператора switch. Следующий пример демонстрирует использование оператора switch.
    $number = 25;
    switch ($number) {
    case 40: echo "Значение \$number равно 40"; break; case 25: echo "Значение \$number равно 25"; break; default: echo "Значение \$number отлично от 25 и 40";
    } ?>
    Оператор switch может включать множество операторов case. В предыдущем примере показаны два оператора case. Создается переменная $number, которой присваивается значение 25. Оператор switch используется для сравнения значения $number с другими значениями. Проверяемое (сравниваемое) выражение (в данном случае $number) помещается внутри скобок сразу после оператора switch. Затем вызывается последовательность операторов case для сравнения выражения с другими значениями. Эти значения помещаются сразу после оператора case. (Примечание: если проверяемые значения являются строками, они должны заключаться в кавычки.) За значением, которое сравнивается с выражением, следует двоеточие (:). Операторы case аналогичны конструкциям if и elseif. Если значение оператора case будет true, то выполняется код, связанный с этим оператором, и оператор break. Оператор break приводит к завершению оператора switch. Остальные операторы case проверяться не будут. В конце оператор switch содержит инструкцию default. Она аналогична оператору else. Если ни один из операторов case не будет выполнен (не будет иметь значение TRUE), выполняется оператор default. Здесь одновременно происходит несколько вещей:
  • проверяется условие switch и находится значение ($number == 25);
  • значение условия передается по очереди операторам case;
  • если это значение совпадает со значением case, выполняется код этого блока. Оператор break приводит к завершению оператора switch. Остальные операторы case не проверяются;
  • если проверяемое значение не совпадает ни с одним из значений case, выполняется раздел default;
  • в приведенном выше примере, так как выражение "значение $number" равно 25, выполняется второй оператор case, и в окне браузера выводится текст "Значение $number равно 25".


  • Цикл for

    Оператор цикла for используется, когда известно, сколько раз необходимо выполнить оператор или последовательность операторов. В связи с этим цикл for называют точным циклом.
    Базовый синтаксис цикла for показан ниже.
    for (инициализация; условие; шаг цикла) { выполняемый код; }
    Оператор цикла for имеет три параметра. Первый параметр используется для инициализации переменных, второй содержит условие, а третий включает в себя приращения, требуемые для реализации цикла. Блок кода, связанный с оператором for, всегда заключается в фигурные скобки ({}).
    Следующий пример демонстрирует цикл for для 4-кратного вывода сообщения "Добро пожаловать в мир PHP":

    В приведенном выше примере цикл for включает три параметра, который выполняют следующие задачи:
  • Переменная $counter инициализируется значением 1.
  • $counter < 5 определяет условие, которое должно выполняться для выполнения цикла.
  • $counter++ увеличивает значение переменной $counter при каждом выполнении цикла.

  • Ниже показан вывод, созданный этим примером цикла.
    Добро пожаловать в мир PHP! Добро пожаловать в мир PHP! Добро пожаловать в мир PHP! Добро пожаловать в мир PHP!
    При первом выполнении переменная $counter инициализируется значением 1. Так как 1 меньше 5, $counter увеличивается на 2. Затем используется оператор echo для вывода строки "Добро пожаловать в мир PHP!". К выводу присоединяется
    , чтобы создавать возврат каретки при каждом выполнении цикла. Во время второй итерации значение $counter будет равно 2. Так как 2 меньше 5, то оператор echo снова выводит строку "Добро пожаловать в мир PHP!". Этот процесс продолжается при значениях $counter, равных 3 и 4. Когда $counter становится равным 5, условие больше не выполняется, и цикл for заканчивается.
    Циклы for используются также в качестве удобного способа выполнения итераций по значениям массива. Вспомните, что массивы состоят из элементов и индексов. Каждый элемент имеет связанный с ним индекс. Первый индекс массива с числовыми индексами равен 0. До сих пор при выводе элементов массива требовалось выводить каждый элемент отдельно. Для больших массивов это может потребовать много времени и оказаться громоздким. Циклы for решают эту проблему. В следующем примере создается массив с 5 элементами. Затем применяется цикл for для вывода всех значений массива.


    //Создается новый массив, содержащий 5 значений цвета $colors = array('red', 'green', 'blue', 'yellow','white');

    // Цикл for используется для итераций по массиву и вывода каждого элемента

    for ($i = 0; $i < sizeof($colors); $i++) { echo "Значением элемента массива $i+1 является $colors[$i]."; } ?>

    Массив $colors содержит пять элементов — $colors[0] = "red", $colors[1] = "green", $colors[2] = "blue", $colors[3] = "yellow", и $colors[4] = "white". Создается массив for. Переменной счетчику $i сначала задается значение 0, что соответствует первому элементу массива. Затем задается условие, проверяющее, что значение счетчика $i меньше sizeof($colors) или общего числа элементов массива. Здесь мы знаем, что размер массива равен 5, однако в большинстве случаев размер массива во время выполнения неизвестен. Наконец, переменная счетчика увеличивается на 1 во время каждой итерации. На каждом шаге выполнения цикла выводится строка — "Значением элемента массива $i+1 является $colors[$i]". Значения $i+1 и $colors[$i] расширяются и создают при выводе литеральные значения. Цикл выполняется, пока счетчик не превысит число элементов или размер массива. Получаемый вывод показан ниже.

    Значением элемента массива 1 является red. Значением элемента массива 2 является green. Значением элемента массива 3 является blue. Значением элемента массива 4 является yellow. Значением элемента массива 5 является white.

    Циклы являются полезными конструкциям, которые активно используются при программировании.

    Цикл foreach

    Конструкция foreach является вариацией цикла for и применяется для итераций на массивах. Существуют две различные версии цикла foreach.
    Базовый синтаксис обоих версий цикла foreach показан ниже.
    foreach (array as $value) { оператор }
    foreach (array as $key => $value) { оператор }
    Первый тип цикла foreach используется для итераций по массиву, обозначенному как array. Во время каждой итерации цикла текущее значение массива присваивается переменной $value, и счетчик цикла увеличивается на единицу. Цикл продолжается, пока foreach не достигнет последнего элемента или верхней границы заданного массива. Во время каждой итерации значение переменной $value можно использовать любым способом, но исходное значение массива не изменяется. Чтобы изменить реальное значение массива, необходимо заменить символ "$" на символ "&". Любые изменения, сделанные в &value, будут присвоены элементу массива с текущим индексом.
    Следующий пример демонстрирует, как цикл foreach применяется для итераций по значениям массива.
    $my_array = array('red','green','blue');
    echo "Различные цвета включают: ";
    foreach($my_array as $value)
    {
    $colors .= $value . " ";
    }
    echo $colors;
    ?>
    Во время каждой итерации имя цвета, связанное с текущим элементом массива, присваивается переменной $colors. Также добавляется одиночный пробел между соседними именами цветов для целей вывода. Когда цикл достигает конца массива, создается следующий вывод.
    Различные цвета включают: red green blue
    Вторая форма цикла обеспечивает такие же функции, что и первая, но дополнительно присваивает на каждом шаге итерации индекс текущего элемента массива или ключ переменной $key. В предыдущем примере массив $my_array содержит три элемента: $my_array[0] = "red", $my_array[1] = "green", и $my_array[2] = "blue". В то время как переменная $value содержит значения элементов массива red, green и blue, переменная $key содержит индексы элементов массива 0, 1, и 2.

    Циклы do while

    Оператор do...while повторяет циклически блок кода, пока определенное условие принимает значение true. Другими словами, оператор do…while будет выполнять блок кода, если и пока условие будет выполняться (т.е. оцениваться как true).
    Цикл do...while аналогичен по своей природе циклу while, рассмотренному в предыдущем разделе. Ключевое различие состоит в том, что тело цикла do...while будет обязательно выполнено как минимум один раз. Это связано с тем, что оператор условия оценивается в конце оператора цикла после выполнения тела цикла.
    Базовый синтаксис цикла do…while показан ниже.
    do { выполняемый код; } while (условие);
    Выполнение кода внутри цикла do…while будет повторяться, пока условие в конце цикла будет оцениваться как true. Блок кода, связанный с оператором do…while, всегда размещается внутри фигурных скобок.
    Следующий пример демонстрирует цикл do…while, который продолжает выполняться, пока переменная $number будет больше или равна 2.
    $number = 5; do { echo $number . "
    "; $number -= 1; { while ($number >= 2);
    В приведенном выше примере переменная $number инициализируется значением 5. Цикл do…while выполняется до тех пор, пока справедливо условие ($number >=2) или $number больше или равно 2, выводя значение $number в окне браузера. В конце блока цикла значение $number уменьшается на 1.
    Ниже показан вывод, создаваемый примером цикла:
    5 4 3 2
    Во время первого выполнения значение $number равно 5. Так как условие для выполнения цикла не проверяется, пока цикл не будет выполнен один раз, то выводится значение $number, равное 5. Затем значение $number уменьшается на 1, становясь равным 4. Так как 4 больше 2, снова выполняется цикл, и во время второй итерации используется оператор echo для вывода значения 4. В вывод добавляется
    , чтобы создать возврат каретки при каждом выполнении цикла. Этот процесс продолжается, пока значение $number равно 3 и 2. Когда $number становится равным 2, оператор echo выводит значение 2, и значение $number уменьшается затем до 1. Так как 1 не больше и не равно 2, то условие больше не выполняется, и цикл do…while заканчивается.

    Циклы while

    В программировании часто необходимо повторить один и тот же блок кода несколько раз. Это можно реализовать с помощью операторов цикла. Язык PHP содержит несколько типов операторов цикла. Данный раздел рассматривает цикл while.
    Оператор while циклически повторяет блок кода, пока указанное условие имеет значение true. Другими словами, оператор while будет выполнять блок кода, если и пока условие будет истинным.
    Базовый синтаксис цикла while показан ниже.
    while (условие) { выполняемый код; }
    Код в цикле while будет повторно выполняться, пока условие в начале цикла имеет значение true. Блок кода, связанный с оператором while, всегда заключается в фигурные скобки.
    Следующий пример демонстрирует цикл while , который будет выполняться, пока значение переменной $number будет больше или равно 2.
    = 2) { echo $number . "
    "; $number -= 1; } ?>
    В приведенном выше примере переменная $number получает начальное значение, равное 5. Цикл while выполняется, пока условие ($number >=2), или значение $number больше или равно 2, и печатает в окне браузера значение $number. В конце блока цикла значение $number уменьшается на 1.
    Ниже показан вывод, создаваемый примером цикла.
    5 4 3 2
    При первом выполнении значение $number равно 5. Так как 5 больше 2, используется оператор echo для вывода значения 5. При выводе присоединяется
    , чтобы создавать возврат каретки при каждом выполнении цикла. Затем значение $number уменьшается на 1. Во время второй итерации значение $number равно 4. Так как 4 больше 2, то оператор echo выводит значение 4. Этот процесс продолжается, пока значение $number равно 3 и 2. Когда $number равно 2, оператор echo выводит значение 2, а значение $number затем уменьшается на 1. Так как 1 не больше и не равно 2, то условие больше не выполняется, и цикл while заканчивается.

    Использование функций

    Функции используются для разбиения больших блоков кода на меньшие, более управляемые единицы. Содержащийся внутри функции код выполняет определенную задачу и возвращает значение. PHP содержит два типа функций – определенные пользователем (или созданные программистом) и внутренние (встроенные функции), которые являются частью определения языка PHP. Этот раздел посвящен созданию и применению определенных пользователем функций.
    Определенные пользователем функции создаются с помощью ключевого слова function. Они особенно полезны в больших программах PHP, так как могут содержать блоки кода, которые могут вызываться или использоваться в программе, что позволяет избежать повторного переписывания кода. Далее представлен пример простой определенной пользователем функции PHP:
    function AddNumbers($num1,$num2) {
    echo "Это пример функции PHP. Она вычисляет сумму двух чисел и возвращает результат вызывающей программе";
    return $num1 + $num2;
    }
    Определенные пользователем функции могут вызываться в любом месте блока кода PHP. В PHP функция выполняется при использовании в коде ее имени. После вызова функция получает все передаваемые ей значения в форме параметров, выполняет определенные задачи и возвращает значение вызывающей программе. Простой пример показан ниже.
    function AddNumbers($num1,$num2)
    { return $num1 + $num2; } echo "Сумма 5 и 2 равна " . AddNumbers(5,2); ?>
    Однако определенная в начале функция AddNumbers() вызывается только позже в программе. Вызов функции происходит в операторе echo. Выводится строка "Сумма 5 и 2 равна ". Имя функции соединяется со строкой вывода, вызывая тем самым функцию. Функции передается два параметра — 5 и 2. Они присваиваются параметрам функции $num1 и $num2. Параметры складываются, и вызывается оператор return, чтобы "вернуть" значение или сумму двух чисел в то место в блоке кода PHP, который первоначально вызвал функцию. Вывод результата показан ниже:
    Сумма 5 и 2 равна 7
    Имена функций следуют тем же правилам, что и переменные в PHP. Допустимые имена могут начинаться с буквы или подчеркивания, после чего может следовать любое количество букв, цифр или подчеркиваний.

    Включаемые файлы

    Возможность повторного использования существующего кода является очень важной, так как может сберечь время и деньги и способствовать согласованности. Предположим, что сайт Web содержит текстовое меню, которое повторяется на каждой странице. Вместо повторного кодирования меню будет значительно легче закодировать его один раз и динамически включать содержимое меню на каждую из отдельных страниц Web. Это можно сделать с помощью так называемых серверных включаемых файлов.
    Включаемые файлы могут содержать любой код XHTML или PHP и обычно сохраняются с расширением .inc, хотя можно использовать также расширения .php, .txt, или .htm. Содержимое включаемого файла кодируется один раз и включается в любое необходимое количество страниц PHP. Если во включаемом файле делается изменение, то обновление автоматически отражается на всех страницах PHP, ссылающихся на включаемый файл.
    Ниже показан пример типичного включаемого файла, содержащего информацию о заголовке страницы.
    Header.inc

    Welcome to WebBooks.Com


    Этот пример показывает включаемый файл с именем header.inc. Файл содержит текст "Welcome to WebBooks.Com", окруженный тегом XHTML

    . Он создает заголовок третьего уровня, который можно теперь включать на все страницы, которые составляют сайт WebBooks.
    После создания включаемого файла, его можно включить в страницу PHP с помощью одной из следующих функций:
    require(имя_файла) – включает и проверяет указанный файл
    include(имя_файла) – альтернативное имя require()
    В следующем примере файл header.inc включается в существующую страницу PHP:
    home.php
    require('header.inc');
    echo "This is the WebBooks site...
    ";
    ?>
    Функция require() вызывает файл header.inc и проверяет содержимое файла. Содержимое затем выводится, как если бы оно было частью страницы home.php. В этом примере функция require() кодируется вверху страницы, так как она содержит информацию заголовка. Оператор require() можно, однако, включить в любом месте документа PHP. Расположение функции require() определяет, где будет выводиться содержимое файла в контексте страницы PHP.
    Welcome to WebBooks.Com
    This is the WebBooks site...
    Важно отметить, что при использовании включаемых файлов, которые содержат конфиденциальную информацию, такую, как пароли или информацию о пользователе, файлы должны сохраняться с использованием расширения .php, а не .inc или другого нестандартного расширения. Файлы, которые применяют нестандартные расширения файлов, могут загружаться с сервера Web, а их содержимое можно просматривать как обычный текст. Использование расширения .php гарантирует, что клиент не сможет увидеть исходный код, сервер вернет только код XHTML.

    Your First Name is:

    form_process.php


    echo " Your First Name is: " . $_POST["FName"] . "
    ";

    echo "Your Last Name is: " . $_POST["LName"] . "
    ";

    echo "Your City is: " . $_POST["City"] . "
    ";

    echo "Your State is: " . $_POST["State"] . "
    ";

    echo "
    ";

    echo "Your Message is: " . $_POST["Message"];

    ?>


    "http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

    A Web Page

    First Name:

    Last Name:

    City:

    State:

    Message:

    Итерации по массиву $_Request

    С помощью цикла foreach можно выполнять итерации на массиве $_Request. Это предоставляет хороший способ отладки сценариев, которые обрабатывают информацию формы, а также просмотреть имена полей и присланные значения, чтобы проверить, что из формы была прислана правильная информация.
    $value)
    {
    echo $key; echo ": " $value; echo "
    ";
    }
    ?>
    На каждом шаге цикла значение текущего элемента $_REQUEST присваивается переменной $value, а указатель массива сдвигается на единицу. Текущий индекс массива присваивается на каждом шаге переменной $key.
    Этот сценарий выводит имя каждого из полей (Item) формы вместе со связанным значением, при этом каждая пара выводится на отдельной строке. При использовании значений показанного выше примера вывод этого сценария будет следующим:
    FName: John LName: Smith City: Atlanta State: Georgia Message: I like PHP submit: Submit Data
    Просматривая этот вывод, можно убедиться, что ожидаемые данные были присланы на страницу welcome.php перед реальной обработкой правильно.

    Контрольный вывод введенных значений формы

    Когда страница формы PHP отправляется на сервер, все значения полей формы посылаются сценарию PHP с помощью метода формы get или post. Когда страница формы выводится снова, все поля формы будут пустыми, независимо от того, будут или нет значения допустимыми. Это происходит, потому что сервер извлекает новый экземпляр страницы PHP и посылает его браузеру. Однако пользователю было бы удобно, чтобы при повторном выводе формы ее поля былы заполнены отправленной ранее информацией. В этом случае пользователю нужно будет только исправить ошибочные данные, а не заново вводить значения во все поля. Это не является проблемой для формы с двумя полями, однако будет крайне неудобно для формы с большим числом полей.
    Контрольный вывод введенных значений формы

    Когда страница формы отправляется и сервер извлекает новый экземпляр страницы PHP и посылает браузеру, значения полей формы могут динамически обновляться, так, чтобы поля не возвращались пустыми. В этом случае пользователю будет удобнее просто обновить поля, содержащие ошибки, а не все поля формы.
    Вспомните, что значения полей посланной формы хранятся в суперглобальных переменных $_POST или $_GET. В предыдущем примере имя пользователя хранится в переменной массива $_POST['FName'], а фамилия — в переменной массива $_POST['LName']. Поэтому вывод значений полей формы можно выполнить, присваивая атрибутам 'value' полей формы с помощью кода PHP значения, содержащиеся в массиве. Следующий код демонстрирует такой подход.
    process.php

    Страница Web

    First Name: Last Name:



    Отметим, что значения текстовых полей First Name и Last Name обновлены, чтобы включить следующий код PHP:

    Когда этот код присваивается атрибуту 'value', он снова выводит значения, введенные ранее пользователем. Когда страница загружается в первый раз, значения переменных POST будут NULL, а value = "". Атрибут value содержит значение только после того, как была нажата кнопка submit.
    Повторный вывод полей формы является полезным приемом, который будет активно использоваться в последующих разделах.







    Отметим, что значения текстовых полей First Name и Last Name обновлены, чтобы включить следующий код PHP:



    Когда этот код присваивается атрибуту 'value', он снова выводит значения, введенные ранее пользователем. Когда страница загружается в первый раз, значения переменных POST будут NULL, а value = "". Атрибут value содержит значение только после того, как была нажата кнопка submit.

    Повторный вывод полей формы является полезным приемом, который будет активно использоваться в последующих разделах.

    Контрольный вывод введенных значений формы Контрольный вывод введенных значений формы
    Контрольный вывод введенных значений формы
    © 2003-2007 INTUIT.ru. Все права защищены.

    Массив $_Request

    Массив PHP $_Request предоставляет ценную помощь при сборе передаваемой на сервер информации формы, помещая ее в структуру для удобной обработки сценарием. Массив $_Request перехватывает строку имен/значений, разбирает строку на имена и соответствующие значения и помещает эту информацию в ассоциативный массив, индексированный соответствующими именами полей формы. PHP предоставляет также массивы $_POST и $_GET, однако массив $_REQUEST часто является лучшим выбором, особенно в ситуациях, когда данные отправляются с удаленного сайта и неизвестно, какой метод используется — GET или POST.
    Массив $_Request

    Когда значения данных оказываются в массиве $_Request, их можно легко использовать по их именам, применяя следующий синтаксис:
    $_Request['FName']="John" $_Request['LName']="Doe" $_Request['City']="Atlanta" $_Request['State']="Georgia" $_Request['Message']="I like PHP" $_Request['submit']="Submit Data"
    где именем является имя, связанное с полем в форме. Поэтому ссылка $_Request['Account'] указывает на значение, введенное в поле Password; а ссылка $_Request['SubmitButton'] — на значение, связанное с кнопкой Submit. С точки зрения программирования $_Request['name'] работает как переменная программы, которая указывает на значение, хранящееся в этой переменной.

    Пары имя/значение

    Данные из формы передаются на сервер как последовательность пар имя/значение. Это значит, что имя каждого элемента формы (появляющееся в атрибуте NAME тега) связывается со значением этого элемента (введеным или выбранным пользователем). Формат имя/значение, используемый для передачи, имеет вид имя=значение. Используется столько пар имя/значение, сколько имеется элементов формы, и все пары соединяются с помощью символа амперсанда (&), чтобы сформировать текстовую строку, имеющую следующий вид:
    name1=value1&name2=value2&name3=value3....
    Все символы-разделители, появляющиеся в именах или значениях, заменяются символом плюс (+), чтобы создать неразрывную строку пар имя/значение. Предположим, что пользователь ввел имя учетной записи "myaccount" и пароль "xyzzy". Полученная строка пар имя/значение, доставляемая на сервер, будет иметь вид:
    Account=myaccount&Password=xyzzy&SubmitButton=Submit
    Отметим, что передаются имена полей, кнопок и значения. Хотя здесь они показаны в том же порядке, в котором элементы появляются в форме, не гарантируется, что порядок, в котором пары имя/значение приходят на сервер, будет таким же, как и на форме.
    PHP имеет три типа переменных для работы с формами, предназначенные для хранения и обработки ввода пользователя в форму: $_GET, $_POST, и $_REQUEST. Вспомните из раздела 3-2, что они являются в действительности ассоциативными массивами значений.
    Эти переменные называют также суперглобальными. Это означает просто, что они доступны во всех областях действия сценария.
    $_GET[] — ассоциативный массив, который содержит все значения, передаваемые в сценарий с помощью метода формы GET.
    $_POST[] – ассоциативный массив, который содержит все значения, передаваемые в сценарий с помощью метода формы POST.
    $_REQUEST[] – ассоциативный массив, который содержит все значение, передаваемые в сценарий с помощью методов POST и GET.
    Следующий пример показывает типичную страницу XHTML с формой, которая может обрабатываться с помощью PHP:

    form_page.htm>



    A Web Page



    First Name: Last Name: City: State:

    Message:







    Ниже показана форма с введенными пользователем данными для обработки:

    Пары имя/значение

    Когда в приведенном выше примере нажимают кнопку отправки, все введенные пользователем данные формы передаются для обработки на страницу process.php. Так как эта форма использует метод POST, все данные формы передаются с помощью переменной PHP $_POST.

    Каждый элемент управления ввода уникальным образом определяется значением, присвоенным его атрибуту name. Значение атрибута name элемента управления формы становится значением индекса массива $_POST. Страница формы PHPForm.htm передает данные с помощью следующих перменных PHP $_POST:

    $_POST["FName"] = John $_POST["LName"] = Smith $_POST["City"] = Atlanta $_POST["State"] = Georgia $_POST["Message"] = I like PHP

    Так как переменные PHP $_POST и $_GET используют значение, связанное с атрибутом name элемента управления формы, важно, чтобы всем элементам формы было присвоено уникальное значение name (имя).

    Приведенная выше страница формы XHTML обрабатывается показанной ниже страницей process.php. Введенные в форму данные передаются с помощью переменной $_POST в сценарий PHP, который выводит информацию в окне браузера:


    process.php


    echo "Your First Name is: " . $_POST["FName"] . "
    "; echo "Your Last Name is: " . $_POST["LName"] . "
    "; echo "Your City is: " . $_POST["City"] . "
    "; echo "Your State is: " . $_POST["State"] . "
    "; echo "
    "; echo "Your Message is: " . $_POST["Message"];

    ?>

    Сценарий PHP анализирует данные формы XHTML и применяет оператор echo для вывода результатов в окне браузера.

    Если вместо метода POST используется метод GET,

    Пары имя/значение

    Здесь раздел формы XHTML выводится правильно. Однако блок кода PHP был выполнен до отправки формы (или до того, как был сделан щелчок на кнопке отправки). Это приводит к выводу строковых значений в операторах echo при загрузке страницы. Присоединенные значения $_POST[] отсутствуют, так как форма еще не была отправлена. Решение этой проблемы состоит в запрете выполнения блока кода PHP, пока форма не будет отправлена или пока не будет сделан щелчок на кнопке submit. Это можно сделать с помощью некоторой условной конструкции. Когда страница загружается, оператор if используется для определения, что была нажата кнопка submit в форме if($_POST['submit'] == "Submit Data"). Этот условие будет выполняться только после того, как будет запущена отправка формы в результате щелчка на кнопке submit. Предыдущая страница показана ниже с оператором if, проверяющим отправку формы.

    Пример 7.2.

    (html, txt)

    Теперь код раздела PHP страницы выводится только после того, как условие ($_POST['submit'] == "Submit Data") станет истинно (true), т.е. будет нажата кнопка submit и начнется процесс отправки формы. По большей части, практика разделения PHP и XHTML или их объединения является вопросом личных предпочтений.


    form_process.php


    if ($_POST['submit'] == "Submit Data") {

    echo "Your First Name is: " . $_POST["FName"] . "
    "; echo "Your Last Name is: " . $_POST["LName"] . "
    "; echo "Your City is: " . $_POST["City"] . "
    "; echo "Your State is: " . $_POST["State"] . "
    "; echo "
    "; echo "Your Message is: " . $_POST["Message"]; }

    ?>



    A Web Page



    First Name: Last Name: City: State:

    Message:







    Пример 7.2.

    Теперь код раздела PHP страницы выводится только после того, как условие ($_POST['submit'] == "Submit Data") станет истинно (true), т.е. будет нажата кнопка submit и начнется процесс отправки формы. По большей части, практика разделения PHP и XHTML или их объединения является вопросом личных предпочтений.

    Поля формы

    Формы состоят из полей, или элементов управления формы, с помощью которых пользователь вводит данные, делает выбор, и посылает информацию. Способ сбора информации зависит от типа элемента формы. Хотя в этом учебнике будут обсуждаться все типы элементов формы, в данный момент мы рассмотрим только три типа, необходимые для приложения регистрации. Это позволит хорошо понять общую методику обработки форм, без дополнительных осложнений, связанных с кодированием всех видов полей форм.
    Поле Account. Пример страницы содержит текстовое поле, в котором пользователь вводит свое учетное имя. Это стандартное текстовое поле, созданное с помощью тега с заданными атрибутами name и size.

    Поле Password. Поле пароля имеет вид стандартного текстового поля ввода; однако при вводе символов в поле, они выводятся как звездочки (*) или маркеры, чтобы сохранить приватность вводимых данных. Поле пароля создается с помощью тега . Полю необходимо присвоить имя и изменить его размер, равный по умолчанию 20 символам.

    В этом примере и для всех создаваемых форм необходимо не забывать задавать имена для полей формы. Эти имена требуются при обработке на сервере. Кроме того, можно управлять физическим размером полей, задавая атрибут size, и можно ограничить максимальное число символов, допустимых для ввода, задавая атрибут maxlength.
    Кнопка Submit. При щелчке на кнопке передачи submit выполняется действие, определенное параметром ACTION тега
    . Другими словами, щелчок на кнопке submit передает данные из формы на указанную страницу. Кнопка submit создается с помощью тега . Кроме того, необходимо задать имя кнопки для ссылки в сценарии и присвоить значение, которое служит в качестве метки, появляющейся на кнопке.

    После создания страница с формой готова к активации. Вспомните, что эта форма передает информацию об имени учетной записи и пароле на страницу welcome.php. Там эти значения проверяются, чтобы разрешить доступ к странице. Если предоставлены неправильное имя учетной записи и/или пароль, пользователя немедленно возвращают на страницу logon.php, не позволяя увидеть страницу welcome.php.

    Пример приложения

    Первым примером обработки форм является приложение регистрации. В нем две страницы. Первая страница с именем "logon.php" содержит форму для отправки имени учетной записи и пароля. Посетитель вводит эту информацию и щелкает на кнопке "Submit", чтобы отправить информацию формы для проверки.
    Пример приложения

    Вторая страница является страницей приветствия сайта с именем "welcome.php". Информация формы посылается на эту страницу для проверки учетной записи и пароля. Если имя учетной записи и пароль будут правильными, то страница становится доступной. Если имя учетной записи или пароль будут неправильными, посетитель возвращается на страницу logon.php.
    Пример приложения


    Страница регистрации


    User name:
    Password:


    Элементы управления формы XHTML выводятся на странице Web при кодировании их внутри тегов
    ...
    . Эти теги окружают элементы управления формы, однако они не обязаны окружать их "плотно". Другими словами, теги
    не обязаны непосредственно предшествовать первому элементу управления и не обязаны следовать сразу за последним элементом управления. Если страница содержит одну форму, можно записать открывающий тег сразу после тега , а закрывающий тег
    — непосредственно перед закрывающим тегом . Затем элементы управления могут появляться в теле документа вперемешку с другими тегами HTML или текстом.
    Тег
    содержит три важные для обработки форм атрибута.
    Атрибут Name. Все формы должны быть именованы. Хотя это не требуется для текущего упражнения, стоит следовать такой привычке. Имя формы потребуется, когда понадобится выполнить проверку данных в браузере, что будет рассмотрено в оставшейся части этого раздела. Формы именуют, записывая name="ИмяФормы" в теге . Форме можно присвоить любое имя по желанию. В данном примере используется name="Logon".
    Атрибут Action. Атрибут Action="url" определяет расположение и имя страницы, на которую посылается информация из формы для обработки. Если страница, которая будет обрабатывать данные, находится в том же каталоге, что и содержащая форму страница, то URL в параметре Action является просто именем этой страницы. Иначе это может быть полный URL, определяющий адрес Web на другом сервере или в другом каталоге на том же сервере. В рассматриваемом примере имя учетной записи и пароль, введенные посетителем, посылаются на страницу welcome.php в том же каталоге: action="welcome.php".
    Атрибут Method. Атрибут method="GET|POST" определяет способ, используемый для пересылки данных формы на страницу, где они будут обрабатываться. Существует два метода на выбор.
  • Метод GET является более старым способом пересылки данных. В этом случае данные из формы присоединяются в конце URL страницы, на которую посылаются данные (URL в атрибуте action). Данные формы состоят из текстовой строки, которая соединяется с URL с помощью знака вопроса (?). Вы могли видеть, как это происходит, при посещении Web. Этот метод не является предпочтительным при отправке данных формы, так как существует ограничение на количество посылаемых символов, и данные плохо защищены от постороннего взгляда, когда они появляются в поле адреса URL в браузере. Мы будем в дальнейшем в некоторых случаях использовать этот метод.
  • Метод POST отчасти решает эти проблемы. Он посылает данные формы на страницу action как отдельный поток данных, который не появляется в поле адреса браузера, кроме того, можно посылать любое требуемое для обработки формы количество символов. Если нет специальных причин, всегда используйте метод POST. В этом примере применяется method="post".


  • Проектирование форм

    Обработка форм является очень важным свойством PHP. С помощью форм пользователи взаимодействуют со страницами Web, и с их же помощью можно собирать информацию для персонализированных страниц посетителей. В более широком смысле информационной обработки, формы предназначены для ввода данных в системы обработки. Они являются первичным механизмом получения данных, которые обрабатывают сценарии для порождения новой информации, обновления файлов и баз данных, а также для ответа на запросы пользователей для получения информации.
    В этом учебнике будут рассмотрены все аспекты обработки форм. У нас будет возможность обсудить и продемонстрировать все элементы управления или механизмы ввода данных, которые можно закодировать в формах. Вполне вероятно, что большинство из них встречались вам во время посещения Web: поля ввода текста, активные кнопки, радиокнопки, флажки, раскрывающиеся меню и тому подобное. Все они будут изучены в дальнейшем. Сейчас мы рассмотрим два распространенных элемента управления – поля ввода текста и кнопки отправки форм.

    Проверка формы

    При работе со страницами, которые включают обработку форм, часто необходимо проверять вводимые пользователем данные.
    PHP имеет много строковых и числовых функций, которые можно использовать для проверки ввода пользователя. Часть строковых функций, применяемых здесь, обсуждаются также в разделе 3-6. Наиболее часто используемые функции представлены ниже:
    is_string(string) – определяет, является ли переменная string строкой. Возвращает значение true или false.
    is_int(string) или is_integer(string) – определяет, является ли переменная string целым числом. Возвращает значение true или false.
    is_numeric(string) – определяет, является ли переменная string числовой строкой. Возвращает значение true или false.
    is_double(string) или is_float(string) – определяет, является ли переменная string числом с плавающей точкой. Возвращает значение true или false
    strlen(string) – возвращает длину строки string.
    strpbrk(string1, string2) – ищет в строке string1 символ из строки string2, возвращает строку, начинающуюся с найденного символа (или FALSE, если ничего не найдено).
    strtolower(string) – преобразует строку, хранящуюся в переменной string, в символы нижнего регистра.
    strtoupper(string) — преобразует строку, хранящуюся в переменной string, в символы верхнего регистра.
    Рассмотрим следующую страницу с формой XHTML:
    Проверка формы

    Эта страница формы требует, чтобы пользователь ввел имя, имя учетной записи (имя пользователя) и пароль длиной не менее 4 символов, прежде чем происходит обработка формы. Такой тип проверки формы является важным, так как он помогает гарантировать, что ввод пользователя имеет правильный формат, который можно записать в базу данных, — текстовый файл, используемый для создания сообщения e-mail или для повторного вывода пользователю. Однако один XHTML не может выполнить проверку такого типа. Этот процесс выполняется с помощью перечисленных выше строковых и числовых функций PHP.
    Отправка формы становится теперь трехшаговым процессом.
  • Ввод данных формы и щелчок на кнопке отправки.
  • Проверка ввода с помощью функций PHP.
  • Обработка (запись в файл, генерация автоматического сообщения e-mail или воспроизведение ввода на экране) данных с помощью PHP.


  • Следующий сценарий демонстрирует этот процесс.

    Пример 7.3.

    (html, txt)

    Когда нажимается кнопка отправки, применяется последовательность операторов для проверки содержимого полей формы. Сначала проверяется, что поле name не NULL (значение $_POST['name']). Если $_POST['name'] содержит значение NULL, это указывает, что пользователь не ввел имя в поле 'name'. Оператор echo используется для вывода пользователю сообщения об ошибке. Если $_POST['name'] содержит значение, то оно присваивается скалярной переменной $name, которая может использоваться позже в программе, когда начнется обработка данных. Затем проверяется поле 'user name' с помощью того же метода, который применялся для проверки поля 'name'. Если имя пользователя не введено, выводится сообщение об ошибке. Иначе значение присваивается скалярной переменной $username. Наконец, проверяется поле пароля 'password'. Проверка пароля является двухшаговым процессом: 1) проверяется, что пароль был введен, и 2) если пароль был введен, проверяется, что он содержит не меньше 4 символов. Первый оператор if проверяет, что пароль был введен. Оператор elseif (который выполняется, только если предыдущий оператор if будет оцениваться как true) проверяет введенный пароль с помощью функции strlen(). Эта функция возвращает длину пароля. Полученная длина сравнивается с числом 4. Если значение меньше 4, выводится ошибка. Иначе длина пароля будет допустима, и он присваивается скалярной переменной $password.

    Если все поля формы содержат допустимые данные, можно начинать обработку формы. Можно задать флаг, чтобы помочь в отслеживании проверки. Сначала флаг задается (($valid_form = true) в начале блока кода. Если какое-то из полей формы не содержит допустимые данные, то флагу присваивается значение false ($valid_form). После проверки всех полей формы применяется финальный оператор if для проверки статуса флага ($valid_form). Если значение $valid_form будет true (все поля формы содержат допустимые данные), можно начинать обработку формы, иначе блок обработки формы пропускается. Пользователь получает сообщение об ошибке, возникшей во время процесса проверки, и может начинать делать исправления.

    Работа с формами

    Элементы управления формы XHTML позволяют пользователям вводить данные и делать выбор и предоставляют механизм, с помощью которого пользователи взаимодействуют со страницей Web. Форма полезна в той мере, насколько она поддерживается сценарием обработки, закодированным на странице Web, или программой, выполняющейся на сервере Web. В данном учебнике рассматривается, как PHP, подобно другим серверным языкам программирования, взаимодействует с формами в ответ на ввод пользователя.
    Введенные в форму данные посылаются на обработку, после щелчка на кнопке формы submit (отправка), . Информация из полей формы передается затем на страницу, определенную атрибутом ACTION тега . Когда запрос этого URL и соответствующие данные формы прибывают на сервер, вызывается указанная страница и данные передаются ей для обработки.

    сценарий проверки имени пользователя

    login.php


    // сценарий проверки имени пользователя и пароля должен кодироваться здесь

    //если аутентификация прошла успешно session_start(); $_SESSION['access'] = "yes"; header(Location:access.php); {

    if ($_POST['submit'] == "Log Out") {

    //если пользователь решает выйти session_destroy(); }

    ?>

    access.php


    if ($_SESSION['access'] != "yes") {

    header(Location:login.php);

    }

    ?>
    Пример 8.1.
    Закрыть окно



    if ($_REQUEST[auth] == "no") { $msg = "Вы не являетесь пользователем. Зарегистрируйтесь."; }

    // Если пользователь щелкает на кнопке Login, создается cookie, // содержащий его имя пользователя и IP-адрес

    if ($_POST[submit] == "Login") { $cookie_name = "user"; $cookie_value = $_POST[uname]; $cookie_value = $cookie_value; $cookie_expire = time() + 14400;

    setcookie($cookie_name,$cookie_value,$cookie_expire,"/");

    $formDisplay = "no"; }

    ?>





    Страница Web




    if ($formDisplay == "no")

    {

    ?>




    }

    ?>





    New User? Create User Name



    User Name:







    Existing User? Enter Site






    echo "" . $msg . "";

    ?>

    Пример 8.2.
    Закрыть окно


    siteaccess.php


    // Если пользователь щелкает на кнопке Login, // создается cookie, содержащий его имя пользователя и IP-адрес

    if ($_REQUEST[auth] == "yes" && $_REQUEST[user]) {

    echo "Добро пожаловать " . " " . $_COOKIE[user] . " на сайт с ограниченным доступом. Теперь на вашем жестком диске хранится cookie, и вы можете обращаться к этому сайту без регистрации при каждом обращении";

    }

    else

    {

    header("Location:setcookie.php?auth=no"); }

    ?>
    Пример 8.3.
    Закрыть окно

    Файлы Cookies

    Файл cookie является сообщением браузеру Web от сервера Web. Браузер сохраняет сообщение в текстовом файле. Это сообщение посылается затем назад на сервер каждый раз, когда браузер запрашивает страницу с сервера.
    Основное назначение cookies состоит в идентификации пользователей и возможной подготовке специально настроенной для них страницы Web. При посещении сайта Web, использующего cookies, на сайте может быть предложено заполнить форму, чтобы предоставить такую информацию, как свое имя и возможные интересы. Эта информация упаковывается в cookie и посылается браузеру Web, который сохраняет ее для последующего использования. Когда вы в следующий раз посещаете тот же самый сайт Web, браузер пошлет cookie серверу Web. Сервер может использовать эту информацию, чтобы создать индивидуализированные страницы Web. Поэтому, например, вместо обычной приветственной страницы можно увидеть приветственную страницу со своим именем.
    В PHP файлы cookies создают с помощью функции setcookie(). Все данные cookie хранятся в глобальной переменной PHP $_COOKIE и доступны для последующих страниц.
    setcookie(name,value,expiration,path,domain,security) – определяет файл cookie, который посылается вместе с остальными заголовками HTTP. Как и другие заголовки, файлы cookie должны посылаться до какого-либо вывода работы сценария (это ограничение протокола). Поэтому требуется, чтобы обращение к функции было помещено до любого вывода, включая теги и любые символы разделители. Если вывод происходит до обращения к этой функции, то setcookie() не выполнится и вернет FALSE. Если setcookie() выполняется успешно, то возвращается TRUE. Это не указывает на то, что пользователь принял cookie.
    Параметры setcookie() объясняются в следующей таблице.
    ПараметрОписание
    nameИмя cookie. Этот идентификатор хранится в глобальной переменной $_COOKIE и доступен в последующих сценариях
    valueЗначение cookie. Значение, связанное с идентификатором cookie. Хранится на компьютере пользователя, поэтому не должно содержать секретной информации
    expirationВремя, когда истекает значение cookie или становится более недоступным. Это время можно задать с помощью функции time(). Файлы cookie, без заданного значения времени истечения, завершают свое существование при закрытии браузера
    path Указывает пути доступа на сервере, для которых cookie действителен или доступен. Прямая косая черта "/" говорит, что cookie доступен во всех папках
    domainДомен, в котором доступен cookie. Если домен не определен, по умолчанию используется хост, на котором создан cookie. Значения domain должны содержать в строке как минимум две точки ".", чтобы быть допустимыми
    securityУказывает, будет ли cookie передаваться через HTTPS. Значение 1 означает, что cookie передается через защищенное соединение. Значение 0 обозначает стандартную передачу HTTP

    Следующий пример демонстрирует, как cookie используется для сохранения имени пользователя посетителя. Вначале требуется ввести имя пользователя, чтобы получить доступ к ограниченному сайту. Когда имя пользователя будет создано, cookie, содержащий его, сохраняется на компьютере пользователя. Доступ в будущем возможен при извлечении cookie с компьютера пользователя.
    Файлы Cookies

    Пример 8.2.
    (html, txt)
    Пример 8.3.
    (html, txt)

    Следующий пример демонстрирует, как cookie используется для сохранения имени пользователя посетителя. Вначале требуется ввести имя пользователя, чтобы получить доступ к ограниченному сайту. Когда имя пользователя будет создано, cookie, содержащий его, сохраняется на компьютере пользователя. Доступ в будущем возможен при извлечении cookie с компьютера пользователя.

    Файлы Cookies


    if ($_REQUEST[auth] == "no") { $msg = "Вы не являетесь пользователем. Зарегистрируйтесь."; }

    // Если пользователь щелкает на кнопке Login, создается cookie, // содержащий его имя пользователя и IP-адрес

    if ($_POST[submit] == "Login") { $cookie_name = "user"; $cookie_value = $_POST[uname]; $cookie_value = $cookie_value; $cookie_expire = time() + 14400;

    setcookie($cookie_name,$cookie_value,$cookie_expire,"/");

    $formDisplay = "no"; }

    ?>





    Страница Web




    if ($formDisplay == "no")

    {

    ?>




    }

    ?>





    New User? Create User Name



    User Name:







    Existing User? Enter Site







    echo "" . $msg . "";

    ?>



    Пример 8.2.

    siteaccess.php


    // Если пользователь щелкает на кнопке Login, // создается cookie, содержащий его имя пользователя и IP-адрес

    if ($_REQUEST[auth] == "yes" && $_REQUEST[user]) {

    echo "Добро пожаловать " . " " . $_COOKIE[user] . " на сайт с ограниченным доступом. Теперь на вашем жестком диске хранится cookie, и вы можете обращаться к этому сайту без регистрации при каждом обращении";

    }

    else

    {

    header("Location:setcookie.php?auth=no"); }

    ?>

    Пример 8.3.

    Файлы Cookies Файлы Cookies
    Файлы Cookies
    © 2003-2007 INTUIT.ru. Все права защищены.

    Сеансы

    Переменная сеанса является специальным типом переменной, значение которой сохраняется при переходе между последовательными страницами Web. C помощью переменных сеанса специфические данные пользователя можно сохранять при переходе со страницы на страницу, предоставляя ему индивидуализированный контент при взаимодействии пользователя с приложением Web. Переменные сеанса существуют обычно, пока не выполняется одно из следующих событий:
  • пользователь закрывает окно браузера;
  • завершение заданного на сервере максимального интервала времени сеанса;
  • использование функций PHP, таких, как session_destroy(), чтобы освободить все существующие в данный момент переменные сеанса.

  • Проблема, которую должны решить переменные сеанса, состоит в том, что протокол HTTP, используемый в Web, не имеет состояния. Каждый запрос страницы совершенно независим от предыдущих запросов, поэтому, если требуется, чтобы последующие страницы "запоминали" имя пользователя, которое он вводит на первой странице, то эту информацию надо где-то сохранить.
    Система PHP имеет ряд средств для поддержки сеансов. Это руководство начинается с введения глобальной переменной $_SESSION[]. Переменную $_SESSION[] рекомендуется использовать для улучшения безопасности и удобочитаемости кода.
    Также вводятся функции сеанса session_start() и session_destroy(). Каждая из них определена ниже:
    $_SESSION[] – суперглобальный массив PHP, который содержит зарегистрированные в данный момент переменные сеанса сценария.
    session_start() – инициализация данных сеанса. Эта функция вызывается перед созданием новой переменной сеанса с помощью $_SESSION[].
    session_destroy() – разрушает все данные, зарегистрированные для текущего сеанса сценария
    В учебнике вводится также функция PHP header("Location …"). Хотя это функция HTTP, а не функция сеанса, она обычно используется для перенаправления пользователей во время существующих сеансов. Эта функция определена ниже.
    header("Location: http://www.domain.com") – функция header используется для перенаправления браузера на страницу, определенную параметром Location.
    Следующий блок кода демонстрирует, как инициализируется переменная сеанса.

    session_start();

    if ($_SESSION['count'] == "") {

    $_SESSION['count'] = 1; }

    else { $_SESSION['count'] = $_SESSION['count'] + 1;

    }

    ?>

    В этом примере сначала вызывается функция session_start() для инициализации данных сеанса. Функция session_start() должна вызываться перед созданием и присваиванием значений переменным сеанса. Затем используется оператор if для проверки значения переменной сеанса "count". Если сеанс будет null или не содержит значения, то он инициализируется как 1, иначе значение переменной сеанса увеличивается на 1. В этом случае переменная сеанса count используется для подсчета числа посетителей. Переменные сеанса предоставляют идеальный способ создания счетчиков страниц, так как каждому пользователю предоставляется уникальный сеанс.

    Переменная сеанса может создаваться также после успешного ввода пользователем своего имени и пароля, которые нужны для доступа к конфиденциальному сайту. В этом случае переменная сеанса содержит значение, которое передается со страницы на страницу, указывая, что пользователь имеет право доступа к любым ресурсам, связанным с сайтом. Когда пользователь выходит или решает "завершить", переменная сеанса должна возвращаться в исходное состояние. Это выполняется с помощью функции session_destroy().

    Пример 8.1.

    (html, txt)

    Пример выше состоит из двух страниц — login.php и access.php. Прежде чем пользователь сможет увидеть содержимое access.php, он должен пройти login.php. Создается сеанс, чтобы гарантировать, что пользователь был аутентифицирован. После того как пользователь вводит действительное имя пользователя и пароль, выполняется щелчок на кнопке "Login". Сценарий PHP проверяет, что пароль и имя пользователя допустимы. Затем переменной сеанса присваивается значение "yes" и доступ предоставляется. Пользователь перенаправляется на страницу access.php. Сценарий на access.php проверяет, что существует сеанс. Если сеанс не существует, применяется функция header(), чтобы перенаправить пользователя назад на страницу login.php и не разрешить доступ к содержимому страницы access.php.

    Страница login.php содержит второй сценарий, который используется для уничтожения переменной сеанса, вызывая функцию session_destroy(). Сценарий выполняется после того, как пользователь щелкает на кнопке "Log Out".

    Приложения Web, которые используют данные сеанса, могут быть доступны одновременно множеству пользователей. Чтобы каждый пользователь имел свой собственный сеанс, с каждым сеансом необходимо связать уникальное значение id. В PHP это уникальное значение сеанса id можно извлечь с помощью функции session_id(). Уникальное значение сеанса session_id() поддерживается для каждого пользователя и хранится в подкаталоге PHP/sessiondata, расположенном на сервере Web.

    Так как значение session_id() является уникальным для каждого пользователя, его можно применять для идентификации пользователей, не создавая при этом индивидуальных имен пользователей и паролей. Функция session_id() определена ниже:

    session_id() – используется для получения значения id текущего сеанса.

    Добавление записей

    Применяя функции ODBC, рассмотренные в предыдущем разделе, вместе с языком SQL можно добавлять записи в таблицы базы данных. Записи добавляют в таблицу базы данных с помощью формы, представляющей поля ввода данных. Затем с помощью кнопки вызывается сценарий PHP для записи новой информации в таблицу с помощью команды SQL INSERT. Типичная форма ввода для добавления новой записи в таблицу Survey показана ниже.
    Добавление записей

    Поля формы именуются соответствующим образом:
    Name — 'Name', Email — 'Email', Web Connection — 'Connection', Residence (City/ST/Country) — 'Residence', Age — 'Age', Gender — 'Gender', Comments — 'Comments'.
    Прежде чем переходить к коду, покажем синтаксис оператора SQL INSERT:
    INSERT INTO TableName (FieldName1 [,FieldName2]...) VALUES (Value1 [,Value2]...)
    Более подробно оператор INSERT рассматривается в разделе 10-1.
    Следующий код применяется для обработки данных формы VisitorSurvey.php:
    Пример 9.1.
    (html, txt)
    После щелчка на кнопке отправки создается суперглобальный массив $_POST, содержащий значения формы. Значения массива присваиваются скалярным переменным. Это упрощает кодирование оператора SQL. Затем выполняется оператор odbc_connect(). Этому оператору требуется три параметра – DSN или строка соединения без DSN, имя пользователя и пароль. Здесь для соединения с базой данных Access используется строка соединения без DSN. Так как Access для доступа к данным не требует имя пользователя или пароль, то параметры username и password кодируются как значения NULL. Ссылка на соединение сохраняется в переменной $conn. Это пример ссылочной переменной PHP.
    В отличие от скаляров или переменных массивов, ссылочные переменные не применяются в программе непосредственно, но часто используются в качестве параметров для других функций. После оператора соединения выполняется оператор SQL INSERT и присваивается переменной $sql. Затем функция odbc_exec() выполняет оператор SQL, создающий множество записей (множество записей из базы данных). Это множество записей присваивается $rs, другой ссылочной переменной PHP. Отметим, что функция odbc_exec() требует два параметра — $conn (ссылка на текущее соединение базой данных) и $sql (ссылка на текущий оператор SQL). В конце вызывается функция odbc_close() для закрытия текущего соединения с базой данных.
    Для приложений такого типа обычно желательно выполнить проверку данных, прежде чем добавлять данные в таблицу базы данных. Это необходимо сделать перед тем, как создавать соединение с базой данных, используя технику, рассмотренную в разделе 6-2.
    В случае ошибки кодирования данные не заносятся в таблицу базы данных, а PHP выводит предупреждение или сообщение об ошибке. В ситуациях такого типа полезно подавить эти сообщения, добавить код для проверки ошибок вручную и создать более понятный для пользователя вывод. Это можно сделать сразу после оператора odbc_exec(), проверяя статус вновь созданного множества записей — $rs.
    Предположим в предыдущем коде, что функция odbc_exec() содержит вместо $sql параметр $sqlString. PHP немедленно остановит выполнение страницы и выведет следующее сообщение:
    Warning: odbc_exec() [function.odbc-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 можно подавить с помощью оператора управления ошибками "@". После подавления ошибки можно добавить код для создания более понятного пользователю ответа. Такой подход показан ниже:
    Пример 9.2.
    (html, txt)
    После функции odbc_exec() используется оператор if для проверки статуса множества записей — $rs. Если множество записей успешно создано, то выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."

    Warning: odbc_exec() [function.odbc-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


    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:\path\to\database.mdb','','');

    //Оператор SQL

    $sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

    //Выполнение оператора SQL и сохранение результатов в множестве записей

    $rs = @odbc_exec($conn,$sqlstring);

    if (!$rs) {

    echo "Произошла ошибка. Попробуйте еще раз. ";

    }

    else

    {

    echo "Запись была успешно добавлена.";

    }

    odbc_close($conn);

    }

    ?>

    Пример 9.2.

    После функции odbc_exec() используется оператор if для проверки статуса множества записей — $rs. Если множество записей успешно создано, то выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."

    Доступ 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.

    Получение данных формы

    VisitorSurvey.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:\path\to\database.mdb','','');

    // Оператор SQL

    $sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

    //Выполнение оператора SQL и сохранение результатов в множестве записей

    $rs = odbc_exec($conn,$sql);

    odbc_close($conn);

    }

    ?>
    Пример 9.1.
    Закрыть окно


    VisitorSurvey.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:\path\to\database.mdb','','');

    //Оператор SQL

    $sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

    //Выполнение оператора SQL и сохранение результатов в множестве записей

    $rs = @odbc_exec($conn,$sqlstring);

    if (!$rs) {

    echo " Произошла ошибка. Попробуйте еще раз. ";

    }

    else

    {

    echo "Запись была успешно добавлена.";

    }

    odbc_close($conn);

    }

    ?>
    Пример 9.2.
    Закрыть окно


    DirectorySearch.php


    if ($_POST[submit] == "Search") {

    //Извлечение данных формы

    $string = $_POST['search'];

    //Установление соединения с данными

    $conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

    //Выполнение оператора SQL SELECT

    $sql = "SELECT * FROM Directory WHERE LName = '$string'";

    $rs = odbc_exec($conn, $sql); }

    ?>



    Страница Web







    Введите ниже фамилию и щелкните на кнопке "Search", чтобы найти номер телефона сотрудника и адрес e-mail
    Company XYZ Directory





    if(!empty($_POST)) { while($row = odbc_fetch_array($rs))

    { echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "
    "; echo "Telephone: " . $row['Telephone'] . "
    "; echo "Email: " . $row['Email'] . "
    "; }

    odbc_close($conn); } ?>

    Пример 9.3.
    Закрыть окно


    DirectorySearch.php


    if ($_POST['submitb']=="Delete Record") {

    $conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','',''); $sqlDelete = " DELETE FROM Personnel WHERE AutoNum =" . $_POST['AutoNum']; $rsDelete = odbc_exec($conn,$sqlDelete);

    if(odbc_num_rows($rsDelete) == 1) {

    echo "Запись успешно удалена!";

    }

    odbc_close($conn);

    }

    ?>
    Пример 9.4.
    Закрыть окно


    DirectorySearch.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:\path\to\database.mdb','',''); $sqlUpdate = "UPDATE Personnel SET (FName = '$new_fname', LName = '$new_lname', Telephone = '$new_telephone', Email = '$new_email') WHERE AutoNum =" . $_POST['AutoNum']; $rsUpdate = odbc_exec($conn,$sqlUpdate);

    if(odbc_num_rows($rsUpdate) == 1) {

    echo "Запись успешно обновлена!";

    }

    odbc_close($conn);

    }

    ?>
    Пример 9.5.
    Закрыть окно

    Изменение записей

    Оператор SQL UPDATE используется для изменения или обновления существующих записей базы данных.
    Синтаксис оператора SQL UPDATE показан ниже:
    UPDATE ИмяТаблицы SET (FieldName1=value1 [,FieldName2=value2]...) WHERE критерий
    Следующая форма представляет запись пользователя, которая будет обновлена в таблице базы данных Personnel. Модификация любых полей, связанных с записью, и щелчок на кнопке Update Record вызывает процедуру PHP, которая выполняет оператор SQL UPDATE, чтобы обновить эту запись в таблице базы данных.
    Изменение записей

    Кроме показанных выше элементов управления формы страница содержит также скрытое текстовое поле с именем "AutoNum" со значением, равным значению поля AutoNum в таблицы базы данных. Это поле используется для уникальной идентификации каждой записи. Следующий код демонстрирует работу страницы:
    Пример 9.5.
    (html, txt)
    После щелчка на кнопке "Update Record" текущие значения полей формы присваиваются скалярным переменным. Этот шаг не является обязательным, однако он упрощает кодирование оператора SQL UPDATE. Затем устанавливается соединение с базой данных Access. После соединения с базой данных выполняется оператор SQL UPDATE для обновления записи в таблице Personnel со значением поля AutoNum, равным значению скрытого текстового поля AutoNum. Затем выполняется оператор SQL. Результаты функции odbc_exec() присваиваются переменной $rsUpdate. Последний шаг состоит в проверке, что обновление записи было успешно, и в выводе подтверждающего сообщения.
    Функция odbc_num_rows() используется для определения числа строк в результате ODBC или числа строк, затронутых оператором odbc_exec(). Так как обновляется только одна запись, то обновление записи проходит успешно, если результат функции odbc_num_rows() будет равен 1. В конце соединение с базой данных закрывается.

    Соединения 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
    odbc_connect(dsn/строка соединения без dsn,имя_пользователя,пароль) – функция, используемая для соединения с источником данных ODBC. Функция получает четыре параметра: имя источника данных (dsn) или строку соединения без dsn, имя пользователя, пароль и необязательный тип курсора. В тех случаях, когда имя пользователя, пароль, и тип курсора не требуются, параметры можно заменить пустой строкой — ''. id соединения, возвращаемый этой функцией, требуется другим функциям ODBC. Можно иметь одновременно открытыми несколько соединений, если они либо имеют различные id, либо используют различные имя пользователя и пароль.
    odbc_exec(id_соединения, строка_запроса SQL) – функция, используемая для выполнения оператора SQL. Функция получает два параметра: объект соединения id, созданный функцией odbc_connect(), и оператор SQL. При возникновении ошибки возвращает FALSE. Возвращает множество записей, если команда SQL выполняется успешно.
    odbc_fetch_array(имя множества записей) – используется для извлечения записей или строк из множества записей как ассоциативного массива. Имя множества записей создается при вызове функции odbc_exec(). Эта функция возвращает TRUE, если может вернуть строки, иначе — FALSE.
    odbc_num_rows(имя множества записей) – возвращает число строк в множестве результатов ODBC. Функция возвращает -1, если возникает ошибка. Для операторов INSERT, UPDATE и DELETE функция odbc_num_rows() возвращает число затронутых строк. Для предложения SELECT это может быть число доступных строк. Примечание: использование odbc_num_rows() для определения числа доступных строк после оператора SELECT возвращает -1 для драйверов MS Access.
    odbc_close(id соединения) – закрывает соединение с сервером базы данных, связанное с данным идентификатором соединения.
    Эти функции будут рассмотрены в разделах с 8-2 по 8-5 .

    Соединения ODBC с помощью DSN

    Чтобы соединиться с базой данных, используя ODBC, сначала необходимо создать системное имя источника данных.
    Вот как создается соединение ODBC с базой данных MS Access
    Откройте в Панели управления значок Администрирование.
    Сделайте в раскрывшемся окне двойной щелчок на значке Источники данных (ODBC).
    Выберите вкладку Системный DSN.
    На вкладке Системный DNS щелкните на кнопке Добавить.
    Выберите Microsoft Access Driver. Щелкните на кнопке Готово.
    В следующем окне щелкните на кнопке Выбрать, чтобы найти базу данных.
    Задайте для базы данных Имя источника данных (DSN).
    Щелкните на кнопке OK.
    Конфигурация DSN должна задаваться на компьютере, на котором размещен сайт Web. Если сайт располагается на удаленном сервере, необходимо задать конфигурацию на этом сервере.
    После установления соединения ODBC можно использовать специальные функции PHP для соединения с базой данных и извлечения записей. Эти функции PHP описаны ниже.

    Удаление записей

    Оператор SQL DELETE используется для удаления существующих в базе данных записей.
    Синтаксис оператора SQL DELETE показан ниже:
    DELETE FROM Имя_таблицы WHERE критерий
    Более подробно оператор DELETE рассматривается в разделе 10.
    Следующая форма представляет запись пользователя, которая будет удалена из таблицы базы данных Personnel (Персонал). Щелчок на кнопке Delete вызывает процедуру PHP, которая выполняет оператор SQL DELETE, чтобы удалить эту запись из таблицы базы данных.
    Удаление записей

    Кроме показанных выше элементов управления формы страница содержит также скрытое текстовое поле с именем "AutoNum" со значением, равным полю AutoNum таблицы базы данных. Это поле используется для уникальной идентификации каждой записи. Следующий код демонстрирует работу страницы:
    Пример 9.4.
    (html, txt)
    После щелчка на кнопке "Delete Record" устанавливается соединение с базой данных Access. Затем выполняется оператор SQL DELETE для удаления записи из таблицы Personnel со значением поля AutoNum равным значению скрытого текстового поля AutoNum. Затем выполняется оператор SQL. Результаты функции odbc_exec() присваиваются переменной $rsDelete. Последний шаг состоит в проверке, что удаление записи было успешным, и в выводе подтверждающего сообщения. Функция odbc_num_rows() применяется для определения числа строк в результатах ODBC или числа строк, затронутых оператором odbc_exec(). Так как удаляется одна запись, то запись будет удалена успешно, если результат функции odbc_num_rows() будет равен 1. В конце соединение с базой данных закрывается.

    Выбор записей

    Кроме использования функций ODBC с оператором SQL INSERT для добавления записей в базу данных, можно также извлекать записи из таблицы базы данных с помощью оператора SQL SELECT. Типичная форма ввода для выбора существующих записей из таблицы Directory показана ниже. В этом примере фиктивная компания Company XYZ, имеет онлайновую форму, которая позволяет пользователям ввести фамилию сотрудника и найти имя и фамилию сотрудника, номер телефона и адрес e-mail.
    Выбор записей

    Оператор SQL SELECT показан ниже:
    SELECT * | [DISTINCT] field1 [,field2]... FROM TableName WHERE criteria ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...
    Более подробное рассмотрение оператора SELECT дано в разделе 10.
    Следующий код используется для обработки формы DirectorySearch.php:
    Пример 9.3.
    (html, txt)
    Эта страница содержит два блока кода PHP. Первый выполняется, когда делается щелчок на кнопке отправки "Search". Введенное пользователем имя (first name) присваивается скалярной переменной '$string'. Затем с базой данных устанавливается соединение и выполняется оператор SQL SELECT для выбора всех (*) полей записей таблицы, где значение поля 'lastname' совпадает со строкой фамилии, введенной пользователем. Наконец, выполняется оператор SQL. Если найдены подходящие записи, то множество записей присваивается переменной '$rs'.
    Второй блок кода появляется в разделе тела XHTML-документа. Код, содержащий операторы echo или print, помещается обычно между открывающим и закрывающим тегами , чтобы он выводился или форматировался в соответствии с другими элементами страницы. Операторы echo и print в блоках PHP, появляющиеся выше , всегда появляются в верху страницы и предшествуют всем другим ее элементам.
    Назначение этого блока кода состоит в выводе записей, извлеченных при выполнении оператора SQL в предыдущем блоке кода. Сначала оператор if используется для определения, что массив $_POST не является пустым. Если массив пустой, то это означает, что форма не была отправлена и никакие записи не были извлечены. Если этот условный оператор будет отсутствовать, то возникнет ошибка, так как массив odbc_fetch_array не будет содержать никаких значений.
    Затем используется цикл while для итераций на множестве записей. Во время каждой итерации по множеству записей, функция odbc_fetch_array() создает ассоциативный массив (здесь массив называется $row), содержащий значения полей текущей записи. Индексы массива соответствуют именам полей формы, а элементы массива — значениям полей. Каждая запись затем выводит $row['FName'] — значение поля 'FirstName', $row['LName'] – значение поля 'LastName', $row['Telephone'] – значение поля 'Telephone', и $row['Email'] – значение поля 'Email'. Этот процесс продолжается, при этом каждый раз массив $row содержит новые значения, пока не будет достигнут конец множества записей.
    После вывода всех записей соединение с базой данных закрывается с помощью функции odbc_close().
    Ниже показан пример вывода, созданного после поиска в каталоге компании XYZ.

    Выбор записей

    Если пользователь ищет фамилию, которая не существует в таблице базы данных, то никакие записи не выводятся. Чтобы избежать путаницы, приведенный выше сценарий можно немного изменить, выводя сообщение, если не будет найдено подходящих записей.

    DirectorySearch.php


    if(!empty($_POST)) { $results = 0; while($row = odbc_fetch_array($rs))

    { echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "
    "; echo "Telephone: " . $row['Telephone'] . "
    "; echo "Email: " . $row['Email'] . "
    ";

    $results += 1; }

    if ($results == 0)

    {

    echo "Ничего не найдено!";

    }

    odbc_close($conn); } ?>



    Модифицированный сценарий, показанный выше, добавляет счетчик записей $results для подсчета числа выводимых записей. В начале значение счетчика задается равным 0. Если множество записей существует, то цикл while будет выполнять итерации на каждой записи и увеличивать значение счетчика на 1. После окончания цикла проверяется значение счетчика. Если это значение равно 0, то никаких записей не было найдено, и выводится сообщение "Ничего не найдено!"


    Выбор записей

    Если пользователь ищет фамилию, которая не существует в таблице базы данных, то никакие записи не выводятся. Чтобы избежать путаницы, приведенный выше сценарий можно немного изменить, выводя сообщение, если не будет найдено подходящих записей.

    DirectorySearch.php


    if(!empty($_POST)) { $results = 0; while($row = odbc_fetch_array($rs))

    { echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "
    "; echo "Telephone: " . $row['Telephone'] . "
    "; echo "Email: " . $row['Email'] . "
    ";

    $results += 1; }

    if ($results == 0)

    {

    echo "Ничего не найдено!";

    }

    odbc_close($conn); } ?>



    Модифицированный сценарий, показанный выше, добавляет счетчик записей $results для подсчета числа выводимых записей. В начале значение счетчика задается равным 0. Если множество записей существует, то цикл while будет выполнять итерации на каждой записи и увеличивать значение счетчика на 1. После окончания цикла проверяется значение счетчика. Если это значение равно 0, то никаких записей не было найдено, и выводится сообщение "Ничего не найдено!"

    Добавление записей

    С помощью рассмотренных в предыдущем разделе функций MySQL и языка SQL можно добавлять записи в таблицу базы данных. Записи добавляются с помощью формы, предоставляющей области для ввода информации. Нажатие кнопки вызывает затем сценарий PHP для записи новой информации в таблицу с помощью команды SQL INSERT.
    Типичная форма ввода для добавления новой записи в таблицу Survey показана ниже.
    Добавление записей

    Поля формы именованы соответствующим образом:
    Name — 'Name', Email — 'Email', Web Connection — 'Connection', Residence (City/ST/Country) — 'Residence', Age — 'Age', Gender — 'Gender', Comments — 'Comments'.
    Прежде чем подробно рассматривать код, будет полезно посмотреть на синтаксис оператора SQL INSERT:
    INSERT INTO TableName (FieldName1 [,FieldName2]...) VALUES (Value1 [,Value2]...)
    Более подробное рассмотрение оператора INSERT дано в приложении.
    Следующий код используется для обработки данных формы VisitorSurvey.php:
    Пример 10.1.
    (html, txt)
    После нажатия кнопки отправки Submit создается суперглобальный массив $_POST, содержащий значения из формы. Значения массива присваиваются скалярным переменным. Это упрощает кодирование оператора SQL. Затем выполняется оператор mysql_connect(). Этот оператор требует три параметра – имя хоста сервера MySQL, имя пользователя, и пароль. Здесь для соединения с базой данных MySQL используется строка соединения без DSN. Ссылка на соединение хранится в переменной $conn. Это пример ссылочной переменной PHP. В отличие от скалярных переменных и массивов, ссылочные переменные не применяются непосредственно в программе, но часто используются как параметры для других функций. После соединения с сервером базы данных MySQL следующий шаг состоит в выборе базы данных. Так как экземпляр сервера MySQL может содержать большое число баз данных, то задействуется функция mysql_select_db для выбора одной из них для использования в приложении. Эта функция требует два параметра – имя базы данных и ссылку на соединение MySQL. Вслед за выбором базы данных формируется оператор SQL INSERT и присваивается переменной $sql. Затем функция mysql_query() выполняет оператор SQL, создающий множество записей (множество записей базы данных). Это множество записей присваивается переменной $rs, еще одной ссылочной переменной PHP. Отметим, что функция mysql_query() требует два параметра — $sql (ссылка на текущий оператор SQL) и $conn (ссылка на текущее соединение с базой данных). Наконец, вызывается функция close() для закрытия текущего соединения с базой данных. Для таких приложений обычно желательно выполнять проверку данных, прежде чем заносить данные в таблицу базы данных. Это необходимо делать перед установлением соединения с базой данных с помощью методов, рассмотренных в разделе 6-2.
    В случае ошибки кодирования данные не заносятся в таблицу базы данных, а PHP выведет предупреждение или сообщение об ошибке. В такой ситуации полезно подавить эти критические сообщения, добавить код для проверки ошибок вручную и сгенерировать более понятный для пользователя вывод. Это можно делать сразу после оператора mysql_query(), проверяя статус вновь созданного множества записей — $rs.
    Предположим, что в предыдущем коде функция mysql_query() содержит вместо $sql параметр $sqlString. В этом случае PHP немедленно прекратит выполнение страницы и выведет следующее сообщение:
    Warning: odbc_exec() [function.odbc-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 можно подавить с помощью оператора управления ошибками "@". При подавленном сообщении об ошибке можно добавить код для создания более понятного пользователю сообщения. Такой подход показан ниже:
    Пример 10.2.
    (html, txt)
    Вслед за функцией mysql_query() используется оператор if для проверки статуса множества записей $rs. Если множество записей успешно создается, выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."

    Warning: odbc_exec() [function.odbc-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


    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,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

    //Выполнение оператора SQL и сохранение результатов в виде множества записей

    $rs = @mysql_query($sqlstring,$conn);

    if (!$rs) {

    echo "Произошла ошибка. Попробуйте еще раз.";

    }

    else

    {

    echo "Запись была успешно добавлена.";

    }

    mysql_close($conn);

    }

    ?>

    Пример 10.2.

    Вслед за функцией mysql_query() используется оператор if для проверки статуса множества записей $rs. Если множество записей успешно создается, выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."

    Доступ к MySQL

    База данных MySQL® стала самой популярной в мире базой данных с открытым исходным кодом — благодаря ее высокой производительности, надежности и легкости использования. Существует более 6 миллионов установок этой базы данных, начиная от больших корпораций и до специализированных встроенных приложений.
    Доступ к MySQL

    Система PHP предоставляет поддержку для MySQL с помощью набора функций, которые можно использовать для манипуляции данными MySQL. Задача этого учебника состоит в том, чтобы познакомить с этими функциями, используемыми обычно в ориентированных на данные приложениях PHP для извлечения, обновления, добавления и удаления данных.
    Используемые обычно функции PHP для MySQL описаны ниже.
    mysql_connect(имя сервера MySQL,имя пользователя,пароль) – открывает соединение с сервером MySQL.
    mysql_select_db(имя базы данных,идентификатор_соединения) – выбирает базу данных, расположенную на сервере MySQL. Параметр "имя базы данных" относится к активной базе данных на сервере MySQL, которая была открыта с помощью функции mysql_connect. "Идентификатор_соединения" является ссылкой на текущее соединение с MySQL.
    mysql_query(запрос sql) – посылает запрос активной в данный момент базе данных.
    mysql_fetch_array(resourse result) – возвращает массив, который соответствует извлеченной строке, и перемещает внутренний указатель данных вперед.
    mysql_affected_rows(resourse result) – определяет число строк, затронутых предыдущей операцией SQL.
    mysql_close(link_identifier) – закрывает соединение MySQL.
    Прежде чем можно будет применять эти функции для создания приложений обработки данных с помощью MySQL, необходимо получить подходящий доступ к серверу MySQL. Для этого требуется учетная запись пользователя и пароль с полномочиями доступа к базе данных и таблицам, содержащим данные, а также имя хоста сервера MySQL или IP-адрес.
    При работе с сервером MySQL полезно также использовать инструменты управления с графическим интерфейсом, которые обеспечивают более легкий интерфейс использования данных. Популярными инструментами являются: SQLyog (доступный на http://www.webyog.com) и MySQL Administrator (доступный на http://www.mysql.com/products/tools/).

    Получение данных формы

    VisitorSurvey.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,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

    //Выполнение оператора SQL и сохранение результатов в множестве записей

    $rs = mysql_query($sql,$conn);

    mysql_close($conn);

    }

    ?>
    Пример 10.1.
    Закрыть окно


    VisitorSurvey.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,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

    //Выполнение оператора SQL и сохранение результатов в виде множества записей

    $rs = @mysql_query($sqlstring,$conn);

    if (!$rs) {

    echo " Произошла ошибка. Попробуйте еще раз.";

    }

    else

    {

    echo "Запись была успешно добавлена.";

    }

    mysql_close($conn);

    }

    ?>
    Пример 10.2.
    Закрыть окно


    DirectorySearch.php


    if ($_POST[submit] == "Search") {

    //Получение данных формы

    $string = $_POST['search'];

    //Установление соединения с данными

    $conn = mysql_connect('localhost','root','xyxyxy');

    //Выбор базы данных

    $db = mysql_select_db('Membership', $conn);

    //Создание оператора SQL SELECT

    $sql = "SELECT * FROM Directory WHERE LName = '$string'";

    $rs = mysql_query($sql, $conn); }

    ?>



    Страница Web







    Введите ниже фамилию и нажмите кнопку "Search", чтобы найти номер телефона и адрес e-mail сотрудника
    Company XYZ Directory





    if(!empty($_POST)) { while($row = mysql_fetch_array($rs)) { echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "
    "; echo "Telephone: " . $row['Telephone'] . "
    "; echo "Email: " . $row['Email'] . "
    "; } mysql_close($conn); } ?>

    Пример 10.3.
    Закрыть окно

    Удаление записей

    Оператор SQL DELETE используется для удаления существующих записей в базе данных.
    Синтаксис оператора SQL DELETE показан ниже:
    DELETE FROM Имя_Таблицы WHERE критерий
    Более подробно оператор DELETE рассматривается в приложении.
    Следующая форма представляет запись пользователя, которая будет удалена из таблицы базы данных Personnel. Щелчок на кнопке Delete вызывает процедуру PHP, которая выполняет оператор SQL DELETE для удаления этой записи из таблицы базы данных.
    Удаление записей

    Кроме показанных выше элементов управления формы, страница включает также скрытое текстовое поле с именем "AutoNum" со значением, равным полю AutoNum таблицы базы данных. Это поле используется для уникальной идентификации каждой записи. Следующий код демонстрирует, как работает страница:
    DirectorySearch.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['AutoNum']; $rsDelete = mysql_query($sqlDelete,$conn);
    if(mysql_affected_rows($rsDelete) == 1) {
    echo "Запись успешно удалена!";
    }
    mysql_close($conn);
    }
    ?>
    После нажатия кнопки "Delete Record" устанавливается соединение с базой данных MySQL. Затем создается оператор SQL DELETE для удаления записи из таблицы Personnel со значением поля AutoNum, равным значению скрытого текстового поля AutoNum. Затем оператор SQL выполняется. Результаты работы функции mysql_query() присваиваются переменной $rsDelete. Последний шаг состоит в проверке, что удаление записи прошло успешно, и в выводе подтверждающего сообщения. Функция mysql_affected_rows() используется для определения числа строк в множестве результатов ODBC или числа строк, затронутых оператором mysql_query(). Так как будет удалена только одна запись, то результат mysql_affected_rows() равный 1 означает, что запись удалена успешно. В конце соединение с базой данных закрывается.

    Выбор записей

    Кроме применения функций MySQL с оператором SQL INSERT для добавления записей в базу данных, можно также извлекать записи из таблицы базы данных с помощью оператора SQL SELECT.
    Типичная форма ввода для выбора существующих записей из таблицы Directory показана ниже. В этом примере фиктивная компания, Company XYZ, имеет онлайн форму, которая позволяет пользователям ввести фамилию сотрудника и найти полное имя сотрудника, номер телефона и адрес e-mail.
    Выбор записей

    Оператор SQL SELECT показан ниже:
    SELECT * | [DISTINCT] field1 [,field2]... FROM TableName WHERE criteria ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...
    Более подробно оператор SELECT рассматривается в приложении.
    Следующий код используется для обработки формы DirectorySearch.php:
    Пример 10.3.
    (html, txt)
    Эта страница содержит два блока кода PHP. Первый выполняется, когда нажимается кнопка отправки формы "Search". Введенная пользователем фамилия присваивается скалярной переменной '$string'. Затем создается соединение с базой данных и формируется оператор SQL SELECT для выбора всех (*) полей таблицы записей, в которых поле 'lastname' совпадает со строкой фамилии, введенной пользователем. В конце выполняется оператор SQL. Если найдены подходящие записи, то множество записей присваивается переменной '$rs'.
    Второй блок кода появляется в теле документа XHTML. Код, содержащий операторы echo или print, помещается обычно между открывающим и закрывающим тегами , так что он может выводиться или форматироваться в соответствии с другими элементами страницы. Операторы echo и print, появляющиеся в блоках PHP, закодированные выше тега , всегда появляются в верху страницы и предшествуют всем другим ее элементам.
    Назначение этого блока кода состоит в выводе извлеченных записей, если в предыдущем блоке кода был выполнен оператор SQL. Сначала используется оператор if для проверки, что массив $POST не является пустым. Если этот массив будет пустым, то это означает, что форма не была отправлена, и никакие записи не были извлечены. Если этот условный оператор отсутствует, то будет возникать ошибка, так как массив odbc_fetch_array не будет содержать никаких значений.
    Затем используется цикл while для итераций по множеству записей. Во время каждой итерации по множеству записей функция mysql_fetch_array() создает ассоциативный массив (здесь этот массив назван $row), содержащий значения полей текущей записи. Индексы массива соответствуют именам полей формы, а элемент массива соответствует значению поля. Каждая запись затем выводит $row['FName'] — значение поля 'FirstName', $row['LName'] -- значение поля 'LastName', $row['Telephone'] – значение поля 'Telephone', и $row['Email'] – значение поля 'Email'. Этот процесс продолжается, пока не будет достигнут конец множества записей, при этом массив $row каждый раз будет содержать новые значения.
    После вывода всех записей соединение с базой данных закрывается с помощью функции mysql_close().
    Ниже представлен пример вывода, созданного после поиска в каталоге.

    Выбор записей

    Если пользователь ищет фамилию, которая не существует в таблице базы данных, то никакие записи не выводятся. Чтобы предотвратить путаницу, приведенный выше сценарий можно немного изменить так, что будет выводиться соответствующее сообщение, если подходящие записи не будут найдены.

    DirectorySearch.php


    if(!empty($_POST)) {

    while($row = mysql_fetch_array($rs))

    {

    echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "
    "; echo "Telephone: " . $row['Telephone'] . "
    "; echo "Email: " . $row['Email'] . "
    ";

    }

    if (mysql_affected_rows($rs) == 0)

    {

    echo "No records found!";

    }

    mysql_close($conn); } ?>



    Показанный выше измененный сценарий содержит дополнительно функцию mysql_affected_rows(). Эта функция требует один параметр – ссылку на текущее множество записей $rs и определяет число строк, затронутых последней операцией SQL. Если возвращаемое функцией mysql_affected_rows() значение равно 0, то оператор SQL SELECT не затронул ни одной строки. Поэтому подходящих записей найдено не было.





    if(!empty($_POST)) { while($row = mysql_fetch_array($rs)) { echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "
    "; echo "Telephone: " . $row['Telephone'] . "
    "; echo "Email: " . $row['Email'] . "
    "; } mysql_close($conn); } ?>



    Пример 10.3.

    Эта страница содержит два блока кода PHP. Первый выполняется, когда нажимается кнопка отправки формы "Search". Введенная пользователем фамилия присваивается скалярной переменной '$string'. Затем создается соединение с базой данных и формируется оператор SQL SELECT для выбора всех (*) полей таблицы записей, в которых поле 'lastname' совпадает со строкой фамилии, введенной пользователем. В конце выполняется оператор SQL. Если найдены подходящие записи, то множество записей присваивается переменной '$rs'.

    Второй блок кода появляется в теле документа XHTML. Код, содержащий операторы echo или print, помещается обычно между открывающим и закрывающим тегами , так что он может выводиться или форматироваться в соответствии с другими элементами страницы. Операторы echo и print, появляющиеся в блоках PHP, закодированные выше тега , всегда появляются в верху страницы и предшествуют всем другим ее элементам.

    Назначение этого блока кода состоит в выводе извлеченных записей, если в предыдущем блоке кода был выполнен оператор SQL. Сначала используется оператор if для проверки, что массив $POST не является пустым. Если этот массив будет пустым, то это означает, что форма не была отправлена, и никакие записи не были извлечены. Если этот условный оператор отсутствует, то будет возникать ошибка, так как массив odbc_fetch_array не будет содержать никаких значений.

    Затем используется цикл while для итераций по множеству записей. Во время каждой итерации по множеству записей функция mysql_fetch_array() создает ассоциативный массив (здесь этот массив назван $row), содержащий значения полей текущей записи. Индексы массива соответствуют именам полей формы, а элемент массива соответствует значению поля. Каждая запись затем выводит $row['FName'] — значение поля 'FirstName', $row['LName'] -- значение поля 'LastName', $row['Telephone'] – значение поля 'Telephone', и $row['Email'] – значение поля 'Email'. Этот процесс продолжается, пока не будет достигнут конец множества записей, при этом массив $row каждый раз будет содержать новые значения.

    После вывода всех записей соединение с базой данных закрывается с помощью функции mysql_close().

    Ниже представлен пример вывода, созданного после поиска в каталоге.

    Чтение файлов

    Этот раздел описывает, как использовать PHP для чтения содержимого файлов в системах Windows.
    Для чтения файлов в PHP имеются функции fread() и filesize(). Они определяются ниже.
    fread(указатель_ресурса, длина) – функция, используемая для чтения содержимого файла. Читает указанное количество байтов "длина" из файла "указатель_ресурса". Чтение останавливается, когда будет прочитано заданное количество байтов ("длина") или будет достигнут маркер EOF (end of file). Функция требует два параметра – указатель файла, который создается, когда файл открывается с помощью функции fopen(), и размер, который определяет, какая часть содержимого будет считана.
    fgetcsv(указатель_ресурса, длина, ограничитель) – функция, используемая для чтения содержимого файла и анализа данных для создания массива. Данные разделяются параметром-ограничителем, задаваемым в функции.
    filesize(имя_файла) – возвращает размер файла. Если возникает ошибка, функция возвращает значение false.
    Следующий пример иллюстрирует, как прочитать все содержимое файла:
    fileread.php
    $filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";
    $newfile = @fopen($filename, "r") or exit("Невозможно открыть файл!");
    $file_contents = @fread($newfile, filesize($filename)) or exit("Невозможно прочитать содержимое файла!");
    fclose($newfile);
    ?>
    Первый шаг состоит в создании переменной для хранения полного пути доступа к файлу, который будет открыт для чтения:
    $filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
    Путь доступа к текстовому файлу myfile.txt хранится в переменной с именем filename. Затем создается указатель файла с именем $newfile и используется с функцией fopen() для открытия файла, указанного в предыдущем разделе. Указатель файла применяется для ссылки на только что открытый файл:
    $newfile = fopen($filename, "r");
    Указатель файла является переменной PHP, которая содержит ссылку на открытый файл. Он будет задействован позже с функцией fread() для чтения содержимого из открытого файла.
    Затем создается переменная с именем $file_contents и используется для хранения содержимого текстового файла myfile.txt. Первый параметр функции fread() указывает на имя файла, содержимое которого будет прочитано. Второй параметр определяет длину файла. Если длина файла неизвестна, можно воспользоваться специальной функцией PHP с именем filesize(), которая определяет длину файла. Она требует один параметр – имя или путь доступа файла, который читается в данный момент.

    $file_contents = fread($newfile, filesize($filename));

    Все содержимое текстового файла хранится теперь в переменной $file_contents. Эти данные можно выводить на экране с помощью оператора echo или записать в другой текстовый файл.

    В некоторых случаях может понадобиться прочитать и работать с отдельными частями содержимого текстового файла. При использовании fread() все содержимое файла хранится в одной переменной, что затрудняет работу с отдельными частями файла. Если текстовый файл содержит разграничители для разделения отдельных фрагментов данных, можно применить для чтения другую функцию чтения — fgetcsv(). Эта функция читает содержимое файла и создает массив, делая доступными определенные части текста.

    Предположим, что текстовый файл numbers.txt существует и содержит следующие данные:

    numbers.txt

    50,17,34,90

    Следующий сценарий демонстрирует использование функции fgetcsv() для чтения содержимого текстового файла.

    fileread.php


    $filename = "C:/numbers.txt";

    $newfile = @fopen($filename, "r") or exit("Could not open file");

    $file_contents = @fgetcsv($newfile, filesize($filename),",") or exit("Could not read file contents");

    while ($i=0; $i < sizeof($file_contents); $i++) { echo $file_contents[$i]; echo "
    "; }

    fclose($newfile);

    ?>

    После открытия файла функция fgetcsv() считывает все содержимое файла, создавая массив — '$file_contents'. Третий параметр функции fgetcsv() определяет, что каждый элемент, отделенный с помощью запятой ",", станет элементом нового массива. Так как numbers.txt содержит значения 50,28,34,90, то $file_contents[0] = 50, $file_contents[1] = 28, $file_contents[2] = 34, $file_contents[3] = 90. После создания массива значениями можно манипулировать с помощью любой из функций для массивов PHP. В предыдущем примере цикл while выполняет итерации на массиве $file_contents[] и выводит каждое число.

    После завершения обработки файла функция fclose() используется для закрытия открытого файла.

    Данные формы успешно записаны


    if ($_POST['SubmitB'] == "Submit Data") { $file_name = "c:\formfile.txt"; $open_file = fopen($file_name, "a+");

    $file_contents= $_POST['FName'] . "," . $_POST['LName'] . "," . $_POST['DateTime'] ."\n";

    fwrite($open_file,$file_contents);

    fclose($open_file);

    echo " Данные формы успешно записаны в файл"; } ?>



    Страница Web

    Запись данных формы в файл




    Enter First Name

    Enter Last Name






    Пример 11.1.
    Закрыть окно


    upload.php


    if ($_POST[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 'Файл успешно загружен';

    } }

    ?>



    Select File:





    Пример 11.2.
    Закрыть окно

    Копирование файлов

    Этот раздел описывает, как использовать PHP для копирования файлов в системах Windows.
    PHP содержит функцию copy() для копирования файлов. Эта функция определяется ниже:
    copy(исходный_файл, новый_файл) – копирует содержимое исходного файла, определенного первым параметром, в новый файл, определенный вторым параметром функции. Функция возвращает значение true или false.
    Следующий пример показывает, как скопировать содержимое одного файла в другой файл:
    filecopy.php
    $orig_filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";
    $new_filename = "C:/Documents and Settings/Administrator/MyFiles/myNewfile.txt";
    $status = @copy($orig_filename, $new_filename) or die("Невозможно скопировать файл");
    echo "Содержимое файла успешно скопировано!";
    ?>
    Первый шаг состоит в создании переменной для хранения полного пути доступа к исходному файлу, содержимое которого будет скопировано:
    $orig_filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
    Затем создается вторая переменная для хранения полного пути доступа к новому файлу, который будет создан:
    $new_filename = "C:/Documents and Settings/Administrators/MyFiles/myNewfile.txt";
    Копирование выполняет функция copy(), принимая два параметра, путь доступа к исходному файлу — $orig_filename, и путь доступа к новому — $new_filename. Функция copy() возвращает значение true, если копирование завершается успешно; иначе возвращается значение false. Возвращаемое значение хранится в переменной $status.
    $status = copy($orig_filename, $new_filename) or die("Невозможно скопировать файл");
    Если функция copy() отказывает, выполняется функция die(), выводя сообщение об ошибке. Иначе с помощью функции echo выводится сообщение об успехе.
    echo "Содержимое успешно скопировано";
    В предыдущем разделе функция fwrite() используется вместе с функцией fread() для чтения содержимого одного файла и записи этого содержимого в новый файл. Если содержимое исходного файла не добавляется к существующему файлу, то функция copy() предоставляет более простой подход для копирования содержимого из существующего файла в новый файл.

    Открытие файлов

    PHP предоставляет доступ к файлам в операционных системах Windows и Unix для чтения, записи или добавления содержимого. Этот раздел описывает, как использовать PHP для открытия файлов в системах Windows.
    PHP содержит функции fopen() и fclose() для работы с файлами. Обе функции определяются ниже.
    fopen(имя_файла, режим)- функция используется для открытия файла. Для функции требуется задать имя файла и режим работы. Она возвращает указатель на файл, который содержит информацию о файле и используется в качестве ссылки.
    fclose(указатель_ресурса) – функция используется для закрытия файла. Для функции требуется указатель файла, созданный при открытии файла с помощью функции fopen(). Возвращает TRUE при успешной работе или FALSE при отказе.
    Имя файла является полным путем доступа к файлу, который требуется создать или открыть. Этот путь доступа может быть относительным путем доступа к файлу: "/Documents and Settings/Administrator/PHP/myfile.txt" или абсолютным путем доступа к файлу: "E:/MyFiles/PHP/myfile.txt". Для каждого определенного каталога необходимо иметь подходящие права NTFS для создания, модификации или удаления файлов.
    Режим может быть одним из следующих.
    Режимы, используемые в fopen()
    Режим Применение
    r Открывает существующий файл с целью чтения из него данных. Указатель файла помещается в начале файла
    r+ Открывает существующий файл с целью чтения или записи данных. Указатель файла помещается в начале файла
    w Открывает файл для записи. Если файл не существует, то он создается. Если файл существует, то указатель файла помещается в начале файла и функция удаляет все существующее содержимое файла
    w+ Открывает файл для чтения и записи. Если файл не существует, то он создается. Если файл существует, то указатель файла помещается в начале файла и функция удаляет все существующее содержимое файла
    a Открывает файл для записи. Если файл не существует, то он создается. Если файл существует, то указатель файла помещается в конце файла
    a+ Открывает файл для чтения и записи. Если файл не существует, то он создается. Если файл существует, то указатель файла помещается в конце файла


    Следующий пример показывает, как открыть файл для чтения:

    fileprocess.php


    $filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";

    $newfile = fopen($filename, "w+");

    //код для чтения или записи данных в файл располагается здесь

    fclose($newfile);

    ?>

    Первый шаг состоит в создании переменной для хранения всего пути доступа к файлу, который будет открыт:

    $filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";

    Путь доступа к текстовому файлу myfile.txt хранится в переменной с именем filename. Затем создается указатель файла с именем $newfile и применяется с функцией fopen() для открытия файла, указанного в предыдущем разделе. Указатель файла является ссылочной переменной PHP, используемой для ссылки на только что открытый файл:

    $newfile = fopen($filename, "w+");

    Указатель файла будет использован позже для чтения и записи содержимого в открытый файл.

    В некоторых ситуациях функция fopen() не сможет успешно открыть файл в результате неверного пути доступа к файлу, полномочий безопасности или других непредвиденных проблем. В связи с этим рекомендуется использовать специальную функцию PHP для аккуратной обработки таких ошибок. Эти функции можно применять в сочетании с оператором управления ошибками PHP "@", рассмотренного в разделе 8-2 для завершения сценария, подавления создаваемых PHP сообщений об ошибках, и вывода более понятного пользователю сообщения. Функции управления ошибками PHP описаны ниже:

    exit(сообщение_об_ошибке) – завершает текущий сценарий и выводит сообщение об ошибке, передаваемое в функцию.

    die(сообщение_об_ошибке) – алиас функции exit().

    Следующий сценарий демонстрирует использование функций управления ошибками:

    fileprocess.php


    $filename = "C:/Documents and Settings/Administrator/MyFiles/ myfile.txt";

    $newfile = @fopen($filename, "w+") or exit("Невозможно открыть или создать файл");

    //код для чтения или записи данных в файл размещается здесь

    fclose($newfile);

    ?>

    Если файл невозможно открыть, функция exit() выводит сообщение " Невозможно открыть или создать файл" и сценарий завершается.

    Если файл открывается успешно, то содержимое можно читать из файла, записывать в файл, или добавлять к файлу в зависимости от используемого в функции fopen() режима. Подробнее эти действия будут рассмотрены в следующих разделах. После завершения обработки всего файла применяется функция fclose() для закрытия открытого файла.

    Переименование файлов

    Этот раздел описывает, как использовать PHP для переименования файлов в системах Windows.
    PHP содержит функцию rename() для переименования файлов. Эта функция определена ниже:
    rename($orig_filename, $new_filename) – переименует файл, определенный первым параметром, в имя, определенное вторым параметром. Функция возвращает значение true или false.
    Следующий пример показывает, как переименовать файл с помощью функции rename():
    filerename.php
    $orig_filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt"; $new_filename = "C:/Documents and Settings/Administrator/MyFiles/newfile.txt"; $status = rename($orig_filename, $new_filename) or exit("Невозможно переименовать файл");
    echo "файл успешно переименован";
    ?>
    Первый шаг состоит в создании переменной для хранения полного пути доступа к файлу, который будет переименован:
    $orig_filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
    Второй шаг состоит в создании переменной для хранения полного пути доступа к файлу, который будет создан, когда старый файл будет переименован:
    $new_filename = "C:/Documents and Settings/Administrators/MyFiles/newfile.txt";
    При выполнении функция rename() получает два параметра, путь доступа к исходному файлу — $orig_filename и путь доступа к файлу, который будет создан, когда старый файл будет переименован — $new_filename. Функция rename() возвращает значение true, если файл переименовывается успешно, иначе возвращается значение false. Возвращаемое значение хранится в переменной $status.
    $status = rename($orig_filename,$new_filename) or exit("Невозможно переименовать файл");
    Если функция rename() отказывает, выполняется функция exit(), выводящая сообщение об ошибке. Иначе выводится сообщение об успехе с помощью оператора echo.
    echo "файл успешно переименован";

    Пересылка файлов

    В некоторых динамичных приложениях Web необходимо разрешать пользователям пересылку файлов с локального компьютера на сервер Web. Такое приложение может позволить пользователям обмениваться файлами с другими пользователями или просто предоставить механизм для хранения файлов для будущего использования. Этот раздел вводит функцию PHP для пересылки файлов.
    В PHP пересылку файлов можно реализовать с помощью следующей функции:
    move_uploaded_file(имя_файла, место_назначения) – перемещает файл в указанное место на сервере.
    Прежде чем переходить к деталям кода PHP, давайте посмотрим на элементы управления формы XHTML, необходимые для создания страницы для пересылки файлов.

    Select File:


    Блок кода начинается со стандартного тега XHTML
    . Кроме атрибутов action и method форма, используемая для пересылки файлов, должна включать тип кодирования или атрибут "encrypt". Когда форма применяется для пересылки файлов должно использоваться значение атрибута encrypt "multipart/form-data".
    После тега следует элемент текстового поля . Этот элемент управления нужен для определения расположения и имени файла, который будет пересылаться. Он содержит атрибуты name и type. Атрибут type должен быть задан как "file". name имеет определенное пользователем значение, которое будет использоваться сервером для идентификации файла источника во время процесса пересылки.
    Текстовое поле file включает также кнопку "Browse…" при выводе в окне браузера. Когда нажимается эта кнопка, появляется диалоговое окно, позволяющее пользователю найти на своем локальном компьютере файл, который будет пересылаться.
    Последним элементом управления является кнопка отправки (submit). Кнопка отправки используется для инициирования процесса отправки формы. Когда нажимается эта кнопка, информация о файле посылается на страницу upload.php, которая содержит код PHP для пересылки файла в папку, расположенную на сервере Web.
    После кодирования формы XHTML на страницу можно добавить сценарий PHP для выполнения динамической пересылки файла. Когда файл пересылается с помощью функции move_uploaded_file(), он кратко хранится во временном месте на сервере Web. Для перемещения файла в его конечное место назначения и манипуляций с его различными свойствами, используется суперглобальный массив PHP $_FILES. Массив $_FILES применяет значение name, заданное в теге lt;input type="file" name="uploadFile"/> (в данном случае 'uploadFile') для идентификации пересылаемого файла. Записи, связанные с массивом $_FILES, описаны ниже.
    $_FILES['uploadFile']['tmp_name'] – каталог на сервере web, где временно хранится файл. По умолчанию используется каталог uploadtemp, расположенный в папке PHP.
    $_FILES['uploadFile']['name'] – имя файла в системе пользователя.
    $_FILES['uploadFile']['size'] – размер файла в байтах.
    $_FILES['uploadFile']['type'] – тип MIME файла.
    $_FILES['uploadFile']['error'] – код ошибки, связанный с пересылкой файла (0 – успешная пересылка, 1 – файл превышает максимальный размер пересылки, 2 – файл превышает максимальный размер файла, 3 – файл частично загружен, 4 – файл не загружен).
    Следующие блоки кода показывают, как массив $_FILES используется с функцией move_uploaded_file() для создания простой процедуры пересылки.

    upload.php


    if ($_POST[SubmitB] == "Upload File") {

    move_uploaded_file ($_FILES['uploadFile'] ['tmp_name'], "../PHPTutorial/ECommerce/Databases/{$_FILES['uploadFile'] ['name']}");

    echo "Файл загружен.";

    }

    ?>



    Select File:





    Когда нажимается кнопка "Upload File", то файл, определенный в , автоматически посылается во временную папку на сервере Web. Затем вызывается функция move_uploaded_file() для перемещения файла. Первый параметр функции, $_FILES['uploadFile'] ['tmp_name'], становится ссылкой на файл, когда функция готовится к перемещению его в конечное место назначения. Второй параметр, "../PHPTutorial/ECommerce/Databases/{$_FILES['uploadFile'] ['name']}", является относительным путем доступа к папке, в которой был временно сохранен файл. Последняя часть пути доступа включает код {$_FILES['uploadFile'] ['name']}. Это можно интерпретировать как имя файла, который был введен в текстовое поле file с именем "uploadFile". Вкратце, функция move_uploaded_file() перемещает файл из временной папки пересылки folder ($_FILES['uploadFile'] ['tmp_name']) в папку "../PHPTutorial/ECommerce/Databases/), и файл сохраняется с тем именем, которое ввел пользователь, ({$_FILES['uploadFile'] ['name']}). Файлы можно пересылать в любой каталог на сервере Web, однако папка места назначения должна иметь полномочия доступа для записи ("write").

    Предыдущий пример кода иллюстрирует легкость пересылки файла, но с предположением, что процесс пересылки всегда будет работать, а ошибки никогда не будут происходить. Мы не рассмотрели, что происходит, когда пользователь пытается переслать файл, который превышает ограничение на размер, если папка загрузки не имеет подходящих полномочий безопасности или если некоторые непредвиденные сетевые проблемы мешают пересылке всего файла. Чтобы улучшить приведенный выше код пересылки, необходимо предоставить процедуры, которые проверяют ошибки и предоставляют пользователю информацию о том, как исправить эти проблемы.

    Следующие блоки кода показывают модифицированную версию предыдущей процедуры пересылки, которая содержит проверку ошибок.


    Пример 11.2.

    (html, txt)

    Обновленный код включает оператор if и оператор switch/case для проверки статуса пересылки файла. После выполнения функции move_uploaded_file() оператор if проверяет значение массива $_FILES['uploadFile'] ['error']. Если значение больше 0, то произошла ошибка. Значение $_FILES['uploadFile'] ['error'] передается оператору switch и проверяется. После этого выводится соответствующее сообщение об ошибке. Если значение $_FILES['uploadFile'] ['error'] равно 0, оператор else выводит сообщение об успешном выполнении.

    Еще одним новым свойством, включенным в этот пример, является скрытое текстовое поле XHTML с именем "MAX_FILE_SIZE". Это специальный скрытый тег, который можно использовать с тегом file, , для задания максимального размера файла. Если файл превышает определенное значение, то произойдет ошибка. Это значение измеряется в байтах. Здесь максимальный размер файла задан равным 1,000,000 байт (приблизительно 1 мегабайт). Можно также задать максимальный серверный размер пересылки. Это максимальный размер файла, заданный на сервере в файле PHP.ini.

    Получение данных формы

    В большинстве случаев введенные пользователями данные формы записывают в СУБД, такую, как MS Access и MySQL, с помощью функций ODBC и MySQL, рассмотренных в разделах 9 и 10. Аналогичным образом данные формы можно также записать в текстовый файл. Этот раздел описывает, как использовать PHP для получения данных формы и записи их в текстовый файл.
    Получение данных формы

    Рассмотрим приведенную выше страницу с формой. Следующий пример показывает, как записать отправленные данные формы в текстовый файл:
    Пример 11.1.
    (html, txt)
    В этом примере форма страницы XHTML содержит текстовое поле для имени и фамилии пользователя. Также кодируется скрытое поле, в которое заносится с помощью функции PHP date() текущие дата и время. Когда нажимается кнопка отправки формы, создается новый текстовый файл 'formfile.txt' и открывается в режиме добавления:
    $file_name = "c:\ApacheRoot\formfile.txt"; $open_file = fopen($file_name, "a+");
    Затем переменной $file_contents присваиваются значения суперглобальных переменных POST, содержащие имя и фамилию пользователя и текущее значение даты и времени. К строкам присоединяется запятая, чтобы создать разграничители этих значений. В конце каждой строки добавляется символ новой строки для создания возврата каретки:
    $file_contents= $_POST['FName'] . "," . $_POST['LName'] . "," . $_POST['DateTime'] ."\n";
    Наконец, содержимое переменной $file_contents записывается (добавляется) в текстовый файл. Файл закрывается, и используется оператор echo для вывода подтверждающего сообщения в окне браузера:
    fclose($open_file); echo "Данные формы успешно записаны в файл";

    Удаление файлов

    Этот раздел описывает, как использовать PHP для удаления файлов в системах Windows.
    PHP содержит функцию unlink() для удаления файлов. Функцию unlink() надо использовать с осторожностью. После удаления файла его невозможно восстановить. Эта функция определяется ниже.
    unlink(имя_файла) – удаляет файл, определенный параметром. Функция возвращает значение true или false.
    Следующий пример показывает, как удалить файл с помощью функции unlink():
    filedelete.php
    $filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";
    $status = unlink($filename) or exit("Невозможно удалить файл");
    echo "файл удален успешно";
    ?>
    Первый шаг состоит в создании переменной для хранения полного пути доступа к файлу, содержимое которого будет удалено:
    $filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
    Функция unlink() выполняется, получая один параметр, путь доступа исходного файла — $filename. Функция unlink() возвращает значение true, если файл удаляется успешно; иначе возвращается значение false. Возвращаемое значение хранится в переменной $status.
    $status = unlink($filename) or die("Невозможно удалить файл");
    Если функция unlink() отказывает, выполняется функция exit(), выводя сообщение об ошибке. Иначе с помощью оператора echo выводится сообщение об успехе:
    echo "файл удален успешно";

    Запись в файлы

    Этот раздел описывает, как использовать PHP для записи содержимого в файлы в системах Windows.
    PHP содержит функцию fwrite() для записи файлов. Эта функция определена ниже.
    fwrite(указатель_файла,строка) – записывает содержимое строки в поток указанного файла. Если задан аргумент length (длина), запись будет остановлена после записи length байтов или достижения конца строки.
    Следующий пример иллюстрирует, как записать все содержимое файла:
    filewrite.php
    $filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";
    $newfile = @fopen($filename, "w") or exit("Невозможно открыть файл");
    $file_contents = "Добавьте эту строку в текстовый файл";
    fwrite($newfile,$file_contents);
    fclose($newfile);
    ?>
    Первый шаг состоит в создании переменной для хранения полного пути доступа к файлу, который будет открыт или создан:
    $filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";
    Путь доступа к текстовому файлу myfile.txt хранится в переменной с именем filename. Затем создается указатель файла с именем $newfile и используется с функцией fopen() для открытия файла, указанного в предыдущем разделе. Указатель файла применяется для ссылки на только что открытый файл. Файл открывается в режиме записи:
    $newfile = fopen($filename, "w");
    Указатель файла является переменной PHP, содержащей ссылку на открытый файл. Он будет задействован позже для записи содержимого в открытый файл.
    Затем создается переменная с именем $file_contents и ей присваивается строковое значение, которое будет записано в текстовый файл myfile.txt.
    Наконец вызывается функция fwrite(). Первый параметр функции fwrite() указывает на имя файла, в который будет записываться содержимое. Второй параметр содержит текст, который будет записываться в открытый файл.
    fwrite($newfile, $file_contents);
    После завершения обработки файла используется функция fclose() для закрытия открытого файла.
    В некоторых случаях может понадобиться записать содержимое существующего файла в новый файл. Этот процесс требует использования функций fopen(), fread() и fwrite(). Открывается первый файл, читается его содержимое и записывается в новый файл, который также был открыт. Следующий сценарий показывает реализацию такого процесса:

    filecopy.php


    $fileAname = "C:/MyFiles/PHP/file1.txt"; $fileBname = "C:/MyFiles/PHP/file.txt";

    $currentfile = fopen($fileAname,"r") or exit("Невозможно открыть файл"); $fileAcontents = fread($currentfile,filesize($fileAname));

    $newfile = fopen($fileBname,"w");

    fwrite($newfile, $fileAcontents);

    fclose($newfile); fclose($currentfile);

    echo "Содержимое файла file1.txt скопировано в файл file.txt";

    ?>

    Этот сценарий копирует содержимое "file1.txt" в новый файл "file.txt". Сначала объявляются две переменные $fileAname и $fileBname, которым присваиваются пути доступа к каталогам существующего и нового файла. Функция fopen() используется для открытия текущего файла для чтения его содержимого. Открытый файл присваивается указателю файла $currentfile. Содержимое открытого файла считывается с помощью функции fread() и присваивается переменной $fileAcontents. Затем функция fopen() применяется снова для открытия нового файла. Открытый файл присваивается указателю файла $newfile. Функция fwrite() используется для записи содержимого исходного файла в новый файл. Когда процесс копирования завершается, оба файла закрываются с помощью функции fclose().

    Добавление объектов в корзину покупателя

    Выбор продукта и добавление его в корзину покупателя происходят на странице detail.php. Когда покупатель щелкает на кнопке "Buy Now", информация о выбранном продукте записывается как новая запись в таблицу ShopCart. Объекты, накопленные в корзине покупателя, записываются как дополнительные покупки. После окончательного оформления и записи окончательного заказа корзину покупателя можно очистить от этих объектов.
    Прежде всего, мы должны рассмотреть кнопку "Buy Now" на странице detail.php и запрограммировать ее для запуска процесса покупки.

    Атрибут ACTION, конечно, указывает на текущую страницу detail.php, кроме того, нам нужно передать на эту страницу, когда она перезагружается, информацию об ItemNumber продукта, добавляемого в корзину покупателя. Эта информация передается через строку запроса ?OrderItem= (вспомните, что переменная ItemNumber доступна на этой текущей странице). Для передачи используется метод POST.
    Здесь есть над чем подумать. Обычно теги
    окружают поля данных, которые передаются, когда делается щелчок на кнопке отправки. Однако в данном случае полей формы нет – только одна кнопка. Поэтому, когда форма посылается, передаются только имя и значение кнопки. Однако нам надо передать значение ItemNumber продукта, выбранного на этой странице, чтобы его можно было добавить в корзину покупателя. Поэтому мы просто добавляем его как строку запроса в URL из ACTION. Теперь обе переменные, POST[BuyButton] (содержащая BuyButton) и $_GET[OrderItem] (содержащая OrderItem), становятся доступными на получающей странице. Отметим, что мы использовали имя строки запроса OrderItem для покупаемого продукта, чтобы избежать путаницы с ItemNumber рассматриваемого продукта.
    Когда форма посылается, сценарий в начале страницы detail.php записывает объект в корзину покупателя.

    Пример I.11.

    (html, txt)

    Новая запись ShopCart заполняется четырьмя значениями. OrderNo получают из объекта сеанса — $_SESSION[OrderNo]. OrderItem передается на эту страницу через строку запроса. OrderDate определяется текущей датой системы, полученной с помощью функции date(). OrderQuantity задается как 1. Когда объект выбирается в начале для покупки, мы автоматически задаем заказанное количество как 1. Покупатель может изменить это количество на странице корзины покупателя.

    Мы имеем здесь также дело с ситуацией, в которой заказчик может попытаться купить один и тот же продукт несколько раз, намеренно или по неосторожности. Наше "бизнес-правило" говорит, что единовременно может быть заказан только один объект (хотя покупатели будут иметь возможность изменить заказанное количество на странице корзины покупателя). Мы не хотим, чтобы один и тот же объект появлялся несколько раз в корзине покупателя.

    Такая ситуация легко решается начальной проверкой того, что запись для этого продукта уже существует в таблице ShopCart. Оператор SQL SELECT и цикл по возвращаемому множеству записей выполняют нужную проверку:

    $sqlCart = "SELECT OrderNo,OrderItem FROM ShopCart WHERE OrderNo ='$OrderNo'"; $rsCart = odbc_exec($conn2,$sqlCart);

    while ($row = odbc_fetch_array($rsCart)) { if ($row[OrderNo] == $OrderNo && $row[OrderItem] == $OrderItem) { $update = true;

    }

    }

    Если найдены подходящие OrderNo и OrderItem, то потребуется оператор SQL UPDATE для обновления существующей записи. Если совпадений не найдено, требуется оператор SQL INSERT для создания новой записи. Для этого создается переменная ($update), которой присваивается значение true, если будут найдены подходящие OrderNo и OrderItem. Следующий блок кода содержит операторы INSERT и UPDATE. Значение переменной $update зависит от используемого оператора SQL:

    if (!$update) { $sqlInsert = "INSERT INTO ShopCart (OrderNo,OrderItem,OrderDate,OrderQuantity) Values ('$OrderNo', '$OrderItem',$OrderDate,1)"; $rsInsert = odbc_exec($conn2,$sqlInsert); } else { $sqlUpdate = "Update ShopCart SET OrderQuantity = OrderQuantity + 1 WHERE OrderNo = = '$OrderNo' AND OrderItem = '$OrderItem'"; $rsUpdate = odbc_exec($conn2,$sqlUpdate); } header("Location:shopcart.php");

    После добавления новой записи множество записей и соединение закрываются, и покупатель посылается прямо на страницу корзины покупателя с помощью метода header("Location:url"). Предполагается, что покупатель захочет после выбора просмотреть объекты корзины покупателя. Дальше мы перейдем к программированию страницы shopcart.php.


    $sqlCart = "SELECT OrderNo, OrderItem FROM ShopCart WHERE OrderNo ='$OrderNo'"; $rsCart = odbc_exec($conn2,$sqlCart);

    while ($row = odbc_fetch_array($rsCart)) { if ($row[OrderNo] == $OrderNo && $row[OrderItem] == $OrderItem) { $update = true;

    }

    }

    Если найдены подходящие OrderNo и OrderItem, то потребуется оператор SQL UPDATE для обновления существующей записи. Если совпадений не найдено, требуется оператор SQL INSERT для создания новой записи. Для этого создается переменная ($update), которой присваивается значение true, если будут найдены подходящие OrderNo и OrderItem. Следующий блок кода содержит операторы INSERT и UPDATE. Значение переменной $update зависит от используемого оператора SQL:

    if (!$update) { $sqlInsert = "INSERT INTO ShopCart (OrderNo,OrderItem,OrderDate,OrderQuantity) Values ('$OrderNo', '$OrderItem',$OrderDate,1)"; $rsInsert = odbc_exec($conn2,$sqlInsert); } else { $sqlUpdate = "Update ShopCart SET OrderQuantity = OrderQuantity + 1 WHERE OrderNo = = '$OrderNo' AND OrderItem = '$OrderItem'"; $rsUpdate = odbc_exec($conn2,$sqlUpdate); } header("Location:shopcart.php");

    После добавления новой записи множество записей и соединение закрываются, и покупатель посылается прямо на страницу корзины покупателя с помощью метода header("Location:url"). Предполагается, что покупатель захочет после выбора просмотреть объекты корзины покупателя. Дальше мы перейдем к программированию страницы shopcart.php.

    основное содержание страницы

    Сайт eCommerce require("jscript.inc")



    require("header.inc")





    require("menu.inc")





    — основное содержание страницы (контент) —



    Пример I.1.
    Закрыть окно


    stylesheetEC.css

    body {margin:0px; background-color:white; 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; color:white}

    .head1 {font-family: times new roman; font-size:18pt; font-weight:bold; color:seagreen} .head2 {font-family:times new roman; font-size:16pt; font-weight:bold; color:seagreen} .head3 {font-family:times new roman; font-size:14pt; font-weight:bold; color:seagreen} .head4 {font-family:times new roman; font-size:12pt; font-weight:bold; color:seagreen}

    a:link, a:active, a:visited {text-decoration:none; color:seagreen} a:hover {text-decoration:none; color:darkgreen; background-color:lightgreen}

    .buttonS {width:35px; text-align:center; font-family:arial; font-size:9pt; background-color:seagreen; color:white} .buttonM {width:70px; text-align:center; font-family:arial; font-size:9pt; background-color:seagreen; color:white} .buttonL {width:100px; text-align:center; font-family:arial; font-size:9pt; background-color:seagreen; color:white}

    .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.
    Закрыть окно


    Категории программ:
    //Создание соединения с данными

    $conn = odbc_connect ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');

    //Формирование оператора SQL SELECT

    $sql = " SELECT DISTINCT ItemType FROM Products ORDER BY ItemType";

    //Выполнение оператора SQL и создание множества записей

    $rs = odbc_exec($conn, $sql);

    //Цикл по множеству записей и вывод необходимых записей

    while($row = odbc_fetch_array($rs))

    { echo "
    onClick=\"location.href='search.php?Category=$row[ItemType]'\">

    ";

    }

    //Закрытие соединения с базой данных

    odbc_close($conn);

    ?>
    $row[ItemType]
    Пример I.3.
    Закрыть окно


    Сайт eCommerce















    — основной контент страницы —



    Пример I.4.
    Закрыть окно


    menu.inc

    Home Shopping Cart

    Software Categories:
    //Создание соединения с данными

    $conn = odbc_connect ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');

    //Формирование оператора SQL SELECT

    $sql = " SELECT DISTINCT ItemType FROM Products ORDER BY ItemType";

    //Выполнение оператора SQL и создание множества записей

    $rs = odbc_exec($conn, $sql);

    //Цикл по множеству записей и ввод необходимых записей

    while($row = odbc_fetch_array($rs))

    { echo "
    onClick=\"location.href='search.php?Category=$row[ItemType]'\">

    "; }

    //Закрытие соединения с БД

    odbc_close($conn);

    ?>
    $row[ItemType]


    Search for:
    Пример I.5.
    Закрыть окно



    if ($Category == "" && $Criterion == "")

    { header("Location:home.php");

    }

    ?>

    Сайт eCommerce <















    if ($Category != "") { ...code for category search

    }

    if ($Criterion != "") { ... code for keyword search }
    Пример I.6.
    Закрыть окно


    ";

    }

    odbc_close($conn);

    ?>

    //Формирование оператора SQL SELECT $sql = "SELECT ItemNumber,ItemTitle, ItemPrice FROM Products WHERE ItemType = '$Category' 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 "
    $ItemNumber $ItemTitle $$ItemPrice

    }

    ?> Пример I.7. Закрыть окно

    ";

    }

    odbc_close($conn);

    ?>


    $conn = odbc_connect ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');

    $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 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 "
    $ItemNumber $ItemTitle $$ItemPrice



    }

    ?> Пример I.8. Закрыть окно

    search.php


    if ($Category == "" && $Criterion == "")

    { header("Location:home.php");

    }

    ?>

    Сайт eCommerce


    ?>

















    Поискрезультатов для категории :




    $conn = odbc_connect ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');

    //Формирование оператора SQL SELECT

    $sql = "SELECT ItemNumber,ItemTitle, ItemPrice FROM Products WHERE ItemType = '$Category' 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 "";

    }

    odbc_close($conn);

    ?>

    Item Number Item Title Item Price
    $ItemNumber $ItemTitle $$ItemPrice



    }

    if ($Criterion != "")

    { ?>

    Поискрезультатов для критерия :




    $conn = odbc_connect ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');

    $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 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 "";

    }

    odbc_close($conn);

    ?>

    Item Number Item Title Item Price
    $ItemNumber $ItemTitle $$ItemPrice



    }

    ?>



    Пример I.9.
    Закрыть окно


    detail.php <% $ItemNumber = $_GET[ItemNumber] $Category = $_GET[Category] $Criterion = $_GET[Criterion] %>

    Сайт eCommerce








    $conn = odbc_connect ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=..\Ecommerce\databases\ecommerce.mdb','','');

    //Формирование оператора SQL SELECT

    $sql = "SELECT * FROM Products WHERE ItemNumber = '$ItemNumber'";

    //Выполнение оператора SQL и создание множества записей

    $rs = odbc_exec($conn, $sql);

    //Присваивание записей

    $ItemType = odbc_result($rs,ItemType); $ItemProducer= odbc_result($rs,ItemProducer); $ItemTitle = odbc_result($rs,ItemTitle); $ItemDescription = odbc_result($rs,ItemDescription); $ItemPrice = number_format(odbc_result($rs,ItemPrice),2);

    ?>


    Item Number:
    Producer:
    Price: $




    Back to



    Пример I.10.
    Закрыть окно



    if ($_POST[BuyButton] == "Buy Now") {

    $OrderItem = $_GET[OrderItem]; $conn2 = odbc_connect('Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','',''); $sqlCart = "SELECT OrderNo, OrderItem FROM ShopCart WHERE OrderNo ='$OrderNo'"; $rsCart = odbc_exec($conn2,$sqlCart);

    while ($row = odbc_fetch_array($rsCart)) { if ($row[OrderNo] == $OrderNo && $row[OrderItem] == $OrderItem) { $update = true;

    }

    }

    if (!$update) { $sqlInsert = "INSERT INTO ShopCart (OrderNo,OrderItem,OrderDate,OrderQuantity) Values ('$OrderNo', '$OrderItem','$OrderDate,1)"; $rsInsert = odbc_exec($conn2,$sqlInsert); } else {

    $sqlUpdate = "Update ShopCart SET OrderQuantity = OrderQuantity + 1 WHERE OrderNo = '$OrderNo' AND OrderItem = '$OrderItem'"; $rsUpdate = odbc_exec($conn2,$sqlUpdate); } header("Location:shopcart.php"); } ?>
    Пример I.11.
    Закрыть окно






    Shopping Cart

    Date:
    Order No:



    Item Number Title Quantity Price Amount
    Shipping $
    Order Total $


    Click to update changed quantities. Enter new quantity or enter 0 to cancel purchase of item. (Щелкните, чтобы обновить измененные количества. Введите новое количество или введите 0, чтобы отменить покупку товара.)




    Click to finalize on-line purchase through secure connection to Credit Payment Systems. Щелкните здесь, чтобы оформить онлайн покупку через безопасное соединение с системой оплаты по кредитным картам.


    Пример I.12.
    Закрыть окно


    Щелкните, чтобы обновить измененные значения количества. Введите новое значение количества или введите 0, чтобы отменить покупку товара.




    Щелкните, чтобы оформить онлайн покупку с помощью защищенного соединения с кредитной платежной системой.
    Пример I.13.
    Закрыть окно


    if ($_POST[UpdateButton] == "Update")

    {

    $conn2 = odbc_connect('Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');

    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 OrderNo='$_SESSION[OrderNo]' AND OrderItem='$OrderItem'";

    }

    else

    {

    $sqlCartUpdate = "UPDATE ShopCart SET OrderQuantity='$OrderQuantity' WHERE OrderNo='$_SESSION[OrderNo]' AND OrderItem='$OrderItem'";

    } $rsCartUpdate = odbc_exec($conn2,$sqlCartUpdate);

    } }

    } odbc_close($conn2); }
    Пример I.14.
    Закрыть окно




    Щелкните, чтобы оплатить онлайн покупку через защищенное соединение с Системами оплаты с помощью кредитных карт.



    Пример I.15.
    Закрыть окно


    '—Создание записи OrderDetail $sqlDetail ="SELECT * FROM OrderDetail WHERE NULL"; $rsDetail = odbc_exec($conn,$sqlDetail);

    $sqlShopCart ="SELECT * FROM ShopCart WHERE OrderNo ='$OrderNo'"; $rsShopCart = odbc_exec($conn,$sqlShopCart);

    while ($row = odbc_fetch_array($rsShopCart))

    {

    $sqlProd ="SELECT ItemTitle, ItemPrice FROM Products WHERE ItemNumber ='$row[OrderItem]'"; $rsProd = odbc_exec($conn,$sqlProd);

    $ProdTitle = odbc_result($rsProd,ItemTitle); $ProdPrice = odbc_result($rsProd,ItemPrice);

    $sqlInsertDetail = "INSERT INTO OrderDetail (OrderNo,ItemNumber,ItemQuantity,ItemTitle,ItemPrice) Values ('$row[OrderNo]','$row[OrderItem]','$row[OrderQuantity]','$ProdTitle','$ProdPrice')";

    $rsInsertDetail = odbc_exec($conn,$sqlInsertDetail);

    }
    Пример I.16.
    Закрыть окно




    ,


    echo "";

    } odbc_close($conn); $OrderShipping = number_format($OrderTotal * .02,2); $OrderTotal = number_format($OrderTotal + $OrderShipping,2);

    echo ""; ?>
    Item Number Title Quantity Price Amount
    $ItemNumber <$ItemTitle $ItemQuantity $number_format($ItemPrice,2) $number_format($ItemAmount,2)
    Shipping $OrderShipping
    Order Total $OrderTotal

    Спасибо за ваш заказ. Пожалуйста, распечатайте эту страницу и указывайте номер заказа при любых запросах. Ваш заказ будет доставлен немедленно.


    echo "Простите, но вы не можете завершить свой заказ. Когда вы решите проблему, возвращайтесь, пожалуйста, на WebWarehouse.com чтобы купить необходимое программное обеспечение."

    } ?>
    Пример I.17.
    Закрыть окно


    ...


    if ($Approval)

    {

    $sqlInsert = "INSERT INTO OrderHeader (OrderNo,OrderDate,CustomerName,CustomerAddress, CustomerCity,CustomerState,CustomerZip,CustomerPhone,CustomerEmail) Values ('$OrderNo','$Date','$Name','$Address','$City','$State','$Zip','$Phone','$Email')";

    $rsInsert = odbc_exec($conn,$sqlInsert);

    //Создание записи OrderDetail

    $sqlDetail ="SELECT * FROM OrderDetail WHERE NULL"; $rsDetail = odbc_exec($conn,$sqlDetail);

    $sqlShopCart ="SELECT * FROM ShopCart WHERE OrderNo ='$OrderNo'"; $rsShopCart = odbc_exec($conn,$sqlShopCart);

    while ($row = odbc_fetch_array($rsShopCart))

    {

    $sqlProd ="SELECT ItemTitle, ItemPrice FROM Products WHERE ItemNumber ='$row[OrderItem]'";

    $rsProd = odbc_exec($conn,$sqlProd); $ProdTitle = odbc_result($rsProd,ItemTitle); $ProdPrice = odbc_result($rsProd,ItemPrice);

    $sqlInsertDetail = "INSERT INTO OrderDetail (OrderNo,ItemNumber,ItemQuantity, ItemTitle,ItemPrice) Values ('$row[OrderNo]','$row[OrderItem]', '$row[OrderQuantity]','$ProdTitle','$ProdPrice')";

    $rsInsertDetail = odbc_exec($conn,$sqlInsertDetail);

    }

    //ВСТАВЬТЕ СЮДА СЦЕНАРИЙ E-MAIL ----------------------------------------------------------

    $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: PHP/' . phpversion();

    mail($to, $subject, $message, $headers); ----------------------------------------------------------

    //Удаление корзины покупателя

    $sqlDelete = "DELETE FROM ShopCart WHERE OrderNo='$OrderNo'"; $rsDelete = odbc_exec($conn,$sqlDelete);

    odbc_close($conn);

    //echo $sqlInsertDetail; header("Location:salesorder.php?Approval=$Approval"); } ?>
    Пример I.18.
    Закрыть окно

    Файл header.inc

    Файл header.inc импортируется в верхний раздел каждой страницы. Код использует линейные спецификации стиля для создания верхнего баннера. Файл содержит не слишком много кода, но его можно расширить, чтобы включить многие другие свойства, которые могут понадобиться в заголовке страниц.
    header.inc
    softWarehouse.com

    Файл menu.inc

    Меню поиска сделано доступным на всех страницах с помощью файла INCLUDE, который можно импортировать и поместить в разделе, расположенном вдоль левого края страницы. Этот файл menu.inc содержит код, позволяющий посетителю выбрать категорию продукта или ввести ключевое слово для поиска. Реальный поиск и вывод подходящих продуктов происходит, однако, на странице search.php. Поэтому выбор категории или ключевого слова включает ссылку на страницу search.asp, и искомое значение передается на эту страницу в строке запроса.
    Файл menu.inc

    Сначала мы рассмотрим, как создать варианты выбора категорий продуктов для поиска, а затем рассмотрим поиск по ключевым словам. Оба эти метода содержатся в файле menu.inc, который импортируется на все страницы сайта eCommerce. После отдельного рассмотрения кодирования этих методов поиска будет представлена вся страница menu.inc.

    Форматы страниц

    Следующий код воспроизводит общую компоновку всех страниц и показывает, где и как размещаются включаемые файлы в соответствующих местах страниц.
    Пример I.4.
    (html, txt)

    Функция mail()

    В PHP имеется функция mail(), предназначенная для создания сообщений email под управлением сценария.
    mail() содержит параметры для создания и отправки email, по большей части также, как это происходит в обычной почтовой программе. Среди свойств и параметров нам понадобятся следующие:
    Свойство Описание
    to Строка, представляющая адрес e-mail получателя сообщения
    subject Строка, представляющая строку тему сообщения
    message Строка, представляющая основное тело сообщения
    headers Строка, представляющая дополнительную информацию, которая включается в начале сообщения e-mail

    В простейшем виде сценарий e-mail может выглядеть следующим образом:
    mail($to, $subject, $message, $headers);
    ?>
    Конечно необходимо еще с ним поработать, чтобы составить сообщение о подтверждении заказа, особенно если оно форматируется для представления в виде формы заказа.

    Генерация случайных чисел

    Один метод создания уникального идентификатора состоит в генерации случайного числа. В PHP это делают с помощью следующего кода:
    $RandomNumber = rand(int min, int max)
    где min и max являются целыми значениями, которые определяют диапазон чисел, в котором должно находится случайно сгенерированное число. Результат присваивается переменной RandomNumber. Поэтому, если требуется получить случайное число между, скажем, 1111111111 и 9999999999, необходимо использовать оператор:
    $OrderNo = rand(1111111111, 9999999999)
    В этом случае мы присвоили случайное число переменной с именем OrderNo, то есть, если посетитель решит что-нибудь купить, мы будем использовать это число в качестве номера заказа. Всегда существует вероятность, какой бы ни была она маленькой, что сгенерированное число совпадает с уже существующим номером заказа. Поэтому для безопасности это число необходимо сравнить с использованными ранее номерами заказов, прежде чем присваивать его посетителю.
    Использованные ранее номера заказов появятся в двух местах. Они будут храниться в таблице корзин покупателя посетителей, которые покупают в данный момент; и они будут храниться в таблице заказов, содержащей информацию о заказчиках предыдущих продаж. Эти таблицы пока не обсуждались, поэтому подождем, когда они будут рассмотрены, и затем вернемся к повторяющимся номерам заказов.
    Итак, где же поместить процедуру генератор OrderNo? Возможно на начальной странице (home.php) сайта, так как мы хотим начинать отслеживать посетителей немедленно при их появлении. В таком случае можно ожидать, что можно будет отследить посетителей сайта, даже если они ничего не будут покупать. Мы здесь не будем это делать, но такая возможность существует.

    ID посетителя и номер заказа

    В предыдущем примере мы присваивали номера заказов посетителям как способ уникальной идентификации посетителей, и, в конечном счете, для уникальной идентификации их заказов. Мы отчасти предполагаем, что все посетители станут заказчиками. Это не является проблемой, если мы собираемся использовать случайные числа в обоих случаях. Однако компания может иметь более систематический способ присваивания номеров заказов. Номера заказов могут, например, выбираться из последовательности предварительно определенных номеров. В этом случае присвоенный заранее номер заказа для посетителя, который не стал покупателем, оставляет пробел в последовательности номеров заказов.
    В такой ситуации необходимо присваивать сначала случайное число в качестве "номера посетителя", чтобы отслеживать перемещения этого человека по сайту, а затем присвоить окончательный "номер заказа", когда будет принято решение о покупке. Из того, что можно увидеть в Web, можно заключить, что номера заказов не имеют очевидной логики, и поэтому можно использовать один и тот же номер для отслеживания посетителей и для идентификации их заказов.

    Идентификатор (ID) сеанса

    PHP отслеживает посетителя с помощью уникального идентификатора, который присваивается ему при создании сеанса. Это уникальное значение хранится в свойстве сеанса session_id() объекта сеанса. К этому значению можно обратиться после запуска нового сеанса:

    Функция session_id() автоматически генерирует id сеанса. Если желательно создать свой собственный случайный id, можно использовать функцию rand() для генерации значения, а затем сохранить его в переменной сеанса:

    Возвращаясь к вопросу присваивания уникальных значений OrderNo для новых посетителей сайта и вопросу отслеживания этого номера при перемещении со страницу на страницу, мы можем с помощью переменной сеанса легко реализовать эти вещи. Делается это так: когда посетитель впервые появляется на сайте, мы присваиваем session_id() (или случайным образом созданный ID) как OrderNo, и, чтобы сделать этот номер доступным всем страницам, мы сохраняем его в $_SESSION[], где он будет оставаться еще 20 минут после ухода посетителя с сайта. Конечно, когда посетитель решает стать заказчиком и оформляет покупку, мы просто "разрушим" этот сеанс с помощью session_destroy(), чтобы создать новый сеанс с другим номером заказа.

    Именование полей количества

    Раздел страницы заключен в теги
    , так как заказчику дается возможность изменить заказанное количество товара и заново послать форму, чтобы обновить это количество. Для этого необходимо поместить $OrderQuantity для каждого покупаемого объекта в поле формы, как это делается с помощью кода:

    Ключом к тому, чтобы эта форма правильно работала, является соглашение об именах, используемых для этого поля. Обратим внимание, что этому текстовому полю присваивается имя "Q", то есть буква "Q" (которая выбрана просто произвольно), — за ней следует код ($OrderItem) продукта, значение $OrderQuantity которого выводится в этом поле. Если взять в качестве примера корзину покупателя, показанную выше, то именем поля количества первого товара будет "QBU1111", а именем поля для второго товара будет "QOS1111".
    Для использования такого способа именования имеются две причины. Прежде всего, мы не знаем, сколько различных полей количества появится в форме. В ней будет столько полей, сколько будет купленных продуктов. Поэтому в отличие от предыдущего опыта с формами, мы не можем заранее определить и назвать эти поля. Во-вторых, мы не можем использовать одно имя для всех полей. Если, например, мы бы назвали поле просто "Quantity", то было бы столько полей Quantity, сколько было бы купленных продуктов. Это могло бы создать реальные, непреодолимые проблемы при попытке определить, какое поле quantity связано с каким продуктом. Поэтому требуется соглашение об именах, которое, первое, позволяет определить по мере необходимости неопределенное число полей количества, и, второе, уникальным образом определяет продукт, связанный с количеством, представленным в этом поле. Текущее соглашение об именах решает обе проблемы достаточно хорошо. Символ "Q" испол ьзуется для идентификации поля количества (важный идентификатор, который будет использоваться ниже), а добавленное OrderItem предоставляет уникальное имя, которое идентифицирует также продукт, связанный с указанным в поле количеством. Мы обсудим ниже, как сценарий сортирует эту информацию для обновления полей количества измененными значениями.

    Использование файлов INCLUDE

    Разделы Header и Menu не кодируются непосредственно на всех страницах. Используемый код содержится в документах header.inc и menu.inc, которые импортируются (включаются) на все страницы, когда к ним обращается браузер.
    Код, содержащийся во внешних документах, копируется или включается на страницу PHP с помощью одного из следующих операторов:
    require('FileName') include('FileName')
    Оба оператора выполняют одно и то же действие, однако оператор require() возвращает неисправимую ошибку при неудаче, в то время как оператор include() возвращает только предупреждение.
    В обеих конструкциях FileName является именем файла, содержащим код, который копируется в это место документа. Включаемые файлы могут содержать код XHTML, код PHP, код JavaScript, спецификации таблиц стилей или обычный текст.
    При использовании такой техники нет необходимости дублировать общий код на каждой странице. Код можно поместить в отдельный файл, а затем копировать на страницы по мере необходимости.
    Эта техника работает только для страниц .php (а не страниц .htm). Возможно, имеет смысл задавать имена всех страниц с расширением .php, независимо от того, содержат ли они сценарий или нет.

    Использование оператора SQL UPDATE

    Использованный выше оператор SQL UPDATE имеют следующую общую форму:
    UPDATE TableName SET FieldName1 = expression1 [,FieldName2 = expression2] ...
    где TableName является именем таблицы, а FieldName указывает на поле таблицы, в которой происходит обновление. Выражения (expression1,...) могут быть одиночными значениями или арифметическими выражениями, создающими значение. Предложение WHERE можно добавлять к этому оператору для ограничения обновлений только определенными записями, соответствующими заданному критерию.

    Использование сеансов

    В PHP посетители сайта Web создают "сеансы". Сеанс создается автоматически, когда посетитель впервые появляется на любой странице сайта. Сеанс автоматически завершается, если посетитель не осуществляет обращение к странице в течение 20-минутного интервала времени. Поэтому сеанс начинается, когда посетитель прибывает, и заканчивается через 20 минут после того, как посетитель покидает сайт. Этот 20-минутный интервал времени позволяет также посетителю покидать сайт и возвращаться позже, не становясь новым посетителем. (Между прочим, 20-минутный интервал времени можно увеличить, если понадобится. Мы этого делать не будем.)
    С сеансом посетителя связан ассоциативный массив $_SESSION[]. Можно считать $_SESSION[] глобальной областью хранения, где поддерживается относящаяся к посетителю информация. Все посетители сайта имеют свой собственный индивидуальный объект сеанса (Session) для отслеживания индивидуальной активности. Как можно было бы предположить, объект сеанса посетителя может быть хорошим механизмом для отслеживания заказов покупателя, когда человек перемещается со страницы на страницу, уходит на другой сайт и возвращается. Если такое значение, как OrderNo, поместить в объект сеанса посетителя, когда он впервые приходит на сайт, то это значение будет доступно на любой странице, нет необходимости тащить это значение со страницы на страницу с помощью строки запроса.

    Использование таблиц стилей

    Как отмечалось выше, таблицы стилей интенсивно используются для управления форматированием страниц. Для этой цели для сайта подготовлен внешний документ stylesheetEC.css и сохранен как стандартный текстовый документ. Каждая страница сайта применяет стили, соединяясь с этим документом с помощью тега раздела :
    Page Title
    Общая таблица стилей, используемая сайтом eCommerce, показана ниже, а остальные стили оформления применяются индивидуально к элементам страницы по мере необходимости.
    Пример I.2.
    (html, txt)

    Итерации по массиву $_REQUEST[]

    Может быть полезно использовать пример с отправленными значениями для визуализации массива Request.Form. Предположим, что корзина покупателя содержит объекты, показанные на иллюстрации выше, тогда при нажатии кнопки "Update" будет создан следующий массив Request.Form.
    Массив $_REQUEST[]Имя Значение
    QOS1111 2
    UpdateButton Update
    QBU1111 1

    Здесь необходимо отметить один принципиальный момент, а именно, что элементы массива не обязательно находятся в том же порядке, в котором они появляются в форме; кроме того, нажатая кнопка также является частью массива. Рассмотрим теперь итерации по элементам с помощью цикла foreach, в котором переменная $key указывает имя, а $value указывает значение:
    foreach($_REQUEST as $key => $value) {
    $key = "QOS1111" $value = "2" $key = "UpdateButton" $value = "Update" $key = "QBU1111" $value = "1" }
    Здесь можно видеть элементы данных, с которыми должен иметь дело сценарий, и можно лучше понять действие сценария по извлечению кода продуктов и обработке количества продуктов.

    Итерации по отправленной форме

    Когда пользователь изменяет значение количества одного или нескольких продуктов и щелкает на кнопке "Update" для отправки формы, то информация снова передается на страницу shopcart.php. Страница shopcart.php содержит сценарий для обновления этих изменений в таблице ShopCart. Этот сценарий находится в начале страницы для перехвата изменений, когда посылается форма.
    Назначение этого сценария состоит в обновлении таблицы ShopCart значениями количества продуктов, переданных из формы. Мы знаем, что имеется неопределенное число полей количества, имя каждого из которых начинается с буквы "Q", и мы знаем, что значения формы, приходящие на страницу, могут быть в любом порядке.
    До сих пор мы всегда знали имена и номера полей на формах. Это связано с тем, что мы проектировали формы, именовали поля и определяли, сколько будет полей. Но здесь это не так. Мы не знаем, сколько имеется полей (это зависит от того, сколько объектов имеется в корзине покупателя), и мы не знаем их имен (за исключением того, что они начинаются с буквы "Q"). Поэтому мы не можем выполнить обработку формы, как это делалось ранее.
    Однако с помощью PHP можно решить эту проблему. Можно выполнить итерации по всем элементам $_REQUEST, чтобы определить имена отправленных полей и соответствующие значения. Это реализуется с помощью специального оператора цикла For Each...Next, общая структура которого применительно к формам имеет следующий вид:
    foreach($_REQUEST as $key => $value)
    где $_REQUEST является ассоциативным массивом, содержащим все пары имя/значение для элементов управления формы на странице. Этот цикл выполняется для каждой пары имя/значение, присланной из формы. На каждой итерации переменная $key содержит имя из пары имя/значение, а $value указывает на значение, связанное с этим именем. Массив имеет следующий формат $_REQUEST[$key] = $value для каждой пары имя/значение, связанной с формой.
    Затем можно использовать эту итерационную структуру для просмотра присланных позиций для обновления корзины покупателя и определения имен полей и значений. Когда встречается поле с именем, начинающимся с буквы "Q", то мы знаем, что это поле количества, содержащее значение для обновления таблицы ShopCart. Мы можем также определить из названия продукт, для которого задано значение количества.

    Извлечение объектов корзины покупателя

    Объекты в корзине покупателя заказчика соответствуют номеру заказа и извлекаются с помощью следующей команды SQL:
    $sql="SELECT OrderItem, OrderQuantity FROM ShopCart WHERE OrderNo = '$_SESSION[OrderNo]'";
    Получаемое множество записей $rsCart содержит для каждой записи два выбранных поля OrderItem и OrderQuantity. Эти поля присваиваются переменным. Два других поля в записях (OrderNo и OrderDate) не требуются для нашей цели. Теперь необходимо выполнить итерации по записям и создать таблицу строк с выбранными объектами.
    Однако мы еще не получили всю информацию, которая выводится в строке. Кроме OrderItem и OrderQuantity, содержащихся в корзине покупателя, таблица выводит название товара и его цену. Эти значения находятся в таблице Products. Поэтому эти поля ItemTitle и ItemPrice извлекают для соответствующего продукта, создавая множество записей $rsProd и выполняя оператор SQL.
    $sqlProd = "SELECT ItemTitle, ItemPrice FROM Products WHERE ItemNumber = '$OrderItem'";
    Эти значения также присваиваются переменным.
    Для каждой выводимой строки объекта выводится также объем покупки. Переменная $OrderAmount вычисляется умножением заказанного количества ($OrderQuantity) на цену продукта ($OrderPrice). Также, когда сценарий выполняет итерации по записям корзины покупателя, значение $OrderTotal накапливается путем сложения по очереди всех $ItemAmount. Отметим, что переменная OrderTotal инициализируется как 0 перед началом цикла вывода.
    Теперь собрана вся информация, необходимая для вывода строки таблицы:
    echo " $OrderItem $OrderTitle $$OrderPrice $$OrderAmount ";
    Мы выводим значения переменных, содержащих извлеченные из таблиц ShopCart и Products данные и вычисленный объем. В случае объектов $OrderPrice и $OrderAmount используется функция PHP number_format(), чтобы вывести значения в формате с двумя десятичными позициями после запятой. Теперь надо объяснить, что происходит с полем OrderQuantity.

    Кнопки форматирования

    Используемая на этой форме кнопка отправки отличается от используемых обычно кнопок. Она имеет другой размер и цвет и изменяет цвет, когда указатель мыши перемещается над ней.
    Кнопки форматирования

    Начальный вид кнопки задается спецификацией таблицы стилей. Определяется класс таблицы стилей для задания ширины кнопки, выравнивания текста, типа и размера шрифта, цвета фона и цвета текста:
    .buttonS { width:35px; text-align:center; font-family:arial; font-size:9pt; background-color:seagreen; color:white; }
    Эти настройки применяют, задавая атрибут CLASS, которому присваивается имя этого класса в теге кнопки:

    Изменения в спецификациях стиля оформления происходят, когда указатель мыши перемещается над кнопкой и когда он смещается с кнопки. Эти изменения активируются операторами JavaScript, кодируемыми в теге кнопки:

    События onMouseOver и onMouseOut активируют вызовы функций OverMouse() и OutMouse(), соответственно, передавая ссылку self на объект (эту кнопку), содержащий эти обработчики событий. Эти функции затем получают ссылку на эту кнопку отправки для применения сценария.
    Кодирование сценария в функциях имеет две задачи. Первое: сценарии содержат несколько операторов, что делает их неудобными для кодирования внутри отдельных кнопок. Второе: функции можно вызывать из любых кнопок, на которые нужно оказать воздействие. Это означает, что функции должны быть доступны на всех страницах, чтобы можно было применить любую кнопку на этих страницах.
    Как было сделано для заголовка и меню, которые присутствуют на всех страницах, код JavaScript для активации кнопок находится во включаемом файле, который можно импортировать на любую страницу. Обычный метод импортирования кода JavaScript состоит во включении его в раздел страницы, чтобы процедуры загружались и были доступны для активации до загрузки раздела . Поэтому все страницы сайта eCommerce включают директиву
    require(jscript.inc)
    в своих разделах . Код файла jscript.inc показан ниже:
    jscript.inc
    Вспомните, что обе функции получают ссылку на нажатую кнопку. Эта ссылка будет получена как переменная button, поэтому любая ссылка на button (кнопка) является ссылкой на реальную кнопку, которая в данный момент находится под курсором мыши или с которой курсор мыши был только что смещен. Две функции просто задают различные стили для кнопки в зависимости от того, какое действие совершил пользователь.

    Кодирование документов INCLUDE

    Документы, включаемые на страницу, являются простыми текстовыми документами, содержащими вставляемый код. Имя файла и расширение этого документа могут быть произвольными. Расширение ".inc" используется здесь для идентификации документов header.inc и menu.inc как файлов, которые вставляются на страницу. Такие имена, как header.txt и menu.txt или header.php и menu.php, также будут работать. Мы рассмотрим кодирование этих документов немного позже. Существует еще один включаемый файл с именем jscript.inc, который копируется в раздел каждой страницы. Этот документ содержит код JavaScript для управления поведением кнопок. Мы рассмотрим этот код при обсуждении отдельных страниц.
    Когда общая компоновка создана, остается побеспокоиться только о реальном "содержимом" отдельных страниц. Все остальное будет делаться автоматически с помощью файлов INCLUDE.

    Кодирование файлов INCLUDE

    Все страницы сайта eCommerce имеют одинаковый общий формат и содержат одинаковую информацию, за исключением специфической информации страницы. Это сходство достигается с помощью трех файлов INCLUDE, которые копируются на все страницы. Здесь мы рассмотрим эти файлы.

    Обновление корзины покупателя

    Ниже показан весь сценарий обновления корзины покупателя, когда заказчик щелкает на кнопке формы "Update".
    Пример I.14.
    (html, txt)
    Прежде всего, создается соединение с базой данных eCommerce.mdb. Объект множества записей (Recordset) здесь не требуется, так как обновления делаются непосредственно командами SQL, выполняемыми с помощью объекта соединения (Connection).
    Затем применяется цикл foreach для итераций по именам и значениям, помещенным в массив $_REQUEST[] после отправки формы на сервер. Переменная с именем $key используется для ссылки на имена полей, находящиеся в массиве.
    При просмотре элементов массива выполняется проверка того, что имя поля начинается с буквы "Q":
    if (strpos($key,"Q") === 0 ) { }
    Функция PHPstrpos() применяется для проверки, что первый символ (или символ в позиции 0) имени элемента управления формы совпадает с "Q". Если первый символ "Q", то это будет поле количества, содержащее значение для обновления корзины покупателя. Здесь важно отметить, что используется оператор сравнения PHP "===" ("идентично"), а не оператор сравнения "==" ("равно"). Это необходимо, потому что функция strpos() требует для проверки своих возвращаемых значений "===".
    Затем сценарий определяет, какую надо обновить запись о продукте и каким является фактическое значение количества:
    $OrderItem = substr($key,1); $OrderQuantity = $value;
    Мы знаем, что код продукта, связанный с полем количества, содержится в переменной $key. Фактически это будут шесть правых символов имени поля. Поэтому эти шесть символов извлекаются из переменной с помощью функции PHP substr() и помещаются в переменную $OrderItem. Затем значение переменной $value, связанное с этим полем, присваивается переменной $OrderQuantity. Теперь у нас есть два фрагмента информации, необходимых для обновления поля $ItemQuantity этого продукта в таблице ShopCart.
    Прежде чем обновлять количество продукта, необходимо проверить, что заказчик ввел число. В поле можно случайно ввести недействительный символ. Поэтому для $OrderQuantity выполняется числовая проверка.

    if (is_numeric($OrderQuantity)) { }

    Если в поле находится что- то отличное от числа, то обновление количества для этого продукта пропускается и происходит обращение к следующему полю формы.

    Количества, присланные с помощью формы, могут представлять дополнительные купленные количества, или они могут иметь значение 0, указывающее, что товар удален из корзины покупателя. Это значение проверяется, и выполняется один из двух операторов SQL.

    if ($OrderQuantity == 0) { $sqlCartUpdate = "DELETE FROM ShopCart WHERE OrderNo=' $_SESSION[OrderNo]' AND OrderItem='$OrderItem'"; }

    else { $sqlCartUpdate = "UPDATE ShopCart SET OrderQuantity='$OrderQuantity' WHERE OrderNo='$_SESSION[OrderNo]' AND OrderItem='$OrderItem'"; }

    $rsCartUpdate = odbc_exec($sqlCartUpdate,$conn2);

    В случае удаления или обновления, действие применяется к записи ShopCart с полем OrderNo соответствующим текущему $_SESSION[OrderNo], и с полем $OrderItem соответствующим $OrderItem из отправленной формы. Оператор DELETE удаляет из таблицы всю запись; оператор UPDATE изменяет поле $OrderQuantity в таблице на значение $OrderQuantity из отправленной формы.

    Сценарий выполняет итерации по всем позициям, отправленным через форму, проверяя имя поля на наличие символа "Q". Если символ найден, то из имени извлекается код продукта и присваивается вместе со значением количества переменным, которые используются при обновлении таблицы ShopCart. После завершения обработки массива $_REQUEST[] соединение с базой данных закрывается и сценарий заканчивается.

    Обработка кредитных карт

    Когда заказчик направляется в компанию кредитных карт, первая представленная форма появляется в следующем виде:
    Обработка кредитных карт

    Заказчик заполняет информацию о кредитной карте и выставленном счете и щелкает на кнопке "Continue Purchase". Форма проверяется, чтобы убедиться, что имеется вся информация, и затем выводится страница подтверждения:
    Обработка кредитных карт

    Когда заказчик проверяет информацию, щелкая на кнопке "Verify Information", проверяется информация о кредитной карте. Используется следующая процедура: если первые четыре цифры номера счета (Account) будут "0000", то заказ отвергается, если первые четыре цифры будут любыми другими цифрами, то заказ принимается. После обработки заказчик видит экран с подтверждением или отказом:
    Обработка кредитных карт

    Когда заказчик щелкает на кнопке "Continue", делается обратная ссылка на страницу, определенную в отправляемой форме как ReturnURL. Эта страница, в примере ordercapture.php, получает информацию о заказе и выставленном счете, которая была получена от заказчика. Ее получение и обработка обсуждаются далее.

    Общая структура страниц

    Здесь представлена общая модель компоновки всех страниц сайта Web eCommerce. Разделы Content (Содержимое) страниц будут различаться в зависимости от функции страницы. Однако разделы Header (Заголовок) и Menu (Меню) одинаковы для всех страниц. Они создают общий внешний вид страниц, плюс раздел Menu предоставляет общее меню ссылок для перемещения и другие функции, которые доступны на всех страницах.
    Этот сайт использует свойства каскадных таблиц стилей (CSS) для форматирования страниц и управления их представлением. Здесь будут даны некоторые общие рекомендации без излишних подробностей. Существует много специальных руководств по CSS, где можно найти дополнительную информацию об их применении.
    Код XHTML, задающий структуру всех страниц, имеет следующий вид:
    Пример I.1.
    (html, txt)
    Теги
    используются для создания общей компоновки страницы и применяют спецификации таблиц стилей для точного размещения разделов на странице. Имеется три отдельных раздела, содержащие заголовок, меню и контент, которые будут выводиться на странице. Такая компоновка соблюдается для всех страниц сайта, единственное различие будет в разделе, содержащем основной контент этой страницы.

    Обслуживание корзины покупателя

    Страница shopcart.php предоставляет заказчику доступ к объектам корзины покупателя. Она суммирует его покупки, позволяет изменить заказанное количество и является переходом к оформлению заказа. При программировании этой страницы существуют некоторые сложности, поэтому будьте внимательны.
    Обслуживание корзины покупателя

    Очистка корзины покупателя

    Конечная часть сценария очищает корзину покупок от купленных товаров. Эти записи идентифицируются наличием OrderNo, соответствующим OrderNo подтвержденного или отвергнутого заказа.
    '—Очистка ShopCart $sqlDelete = "DELETE FROM ShopCart WHERE OrderNo='$OrderNo'"; $rsDelete = odbc_exec($conn,$sqlDelete);
    header("Location:salesorder.php?Approval=$Approval")
    Когда эта "фоновая" обработка завершается (вспомните, что на этой странице нет кода XHTML), происходит немедленная переадресация на страницу salesorder.php. Подтверждающее уведомление также передается на эту страницу для управления обработкой, которая там происходит.

    Определение критериев продукта

    Кроме выбора категорий продуктов для поиска названия программного продукта, посетители сайта eCommerce могут использовать общий поиск по ключевым словам.
    Определение критериев продукта

    Посетители могут ввести слово или фразу в текстовое поле, и процедура поиска найдет все записи в таблице Product, которые содержат эту текстовую строку. Файл menu.inc поэтому содержит код для представления этого текстового поля ввода и для передачи введенного текста на страницу search.php, где происходит реальный поиск подходящих продуктов.
    Текстовое поле ввода кодируется в форме, находящейся в файле menu.inc. Форма выводит текстовое поле вместе с кнопкой для отправки информации формы на страницу search.php.
    Search for:


    Отправка информации о заказе

    Страница shopcart.php содержит кнопку "Checkout" в отдельной форме, отличной от той, которая используется для обновления покупаемого количества товара. Это связано с тем, что форма оформления передается компании по обслуживанию кредитных карт, в то время как форма обновления снова соединяется со страницей shopcart.php.
    Пример I.15.
    (html, txt)
    Для целей этого примера ACTION URL формы будет
    ../php/ecommerce/creditcheck.php
    Этот адрес соединяется с модельной компанией обслуживания кредитных карт, которая является просто страницей в каталоге сайта. Но можно точно так же просто соединиться с реальной компанией.
    Обычный метод взаимодействия с компанией по обслуживанию кредитных карт состоит в передаче информации, связанной с текущей покупкой с помощью множества скрытых полей формы. Как минимум компании необходимо знать: 1) общую стоимость покупки, 2) идентификатор сайта, присылающего информацию (ID счета в компании по обслуживанию кредитных карт), и 3) URL страницы, на которую будет возвращено подтверждение о выполнении транзакции. Сайту продаж необходимо также отправить 4) идентификатор заказчика, который может возвращаться вместе с подтверждением. Эти четыре скрытых поля содержатся в форме с кнопкой "Checkout".
    Поле ReturnURL используется для предоставления адреса, в который возвращается информация компании кредитных карт. В данном примере информация возвращается на страницу ordercapture.php по адресу
    ../php/ecommerce/ordercapture.php
    Заказчик возвращается из компании кредитных карт на эту промежуточную страницу, прежде чем попасть на страницу salesorder.php, на которой представляется окончательный заказ на покупку и подтверждающее сообщение. На этой странице ordercapture.php мы получаем возвращаемую из компании кредитных карт информацию для создания записи о заказе на продажу и очистки корзины покупателя. Заказчик не видит эту страницу. Она содержит только сценарий PHP для обработки возвращаемой информации и затем автоматически переадресуется на страницу salesorder.php для вывода заказчику. Позже мы рассмотрим это подробнее.
    Поле CompanyID содержит идентификатор счета сайта, отправившего заказ. В качестве такого идентификатора мы применяем "Webwarehouse.com". При использовании этого URL для проверки кредитных карт можно ввести в это поле любую текстовую строку.
    Поле CustomerID содержит идентификатор заказчика. Это значение возвращается компанией кредитных карт, чтобы мы знали, какому заказчику или какому заказу соответствует возвращаемая информация. Здесь для идентификации заказчика используется значение $_SESSION[OrderNo].
    Поле Amount содержит общую стоимость заказа. Значение этого поля задается с помощью переменной OrderTotal, которая доступна на этой странице.
    После отправки формы остается только подождать. Компания кредитных карт выполняет в это время обработку. Когда компания завершит обработку, она автоматически создает адрес ReturnURL для возврата на страницу ordercapture.php, где продолжается обработка.

    ../php/ecommerce/ordercapture.php

    Заказчик возвращается из компании кредитных карт на эту промежуточную страницу, прежде чем попасть на страницу salesorder.php, на которой представляется окончательный заказ на покупку и подтверждающее сообщение. На этой странице ordercapture.php мы получаем возвращаемую из компании кредитных карт информацию для создания записи о заказе на продажу и очистки корзины покупателя. Заказчик не видит эту страницу. Она содержит только сценарий PHP для обработки возвращаемой информации и затем автоматически переадресуется на страницу salesorder.php для вывода заказчику. Позже мы рассмотрим это подробнее.

    Поле CompanyID содержит идентификатор счета сайта, отправившего заказ. В качестве такого идентификатора мы применяем "Webwarehouse.com". При использовании этого URL для проверки кредитных карт можно ввести в это поле любую текстовую строку.

    Поле CustomerID содержит идентификатор заказчика. Это значение возвращается компанией кредитных карт, чтобы мы знали, какому заказчику или какому заказу соответствует возвращаемая информация. Здесь для идентификации заказчика используется значение $_SESSION[OrderNo].

    Поле Amount содержит общую стоимость заказа. Значение этого поля задается с помощью переменной OrderTotal, которая доступна на этой странице.

    После отправки формы остается только подождать. Компания кредитных карт выполняет в это время обработку. Когда компания завершит обработку, она автоматически создает адрес ReturnURL для возврата на страницу ordercapture.php, где продолжается обработка.

    Отправка подтверждения по E-mail

    Обычно компании посылают подтверждение по e-mail заказов, когда они приняты к выполнению. С помощью сценария множено создавать автоматические сообщения e-mail, и такая возможность будет добавлена в приложение eCommerce. Следующая иллюстрация показывает формат подтверждающего сообщения, которое получит заказчик.
    Отправка подтверждения по E-mail

    Отслеживание заказчиков с помощью массива $_SESSION[]

    Итак, давайте применим все это для задачи присваивания уникального ID (переменной OrderNo) посетителю и отслеживания этого номера при перемещении посетителя со страницы на страницу.
    page1.php

    Значение id сеанса доступно теперь на последующих страницах для задач отслеживания и идентификации. К нему можно обратиться с помощью $_SESSION[OrderNo]. Следующий пример показывает, как это значение будет извлекаться и выводиться на второй странице:
    page2.php

    Может показаться, что такая техника будет единственно разумным способом поддержания состояния между различными страницами. Однако, существуют потенциальные проблемы. Например, если во время посещения заказчик будет неактивен в течение 20 минут, то PHP автоматически завершит сеанс, и не будет никакой возможности восстановить действия этого человека. Это может произойти, например, если заказчика приглашают к телефону, он отвлекается на другой сайт или просто уснул. Будет создан совершенно новый сеанс, когда он вернется, и мы вынуждены будем искать способ удалить все ожидающие объекты покупки, так как нет способа завершить предыдущие транзакции.
    Поэтому необходимо будет сопоставить преимущества использования сеансов с неудобством наличия брошенных сеансов. Тем не менее, разумно предположить, что большинство посетителей не будут создавать перерывы активности, превышающие 20 минут, и что простота программирования с помощью объекта сеанса превышает другие соображения. Как отмечено выше, всегда можно изменить 20-минутный интервал, если он покажется слишком коротким.

    Отслеживание заказчиков с помощью строки запроса

    Однако возникает небольшая проблема. Всякий раз, когда пользователь возвращается на домашнюю страницу, ему будет присваиваться новый номер заказа. В этом случае необходимо проверять, не существует ли уже номер заказа для этого посетителя, и не создавать новый номер, если он уже существует.
    Вспомните из предыдущего обсуждения, что для сохранения информации при переходе со страницы на страницу можно задействовать для передачи этой информации строки запроса. Мы ранее показывали, как использовать строку запроса для передачи информации поиска между страницами search.php и detail.php. То же самое можно делать со значением OrderNo. Можно передавать его как строку запроса со страницы на страницу, чтобы сохранить его и, для решения текущей проблемы, получить способ узнать, что номер заказа уже был создан.
    Каждой странице сайта необходимо будет получать строку запроса, содержащую OrderNo вместе с любой другой информацией, которая может передаваться на эту страницу. Так как страница home.php также будет получателем строки запроса с OrderNo (когда посетитель возвращается на домашнюю страницу с других страниц сайта), то можно проверять присутствие этой строки запроса, чтобы убедиться, что номер заказа уже был присвоен, и пропускать процедуру генерации номера заказа.
    Все эти объяснения сводятся к некоторому очень простому коду. Мы помещаем процедуру генерации случайного числа внутри условного оператора проверки значения строки запроса:
    if ($_GET[OrderNo]) == "") { $OrderNo = rand(1111111111,9999999999); } ?>
    Если домашняя страница получает строку запроса со значением OrderNo, равным null, то будет создан новый номер заказа. Это будет происходить при первом посещении домашней страницы, так как на сайт в начале не передается никакой строки запроса. Однако, если домашняя страница получает строку запроса с OrderNo, отличным от null (номер существует), то эта процедура пропускается. Это будет происходить при всех последующих возвращениях на домашнюю страницу с любой другой страницы сайта.
    Конечно, если посетитель покидает сайт и возвращается, будет создаваться новый номер заказа, так как внешний сайт не передает строку запроса с OrderNo. Такая ситуация вызывает серьезные проблемы при отслеживании заказов покупателя. Если человек уже поместил товары в свою корзину покупателя под одним номером, а затем покинул сайт и вернулся, то нет удобного способа узнать, что это тот же самый человек, добавляющий новые товары в свою корзину покупателя. Фактически первый вариант выбора товаров будет потерян.
    Можно обойти эту проблему, требуя от всех посетителей регистрации на сайте и присваивая им постоянный номер заказчика, который они используют во время всех посещений. Таким образом, номер заказчика будет всегда связан с одним и тем же человеком. Это неплохая идея, но требует более сложного программирования, чем то, что мы хотим здесь использовать. Для текущей задачи более удобным решение будет соединение номера заказа с объектом сеанса (Session).

    Отслеживание заказчиков

    Прежде чем следовать дальше, необходимо создать способ идентификации посетителей сайта и отслеживания их, когда они перемещаются со страницы на страницу. Когда посетители что-то покупают, они становятся заказчиками с покупками, и необходимо иметь возможность связать определенных заказчиков с определенными покупками. Мы рассмотрим два способа присваивания уникальных идентификаторов посетителям и два способа их отслеживания.

    Передача формы в виде строки запроса

    В этой форме необходимо обратить внимание, прежде всего, на атрибут method="get". До сих пор для передачи информации формы использовался метод POST. Этот метод передает пары имя/значение из формы на сервер как отдельный поток данных в URL запроса атрибута ACTION. В данном случае метод GET передает пары имя/значение как строку запроса, присоединенную к URL в параметре ACTION.
    Причина применения метода GET в этом приложении состоит в желании получить согласованность с предыдущими ссылками на категории объектов. Эти ссылки передают выбранную категорию продуктов на страницу search.php как строку запроса. Эта форма делает то же самое для поиска по ключевым словам. Когда посетитель вводит слово или фразу в текстовое поле и нажимает кнопку отправки, в форме создается URL
    search.php?Criterion=value
    и значение в текстовом поле соединяется с именем Criterion для передачи на сервер. Таким образом, когда страница search.php получает имя категории или ключевое слово, они будут получены в форме строки запроса, различаясь только именами и значениями:
    search.php?Category=value из ссылки search.php?Criterion=value из формы
    Отметим также, что текстовое поле имеет значение строки запроса Criterion, которая передается на сервер, когда посылается форма:
    Когда посылается эта форма, создается URL для страницы search.asp и в него добавляется строка запроса, содержащая введенное в это поле значение. Помните также, что файл menu.inc, частью которого является эта форма, появляется на всех страницах, включая страницу search.php. Поэтому, когда загружается страница serach.php, вместе с этой формой, содержащейся в файле menu.inc, текстовое поле отражает переданное на страницу значение Criterion. Поэтому значение присутствует в текстовом поле, хотя оно находится в другой форме на другой странице.

    Передача строк запроса

    Когда делается ссылка из категории продуктов (в действительности из строки таблицы) на страницу search.php, то принимающая страница должна знать, какая категория продуктов была выбрана, чтобы создать список подходящих продуктов этой категории. Эта информация передается на страницу search.php через строку запроса, присоединенную к URL ссылки. Для каждой категории в списке меню (для каждой строки таблицы), значением строки запроса будет то же самое значение ItemType, которое выводится в ячейке таблицы:
    onClick="location.href='search.php?Category=$row[ItemType]'"
    Когда происходит щелчок на строке таблицы, создается URL в виде
    search.php?Category=ItemType
    Все строки таблицы содержат различные типы объектов, и это конкретное значение ItemValue присоединяется к URL этой строки. Одна из пар имя/значение
    ?Category=Business Office ?Category=Database ?Category=Desktop Publishing ?Category=Graphics ?Category=Operating Systems ?Category=Web Development
    посылается на страницу search.asp, информируя эту страницу о разыскиваемом типе для выполнения поиска программных продуктов, попадающих в эту категорию.

    Подсчет посетителей

    Пока мы обсуждаем тему объекта сеанса, давайте рассмотрим процедуру, которая активно использует его возможности, – подсчет посетителей. Объект сеанса в действительности предопределяет "посетителя", поскольку поддерживает сеанс для каждого человека в течение 20 минут с момента последнего обращения посетителя к странице. Поэтому простое существование сеанса является доказательством присутствия посетителя. Итак, чтобы подсчитать посетителей, необходимо только добавлять 1 к счетчику посетителей, когда запускается сеанс.

    Поиск продуктов

    Страница search.php вызывается для выполнения поиска в таблице Products с помощью одного из двух методов. Поиск категории продукта находит все названия программных продуктов в этой категории на основе соответствующего значения ItemType в их записях. Поиск по ключевым словам находит все названия программных продуктов, содержащие ключевое слово в одном из своих полей. В обоих случаях создается список из полей ItemNumber, ItemTitle, и ItemPrice соответствующих записей о продуктах. Список продуктов соединяется также со страницей detail.php, где представлена вся информация о продукте.
    Поиск продуктов

    Покупка онлайн

    Когда заказчик завершил выбор программного обеспечения для покупки и готов оплатить продукты, он нажимает кнопку "Checkout" ("Оплатить"), чтобы завершить свою покупку.
    Покупка онлайн

    Обычно заказчики соединяются с онлайновой процессинговой компанией кредитных карт, которая получает информацию о кредитной карте, санкционирует покупку и соединяется с национальной банковской системой, чтобы дебетовать и кредитовать соответствующие банковские счета. Когда эти транзакции завершаются, заказчик возвращается на сайт магазина, где получает подтверждение своего заказа.
    В то же самое время компания по обслуживанию кредитных карт возвращает на сайт полученную от заказчика несекретную информацию, имеющую отношение к выставлению счета. Эта информация затем может использоваться для создания постоянной записи заказа для этого клиента для будущих ссылок и для воссоздания исходного заказа, если потребуется. Возвращаемая информация может, на самом деле, применяться для соединения с системами бухгалтерского учета и склада компании. Хотя мы не можем соединиться с федеральной банковской системой для этого модельного приложения, мы можем достаточно точно промоделировать обработку в компании по обслуживанию кредитных карт и можем архивировать информацию о заказе, даже хотя и не будем соединяться непосредственно с какими-либо другими системами.

    Получение информации заказа

    Первая часть сценария на странице ordercapture.php собирает информацию, посланную из компании кредитных карт через массив $_POST[] и присваивает ее переменным для упрощения записи кода.
    Компания кредитных карт посылает флаг Approval, задаваемый как "True" или "False" в зависимости от того, был подтвержден заказ или нет. Если заказ подтвержден, необходимо сохранить информацию о заказе в таблицах OrderHeader и OrderDetail; если заказ не был подтвержден, то информация не сохраняется, так как продажа не была сделана. В любом случае, однако, необходимо очистить корзину покупателя этого заказа. Не существует пока никаких ожидающих заказов.
    Общая логика сценария для обработки этих задач обработки показана ниже.
    if ($Approval) {
    '—Создать запись OrderHeader
    '—Создать запись OrderDetail
    }
    '—Создать таблицу ShopCart

    Получение строк запросов

    Когда загружается страница search.php она получает строку запроса со страницы, на которой был сделан запрос поиска категории или поиска по критерию. Возможны два вида строк запроса:
    ?Category=CategoryName ?Criterion=KeywordValue
    Одной из первых задач на этой странице поэтому является получение этого значения из массива строки запроса Request.QueryString, который создается, когда пара имя/значение попадает на сервер. Обычно в массиве доступно одно из двух значений. Однако в одном случае нет ни одного значения. Это происходит, когда форма поиска отправляется с пустым полем критерия поиска. В этом случае нет имени категории или значения ключевого слова на этой странице. Все эти ситуации учитываются в следующем сценарии, который появляется в верхней части страницы search.php.
    if ($Category == "" && $Criterion == "") { header("Location:home.php"); }
    ?>
    Значения строки запроса присваиваются переменным Category (Категория) и Criterion (Критерий). Отметим также, что если оба эти значения будут null, в соответствии с описанной выше ситуацией, то посетитель немедленно перенаправляется на страницу home.php. В этом случае нечего искать.

    Программирование поиска категории

    Для продукта соответствующего значению Category, переданного на эту страницу, подходящие записи представляют в таблице. Из подходящих записей выводятся три поля: ItemNumber, ItemTitle, и ItemPrice. Код начинается с вывода заголовка таблицы и заголовков столбцов над значениями таблицы. На следующем листинге значение переменной Category выводится в заголовке, чтобы помочь идентифицировать результаты поиска.
    if ($Category != "") { Поискрезультатов для категории :


    Вслед за этим на странице выводятся результаты поиска. Каждая запись таблицы Product, которая имеет значение ItemType, совпадающее со значением переменной Category, выбирается для вывода полей ItemNumber, ItemTitle, и ItemPrice. Каждая запись продукта появляется в отдельной строке таблицы вывода. Реализующий это код показан ниже.
    Пример I.7.
    (html, txt)
    Сценарий начинается с соединения с базой данных eCommerce.mdb и создания объекта множества записей с именем RSCategory для извлечения подходящих записей из таблицы Products. Выбираются записи, в которых значение ItemType совпадает со значением переменной Category, содержащей значение строки запроса:
    SQL="SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE ItemType= '$Category' ORDER BY ItemNumber"
    Сценарий выполняет итерации на множестве выбранных записей, выводя каждую по очереди в строке таблицы. Значения множества записей присваиваются переменным, чтобы упростить с ними работу.
    $ItemNumber = $row[ItemNumber] $ItemTitle = $row[ItemTitle] $ItemPrice = number_format($row[ItemPrice],2) ...
    Отметим, что для переменной $ItemPrice перед присваиванием была использована функция PHP number_format, чтобы вывод был представлен в долларах и центах. Значение также выравнивается вправо в ячейке таблицы.

    }

    odbc_close($conn);

    ?>
    Item Number Item Title Item Price
    echo $ItemNumber echo $ItemTitle $echo $ItemPrice

    }

    ?>

    Пример I.7.

    Сценарий начинается с соединения с базой данных eCommerce.mdb и создания объекта множества записей с именем RSCategory для извлечения подходящих записей из таблицы Products. Выбираются записи, в которых значение ItemType совпадает со значением переменной Category, содержащей значение строки запроса:

    SQL="SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE ItemType= '$Category' ORDER BY ItemNumber"

    Сценарий выполняет итерации на множестве выбранных записей, выводя каждую по очереди в строке таблицы. Значения множества записей присваиваются переменным, чтобы упростить с ними работу.

    $ItemNumber = $row[ItemNumber] $ItemTitle = $row[ItemTitle] $ItemPrice = number_format($row[ItemPrice],2) ... echo $ItemNumber echo $ItemTitle $echo $ItemPrice

    Отметим, что для переменной $ItemPrice перед присваиванием была использована функция PHP number_format, чтобы вывод был представлен в долларах и центах. Значение также выравнивается вправо в ячейке таблицы.

    Программирование поиска по ключевым словам

    Поиск по ключевым словам действует почти таким же образом, как и поиск по категории. Основное различие состоит в способе извлечения записей о продуктах из таблицы Products. Первая часть сценария будет идентичной, за исключением вывода значения Criterion, переданного в строке запроса, а не значения Category.
    <% If Criterion <> "" Then %> Searchresults for criterion echo $Criterion:


    Следующий листинг кода показывает процедуру поиска всех продуктов, содержащих значение в одном из своих полей, которое совпадает со значением Criterion, переданным на страницу из меню поиска.
    Пример I.8.
    (html, txt)
    Как можно видеть, единственное реальное различие в двух сценариях состоит в том, что поиск по ключевым словам использует более сложную команду SQL SELECT для поиска подходящих продуктов:
    $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 ItemTitle LIKE '%" . $Criterion . "%'"; $sql = $sql . " OR ItemDescription LIKE '%" . $Criterion . "%'"; $sql = $sql . " ORDER BY ItemNumber";
    Так как получается очень длинный оператор SELECT, то он составлен из отдельных частей. Каждая последующая часть строки поиска присоединяется в конце предшествующей строки для создания всего оператора SELECT в переменной $sql.
    Как и раньше, извлекаются только поля ItemNumber, ItemTitle, и ItemPrice. Сам поиск совпадения со значением Criterion происходит по пяти полям записей. Строка критерия может присутствовать в любом месте поля, так как для поиска используется оператор LIKE.
    Поэтому если происходит совпадение с частью содержимого полей ItemNumber, ItemType, ItemProducer, ItemTitle, или ItemDescription, то эта запись выбирается.
    После извлечения множества записей отдельные поля выводятся как строки таблицы, точно так же, как для поиска по категории. Из этих строк также сделаны ссылки, чтобы передать URL на страницу detail.php, добавляя строку запроса — она содержит ItemNumber вместе со значением Criterion, использование которого будет рассмотрено при обсуждении страницы detail.php.
    Давайте теперь посмотрим на законченную страницу search.php.
    Пример I.9.
    (html, txt)

    { header("Location:home.php");

    }

    ?>

    Сайт eCommerce


    ?>

















    Поискрезультатов для категории :

    Item Number Item Title Item Price



    $conn = odbc_connect ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');

    //Формирование оператора SQL SELECT

    $sql = "SELECT ItemNumber,ItemTitle, ItemPrice FROM Products WHERE ItemType = '$Category' 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 "";


    }

    odbc_close($conn);

    ?>

    Item Number Item Title Item Price
    $ItemNumber $ItemTitle $$ItemPrice



    }

    if ($Criterion != "")

    { ?>

    Поискрезультатов для критерия :




    $conn = odbc_connect ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');

    $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 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 "";

    }

    odbc_close($conn);

    ?>

    Item Number Item Title Item Price
    $ItemNumber $ItemTitle $$ItemPrice



    }

    ?>





    Пример I.9.

    Программирование сообщения E-mail

    Начнем теперь программирование сценария, который вставляется на страницу. Необходимо сделать так, чтобы поле e-mail было не обязательным на форме проверки кредитной карты. Некоторые заказчики могут не предоставлять адрес e-mail, и мы не сможем послать им подтверждающее сообщение. Поэтому весь сценарий находится внутри условного оператора.
    if ($Email) {Then
    '—Послать подтверждение заказа по e-mail $to = $Email $subject = "Order $OrderNo Confirmation"
    Прежде всего, необходимо инициализировать параметры mail() — $to и $subject. Параметру $to присваивается один из элементов информации, посланной из компании кредитных карт и полученной в начале этой страницы. Переменная содержит адрес e-mail заказчика. Это должен быть реальный, действительный адрес e-mail.
    Присваивание $subject использует текстовую строку, которая включает для идентификации значение переменной $OrderNo.
    Теперь необходимо составить тело сообщения, форматируя его с помощью HTML для создания общей компоновки и внешнего вида. Вспомните из сказанного ранее, что тело должно быть одной строкой текста. Поэтому нельзя написать последовательность отдельных строк HTML и присвоить их параметру $message. Необходимо представить их в виде одной строки. Мы делаем это, задавая переменную $message, а затем помещаем в нее одну длинную строку, собирая ее из отдельных подстрок. Такой подход можно видеть в следующем фрагменте кода.
    Пример I.19.
    (html, txt)
    Каждая подстрока текста соединяется с переменной $message, создавая постепенно в переменной одну текстовую строку. Эта строка содержит также теги XHTML для форматирования вложенного текста. Отметим, что переменные $Date, $OrderNo, $Name, $Address, $City, $State, и $Zip, полученные из информации кредитной компанией, встраиваются в увеличивающуюся строку. Конечная часть кода создает заголовки таблицы для информации заказа на продажу, которая форматируется далее.
    Затем необходимо собрать информацию заказа на продажу из таблицы OrderDetail и сформатировать ее как строки таблицы.
    $sqlMail = "SELECT * From OrderDetail WHERE OrderNo = '$OrderNo'"; $rsMail = odbc_exec($conn,$sqlMail);

    while ($row = odbc_fetch_array($rsMail))

    {

    $ItemNumber =$row[ItemNumber]; $ItemTitle =$row[ItemTitle]; $ItemQuantity = $row[ItemQuantity]; $ItemPrice = $row[ItemPrice]; $ItemAmount = $ItemQuantity * $ItemPrice; $OrderTotal = $OrderTotal + $ItemAmount; $message = $message . ""; $message = $message ." " . $ItemNumber . ""; $message = $message . " " . $ItemTitle . ""; $message = $message . " ". $ItemQuantity . ""; $message = $message . " " . number_format($ItemPrice,2) . ""; $message = $message . " " . number_format($ItemAmount,2) . ""; $message = $message . ""

    }

    Это делается здесь в цикле while: значения полей помещаются в переменные, которые форматируются в ячейки таблицы и соединяются со строкой $message. По мере выполнения цикла накапливается значение переменной $OrderTotal.

    $ShippingCharge = $OrderTotal * .02; $OrderTotal = $OrderTotal + $ShippingCharge; $message = $message . ""; $message = $message . "Shipping"; $message = $message . " " . number_format($ShippingCharge,2) . ""; $message = $message . ""; $message = $message . ""; $message = $message . "Order Total"; $message = $message . "" . number_format($OrderTotal,2) . ""; $message = $message . ""; $message = $message . ""; $message = $message . ""; $message = $message . "";

    $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: PHP/' . phpversion();


    mail($to, $subject, $message, $headers);

    После того как сценарий выполнил итерации на множестве записей, форматируя отдельные строки таблицы для купленных продуктов, вычисляется и форматируется $ShippingCharge, вместе с $OrderTotal, как две последние строки таблицы. Закрывающие теги HTML присоединяются в конце строки $message, и сообщение e-mail завершается.

    После завершения формирования сообщения e-mail мы создаем переменную $headers для хранения заголовочных данных, которые нужны для описания сообщения. В данном случае мы добавляем заголовочные сообщения From (указывает адрес e-mail, откуда было прислано сообщение), Reply-To (адрес e-mail, который появится в поле TO получателя, если он будет отвечать на автоматическое сообщение), Content-Type (определяет формат сообщения) и X-Mailer (определяет версию PHP, используемую для генерации сообщения). Хотя заголовочные сообщения являются необязательными, рекомендуется всегда их включать.

    Если сообщение e-mail содержит HTML, который должен интерпретироваться соответствующим образом, то необходимо использовать следующее значение заголовка.

    'Content-Type:text/html;charset=us-ascii'

    Последний шаг состоит в вызове встроенной функции mail().

    Необходимо упомянуть попутно, что прежде чем можно будет послать сообщение e-mail через сценарий PHP, сервер Web должен иметь выполняющуюся службу SMTP (Простой протокол пересылки почты), и может понадобиться внести изменения в файл PHP.ini. Особенности настроек различных серверов можно найти на сайте PHP.

    Размещение сценария

    Лучшим местом для сценария подтверждения заказа по email является страница ordercapture.php. Эта страница получает информацию от компании кредитных карт и создает для заказчика записи OrderHeader и OrderDetail, а также содержит всю информацию, необходимую для составления сообщения e-mail. Размещение сценария показано на следующем эскизе страницы:
    Пример I.18.
    (html, txt)

    Сайт e-Commerce

    В данном разделе последовательно рассматривается процесс разработки коммерческого сайта Web. В качестве примера используется база данных товаров eCommerce.mdb. Товары будут предложены для онлайн торговли. С помощью этого примера будут рассмотрены все основные вопросы разработки онлайн магазина. Следующая иллюстрация представляет страницы и механизмы связей, которые составляют типичный сайт е-коммерции. Основные части этой системы описаны ниже.
    Сайт e-Commerce
    увеличить изображение

    Сброс номера заказа

    Теперь важная часть этой обработки. Заказ клиента завершен. Поэтому необходимо присвоить новое значение OrderNo на тот случай, если заказчик захочет продолжить покупку. Если он сделает это без нового номера, то в результате получится дублирование номера заказа и возникнет путаница при попытке разделить заказы клиента. Конечный шаг обработки на этой странице состоит тогда в присваивании нового номера с помощью той же процедуры, которая использовалась, когда клиент впервые прибыл на сайт.


    Все прошло полный круг. В этой точке бывший заказчик становится новым заказчиком и может начинать покупку с самого начала.
    На этом завершается обсуждение базовых механизмов работы онлайнового сайта eCommerce. Можно, конечно, добавить еще множество свойств и функций. Мы рассмотрим еще одно – автоматическое создание подтверждения заказа по e-mail.

    Соединение из строк таблицы

    В этой таблице, как и в таблице ссылок на категории в файле menu.inc, вся строка таблицы является ссылкой на страницу detail.php, где приводится полное описание продукта. Эти ссылки и их визуальные эффекты создают, программируя каждый тег реагировать на события перемещения указателя мыши над строкой и на щелчок мыши.

    Здесь также линейная спецификация стиля задает для строки используемый по умолчанию цвет текста и толщину линий. Затем встроенные обработчики событий JavaScript динамически изменяют визуальные стили оформления строки на события перемещения курсора мыши. Кроме того, событие onClick создает запрос URL для страницы detail.php. Этот URL форматируется для передачи на страницу detail.php строки запроса, содержащей ItemNumber продукта этой строки, вместе с переменной Category, которая была передана на эту страницу из меню поиска. Использование этого последнего элемента строки запроса рассматривается при обсуждении страницы detail.php.
    После вывода всех строк таблицы множество записей и соединение закрываются, и записывается закрывающий тег . Все продукты запрошенной категории выводятся в таблице вместе со ссылками на страницу detail.php, где предоставляется полная информация о продукте.

    Создание корзины покупателя

    Нам потребуется корзина покупателя, с помощью которой заказчики могут выбирать продукты для покупки. Это делается с помощью кнопки "Buy Now" (Купить), появляющейся на странице detail.php. Когда происходит щелчок на кнопке, в корзину добавляется запись, идентифицирующая выбранный продукт. Выбранные продукты накапливаются, пока покупатель не оформит покупку, в этом случае объекты из корзины покупателя используются для подготовки заказа на покупку.

    Создание счетчика посетителей

    Прежде всего, необходимо создать счетчик посетителей и инициализировать его значение. Обычно начальное значение счетчика задается как 0, но если есть желание произвести впечатление на посетителей или инвесторов, то можно инициализировать его значением 1000000. Счетчик может быть простым текстовым файлом, содержащим значение счетчика. Так как мы работаем в среде базы данных, то можно также создать таблицу. В этой таблице будет только одна запись с одним полем, в котором накапливается счетчик посетителей.
    Создание счетчика посетителей

    Здесь мы создаем таблицу с именем Counters (так как необходимо подумать о некоторых дополнительных счетчиках, которые понадобятся позже). Таблица содержит одно поле с именем VisitorCounter, определенное как числовое поле. В таблице имеется только одна эта запись. Теперь все готово к подсчету посетителей.

    Создание ссылок на категории

    Множество ссылок на страницу search.php, через которые передается выбранная категория, основывается на типе продукта. ItemType является одним из полей таблицы Products. Поэтому эти типы необходимо извлечь из таблицы, а затем форматировать как ссылки на страницу search.php. Следующий код в файле menu.inc делает варианты выбора доступными на всех страницах.
    Пример I.3.
    (html, txt)
    Здесь делается соединение с базой данных и извлекается множество записей из таблицы Products. Это множество записей содержит уникальные значения, которые находятся в поле ItemType, получаемые при использовании оператора SQL SELECT с параметром DISTINCT. Каждая запись в множестве записей $rs содержит одно значение – один из типов объектов в поле. Теперь необходимо просто выполнить итерации по множеству записей, форматируя ссылки для значений категорий.

    Создание таблицы корзины покупателя

    Удобным способом создания корзины покупателя является использование таблицы базы данных. Записи добавляются в таблицу, когда заказчик выбирает объекты для покупки; записи удаляются из таблицы, когда заказчик решает не покупать выбранный ранее объект; и запись изменяется, когда заказчик выбирает другое количество товара для покупки. Таблица является динамической, ее записи добавляются, изменяются и удаляются во время процесса покупки.
    Запись корзины покупателя должна содержать только минимальное количество информации. Она должна отслеживать заказчика, продукт и выбранное количество. Можно добавить дополнительные поля для поддержки других действий. Например, можно включить поле даты для отметки времени покупки (хорошая идея для очистки таблицы при отказе от покупки) и поле цены, если имеется риск, что цена объекта может измениться до окончательного оформления. Для текущих задач мы создаем следующую структуру таблицы ShopCart, которая добавляется в базу данных eCommerce.mdb.
    ShopCart (таблица)поле Название поле Тип поле Размер поле Количество
    OrderNo Text 10 Номер заказа
    OrderItem Text 6 Код продукта
    OrderDate date/Time Дата заказа продукта
    OrderQuantity Number Long Integer Выбранное количество продукта


    Создание заказа на продажу

    Мы приходим теперь на первую страницу, которую видит заказчик, когда покидает компанию кредитных карт. Эта страница salesorder.php представляет сводку подтвержденного заказа (или сообщение "простите" при отвергнутом заказе), которую заказчик может распечатать для справки. Также, поскольку заказ был завершен, выводится новый номер заказа, на тот случай, если заказчик захочет продолжить покупки.
    Создание заказа на продажу

    Основной раздел этой страницы начинается с заголовка страницы и получения строки запроса Approval, переданной со страницы ordercapture.php. Если подтверждение заказа будет "true", то начинается процесс вывода информации о заказе.
    Пример I.17.
    (html, txt)
    Создается объект соединения для связи с базой данных eCommerce.mdb и используется оператор SQL для извлечения информации из таблиц OrderHeader и OrderDetail. Эти множества записей имеют общий номер заказа, который находится в глобальной переменной $_SESSION[OrderNo]. Тогда будет доступна вся информация для восстановления заказа, начиная с информации о выставленном счете к оплате, извлеченной из таблицы OrderHeader.
    Стоит обратить внимание на небольшой раздел кода, следующий за открытием таблицы OrderHeader.
    if (odbc_result($rsHeader,OrderNo) == "") { odbc_close($conn); ob_flush(); header("Location:home.php") }
    Этот сценарий проверяет условие EOF на множестве записей, которое означает, что для OrderNo не было найдено подходящего значения. Как это может случиться, и зачем проверять? Это может случиться, если заказчик использует кнопку браузера "Back" ("назад") для возврата на предыдущую страницу (страница подтверждения компании кредитных карт), а затем снова нажимает кнопку "вперед" ("forward").
    Когда данная страница загружается впервые для представления заказа на продажу, конечная часть сценария создает для заказчика новый номер заказа (см. ниже). Поэтому, если заказчик возвращается на страницу назад, а затем снова перемещается вперед, номер заказа, вновь посланный компанией кредитных карт, не будет совпадать с номером текущего заказа, и будет порождаться ошибка сценария. Данный раздел кода позволяет избежать этой проблемы, перенаправляя заказчика на страницу home.asp, если отсутствует совпадение. Невозможно запретить использовать кнопку браузера для возврата на предыдущую страницу, но можно перехватывать все проблемы, которые возникают при перемещении вперед.
    Сценарий затем продолжает создание заказа на продажу, выводя информацию о счете платежа и деталях покупки.
    Пример I.17.
    (html, txt)
    Форматирование этого заказа на продажу аналогично тому, которое использовалось при выводе корзины покупателя. Сценарий выполняет цикл по записям, извлеченным из таблицы OrderDetail, создавая строку для каждой записи. Как и раньше, вычисляется каждое значение $ItemAmount, накапливается общая сумма OrderTotal и вычисляется $OrderShipping на $OrderTotal.
    (Здесь снова возникает тот случай, когда можно подумать о том, чтобы хранить плату за доставку в записи OrderHeader, а не вычислять ее во время создания заказа. Позже, когда этот заказ будет восстановлен, скорее всего, будет изменение в проценте оплаты и общая стоимость заказа будет отличаться от текущей. Здесь эта проблема рассматриваться не будет.)

    if (odbc_result($rsHeader,OrderNo) == "") { odbc_close($conn); ob_flush(); header("Location:home.php") }

    Этот сценарий проверяет условие EOF на множестве записей, которое означает, что для OrderNo не было найдено подходящего значения. Как это может случиться, и зачем проверять? Это может случиться, если заказчик использует кнопку браузера "Back" ("назад") для возврата на предыдущую страницу (страница подтверждения компании кредитных карт), а затем снова нажимает кнопку "вперед" ("forward").

    Когда данная страница загружается впервые для представления заказа на продажу, конечная часть сценария создает для заказчика новый номер заказа (см. ниже). Поэтому, если заказчик возвращается на страницу назад, а затем снова перемещается вперед, номер заказа, вновь посланный компанией кредитных карт, не будет совпадать с номером текущего заказа, и будет порождаться ошибка сценария. Данный раздел кода позволяет избежать этой проблемы, перенаправляя заказчика на страницу home.asp, если отсутствует совпадение. Невозможно запретить использовать кнопку браузера для возврата на предыдущую страницу, но можно перехватывать все проблемы, которые возникают при перемещении вперед.

    Сценарий затем продолжает создание заказа на продажу, выводя информацию о счете платежа и деталях покупки.



    ,


    Создание записей OrderDetail

    Затем сценарий создает одну или несколько записей в таблице OrderDetail. Информация для этой таблицы, однако, приходит не из компании кредитных карт. Часть ее находится в таблице ShopCart, а часть — в таблице Products. Мы, фактически, переносим детали текущего заказа в подобное множество записей OrderDetail. Мы начинаем сценарий с создания трех множеств записей, необходимых для работы: множество записей $RSDetail для доступа к таблице OrderDetail, множество записей $RSShopCart для доступа к таблице ShopCart и множество записей $RSProducts для доступа к таблице Products.
    Пример I.16.
    (html, txt)
    Сценарий выполняет итерации по записям корзины покупок в поиске соответствующих OrderNo, копирует поля OrderNo, OrderItem и OrderQuantity в соответствующие поля записи OrderDetail. Затем поле OrderItem используется для извлечения ItemTitle и ItemPrice для этого продукта из таблицы Products и копирования их в поля the ItemTitle и ItemPrice записи OrderDetail. Подготовленная запись обновляется в таблице OrderDetail, и начинается обработка следующей записи корзины покупок. В конце мы будет иметь запись в таблице OrderDetail для каждой записи корзины покупателя.

    Создание записи OrderHeader

    Сценарий начинается с открытия соединения с базой данных eCommerce. Это соединение необходимо для очистки корзины покупателя, независимо от того, будут или нет созданы записи заказа. Затем, если было получено подтверждение от компании кредитных карт, сценарий создает запись OrderHeader.
    $conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\ databases\ecommerce.mdb','',''); if ($Approval) { $sqlInsert = "INSERT INTO OrderHeader (OrderNo,OrderDate,CustomerName, CustomerAddress,CustomerCity,CustomerState, CustomerZip,CustomerPhone,CustomerEmail) Values('$OrderNo','$Date','$Name', '$Address','$City','$State',' $Zip','$Phone','$Email')"; $rsInsert = odbc_exec($conn,$sqlInsert); }
    Этот процесс состоит просто в создании новой записи в таблице OrderHeader и копировании полей, посланных из компании кредитных карт в новую запись. Поле OrderDate заполняется текущей системной датой. После того как запись заполнена и обновлена, множество записей закрывается.

    Страница creditcheck.php

    Эту страницу создавать не требуется. Необходимо только соединиться с ней и предоставить идентификацию заказа, объем заказа и имя страницы возврата. С заказчиком через защищенное соединение будет взаимодействовать компания по обслуживанию кредитных карт. Компания по обслуживанию кредитных карт возвращает код подтверждения, а информация для выставления счета к оплате собирается на странице формирования заказа.

    Страница detail.php

    Когда на странице search.php выбирается определенный товар, это действие соединяется со страницей detail.php, где выводится вся информация о продукте, включая изображение. Страница detail.php должна получить идентификацию товара, чтобы извлечь информацию. На этой странице пользователь может искать другие товары или купить этот товар. Для добавления товара в корзину покупателя создается кнопка "Buy". Товар помещается в корзину покупателя на этой странице, а затем происходит соединение со страницей shopcart.asp, чтобы посетитель мог просмотреть содержимое своей корзины покупателя. Также доступно меню поиска, чтобы можно было вернуться к процессу выбора товара.

    Страница home.php

    Средство для поиска товара является частью всех страниц в качестве основного метода навигации. Здесь используется два способа поиска товаров: просмотр списка предложений в определенной категории товаров и поиск товаров по ключевым словам. В то же самое время мы отслеживаем посетителей, когда они перемещаются со страницы на страницу. Задается механизм для идентификации пользователя и для поддержания этой информации в течение всего посещения. Для этой цели заказу присваивается уникальный номер.

    Страница ordercapture.php

    После получения кода возврата от компании кредитных карт остаются завершающие задачи оформления — они происходят скрытно на этой странице, и одной из них является создание нового идентификационного номера заказа на тот случай, если посетитель захочет продолжить покупки. Товары в корзине покупателя заказчика удаляются, и создаются заголовок заказа и другие записи для создания постоянной записи заказа покупателя. Эти записи можно использовать для восстановления заказа в будущем. Наконец создается подтверждение e-mail, если заказчик предоставил адрес e-mail.

    Страница salesorder.php

    Эта страница выводит окончательный торговый заказ, чтобы заказчик подтвердил покупку и напечатал копию. Отвергнутые заказы выводят подтверждающее сообщение.
    Когда мы перейдем к проектированию и кодированию этих страниц, возникнут другие вопросы, которые потребуется решать. Мы можем также придумать новые свойства, которые необходимо добавить на страницы. Тем не менее, имеется достаточно хорошее представление, что мы будем делать и как все это должно работать в совокупности.

    Страница search.php

    Процедуры поиска создают страницу, перечисляющую все товары в категории или все товары, которые соответствуют критериям поиска. Когда пользователь выбирает определенную категорию или задает слово для поиска, эта информация передается на страницу search.asp, используемую для поиска товаров.

    Страница shopcart.php

    Страница корзины покупателя перечисляет объекты в корзине покупателя и предоставляет посетителю возможность изменить количество единиц товара или удалить товары. Когда посетитель готов купить товар, происходит соединение со страницей creditcheck.asp.

    Структура страницы

    Основное содержимое этой страницы кодируется внутри третьего раздела страницы (напомним, что первый раздел включает файл header.inc, а второй раздел включает файл menu.inc). Именно в этом разделе используются две процедуры поиска. Страница поэтому имеет следующую структуру:
    Пример I.6.
    (html, txt)
    Если имеется значение Category, то это значение было передано на эту страницу и должно использоваться для поиска категории. Если, с другой стороны, на страницу было передано значение Criterion, то должен выполняться этот тип поиска.

    Суммарные строки заказа и кнопки

    После того как сценарий закончил итерации по объектам корзины покупателя и перечислил все покупки, вычисляется стоимость доставки ($OrderShipping) как 2% от OrderTotal и выводится пара суммарных строк.
    $OrderShipping = number_format($OrderTotal * .02,2); $OrderTotal = number_format($OrderTotal + $OrderShipping,2);
    Наконец, выводятся две кнопки: кнопка "Update" для отправки всех сделанных изменений количества продуктов, и кнопка "Checkout" для оформления заказа. Последняя кнопка обсуждается дальше вместе с оформлением покупки с помощью кредитной карты.
    Заказчики могут посещать страницу shopcart.php в любое время, даже до того, как будут сделаны какие-либо покупки. Однако, когда это происходит, вывод кнопок или доступ к ним для посетителя не обязателен. Они нужны только тем заказчикам, которые выбрали продукты для покупки. Поэтому их вывод происходит только для тех заказчиков, которые имеют объекты в своей корзине покупателя, т.е. когда значение OrderTotal не равно $0.00. Это условие используется для определения, будут или нет выводиться кнопки.
    Пример I.13.
    (html, txt)



    Щелкните, чтобы оформить онлайн покупку с помощью защищенного соединения с кредитной платежной системой.


    Пример I.13.

    Теги XHTML со сценарием

    Процедуры JavaScript добавляются в теги для задания различных стилей и для включения ссылок, когда посетитель выполняет одно из трех указанных выше действий. Эти события и действия перечислены в следующей таблице.
    Item Number Title Quantity Price Amount
    Shipping
    Order Total
    СобытиеДействие
    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...'

    Когда мышь перемещается поверх строки таблицы, включается событие onmouseover и выполняются три оператора JavaScript. Цвет фона (свойство backgroundColor) строки задается как светло-зеленый (lightgreen), цвет текста (свойство color) задается как темно-зеленый (darkgreen), а форма курсора (свойство cursor) задается в форме ладони. Когда курсор мыши смещается со строки таблицы, включается событие onmouseout и свойства возвращаются к своим исходным значениям.
    Общий формат выполнения команд JavaScript внутри тега HTML имеет вид
    EventName = "statement1 [; statement2] [; statement3]..."
    То есть за именем onmouseover, onmouseout, onclick или другим таким именем события, для которого будет применяться действие, следует знак равенства и в кавычках список операторов, которые будут выполнены, когда произойдет событие. Несколько операторов разделяются точкой с запятой.
    Операторы, используемые для задания свойств, имеют следующий формат,
    this.style.property='value'
    где style является указанием на задание таблицы стилей, property является формальным именем задаваемого свойства, а значение value (заключенное в кавычки) является конкретным значением для задания этого свойства. Специальное ключевое слово self является ссылкой на себя объекта XHTML, содержащего это задание свойства, в данном случае тег .
    Когда происходит событие onClick, создается ссылка на страницу search.php. Соединение происходит при задании свойству location.href (не тега , а текущего окна) имени страницы, на которую указывает ссылка. Это задание свойства приводит к замене URL в поле адреса браузера другим URL, в данном случае адресом страницы search.php.

    Увеличение значения счетчика посетителей

    Когда посетитель прибывает на сайт, необходимо увеличить счетчик посетителей на 1. Мы узнаем, что прибыл посетитель, когда PHP создает сеанс и создает объект сеанса для этого человека. Поэтому мы создаем глобальную переменную сеанса с именем "Count" ($_SESSION[Count]) и будем увеличивать ее значение на 1 всякий раз, когда запускается новый сеанс. Это значение будет использоваться для увеличения VisitorCounter.
    Чтобы не считать дважды одного и того же пользователя во время следующего сеанса, можно поместить код обновления счетчика внутрь оператора if, который проверяет, что переменной Count уже было присвоено значение. Если Count не определено, то это указывает на новый сеанс или на нового пользователя и удовлетворяется условие для обновления счетчика Visitor. Если Count имеет значение, то текущий сеанс пользователя уже был учтен и блок обновления игнорируется.
    Так как home.php является "входом" на сайт, давайте вернемся к файлу home.php и добавим необходимый код для учета посетителей:
    session_start();
    if (!$_SESSION[Count]) { $_SESSION[Count] = 1; $conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','',''); $sql = "UPDATE Counters SET VisitorCounter = VisitorCounter + $_SESSION[Count]"; $rs = odbc_exec($conn, $sql) odbc_close($conn); }
    Мы соединяемся и открываем таблицу Counters и добавляем 1 в поле VisitorCounter. Это действие происходит всякий раз, когда кто-то новый приходит на сайт. ПРИМЕЧАНИЕ: не забудьте сделать вызов функции session_start() перед проверкой статуса переменной сеанса Count. Если сеанс не запущен, $_SESSION[Count] не будет опознаваться как переменная сеанса, и оператор if будет выполняться каждый раз при перезагрузке страницы. Другими словами счетчик будет увеличиваться всякий раз, когда обновляется страница, а не тогда, когда создается новый сеанс.

    Выбор категорий продуктов

    Все страницы сайта eCommerce содержат раздел ссылок для поиска информации о программном обеспечении, содержащейся в таблице Products базы данных eCommerce.mdb.
    Выбор категорий продуктов

    Посетители сайта могут просматривать названия программных продуктов двумя способами. Через множество ссылок на категории продуктов посетитель может вывести все продукты, которые попадают в эту категорию, а через поиск по ключевому слову пользователь может вывести все продукты, которые содержат ключевое слово в одном из полей в их записях в базе данных. Результат любого поиска создает список подходящих кодов продуктов, названий и цен.

    Выделение строки таблицы и соединение

    Значения ItemType выводятся в таблице, чтобы воспользоваться средствами таблицы стилей, которые предоставляют интересный метод присвоения ссылок ячейкам таблицы, а не самим значениям. Значения ItemType появляются в таблице в следующем виде и выделяются, когда указатель мыши перемещается по записям (вокруг таблицы показана граница, чтобы эффект был более заметен):
    Выделение строки таблицы и соединение

    Ссылки делаются из ячеек таблицы – на самом деле из строк таблицы – а не из текстовых строк, появляющихся внутри ячеек. Это позволяет присвоить выделение и визуальные индикаторы строкам, когда указатель мыши перемещается по ним, а ссылки активируются при щелчке на строках таблицы, содержащих данные, а не на самих данных. Такой метод соединения из строк таблицы более четко иллюстрируется списком продуктов, появляющимся на странице search.php. Такая же техника используется здесь, хотя эффект не такой впечатляющий, как выделение и соединение из нескольких ячеек в строке.
    Эти действия по выделению и соединению создаются следующим кодом для строк таблицы. Особенно отметим, что код находится внутри тега , так что результат проявляется во всех ячейках строки (хотя в данном конкретном случае в строке имеется только одна ячейка).
    $row[ItemType]
    Свойства таблицы стилей используются для создания начального вида строк в ячейках. Свойство color задает цвет текста, выводимого в ячейках, свойство line-height задает высоту текста (и соответственно высоту самой ячейки), а свойство font-size задает размер шрифта текста.
    Кроме этих статических свойств необходимо добавить свойства, которые изменяются, когда посетитель взаимодействует с ячейками. Мы хотим, чтобы "что-то происходило", когда посетитель перемещает курсор над ячейками, смещается с ячеек и щелкает в ячейке. Описанные события являются фактически событиями сценариев, которые в языке JavaScript называются onMouseOver, onMouseOut и onClick. Поэтому эти события можно использовать для включения изменений в стилях оформления ячеек таблицы.

    Вывод корзины покупателя

    Следующий код создает вывод корзины покупателя. Этот код появляется в основном разделе страницы, чтобы создать приведенный выше вывод. Отметим, что весь раздел включает форму, которая пересылается снова на эту же страницу, чтобы можно было изменить заказанное количество единиц товара.
    Пример I.12.
    (html, txt)
    Первая часть кода создает заголовки страницы и заголовки таблицы для списка корзины покупателя. Вместе с номером заказа покупателя, который содержится в переменной $_SESSION[OrderNo], выводится текущая системная дата


    Click to finalize on- line purchase through secure connection to Credit Payment Systems. Щелкните здесь, чтобы оформить онлайн покупку через безопасное соединение с системой оплаты по кредитным картам.


    Пример I.12.
    Первая часть кода создает заголовки страницы и заголовки таблицы для списка корзины покупателя. Вместе с номером заказа покупателя, который содержится в переменной $_SESSION[OrderNo], выводится текущая системная дата

    Вывод описания продукта

    Когда делается соединение со страницей detail.php, соответствующая строка запроса предоставляет странице ItemNumber продукта и значение Category или Criterion из предшествующего поиска. Страница detail.php применяет ItemNumber для извлечения всех связанных с ним полей из таблицы Product и выводит эту информацию на странице. Значение Category или Criterion используется для создания обратной ссылки на страницу поиска.
    Вывод описания продукта

    Программирование страницы достаточно просто. ItemNumber используется для извлечения соответствующей записи из таблицы Product и для доступа к изображению продукта в папке Pictures. Вся эта информация выводится затем на странице.
    Пример I.10.
    (html, txt)
    Как мы уже делали на предыдущих страницах, прежде всего необходимо получить посланную на страницу строку запроса. В данном случае имеется три значения строки запроса, которые могут быть посланы. Будут получены значение ItemNumber вместе со значением Category или Criterion. Не имеет значения, что одно из двух последних значений будет отсутствовать в зависимости от типа выполненного на странице search.php поиска. Присваивание все равно можно выполнить, просто одно из значений будет null.
    $ItemNumber = $_GET[ItemNumber] $Category = $_GET[Category] $Criterion = $_GET[Criterion]
    В основном разделе страницы извлекается информация о продукте. Поиск записи о продукте основывается на значении ItemNumber, переданного со страницы поиска. Когда запись извлекается, ее значения присваиваются переменным для упрощения записи. Сохраняются все поля кроме ItemQuantity. Это поле используется в дальнейшем, а не для вывода на этой странице.
    Изображение, связанное с продуктом, выводится с помощью тега , используя ItemNumber для идентификации соответствующего изображения. Все изображения именуются в соответствии с регистрационными номерами соответствующих продуктов. Затем форматируется последовательность заголовков, чтобы представить данные о продукте, вместе с расширенным описанием продукта. Никакое специальное форматирование не применяется.
    Затем появляется кнопка "Buy Now". Эта кнопка используется посетителем для покупки продукта, добавляя позицию в корзину покупателя. В данное время мы проигнорируем эту кнопку и обратимся к ней и связанному с ней программированию в дальнейшем. Можно отметить, однако, что эта кнопка имеет такие же характеристики стиля оформления, как и кнопка "Go" в меню поиска. Ее обработчики событий onMouseOver и onMouseOut связываются с процедурами JavaScript, импортированными на страницу в файле INCLUDE jscript.inc.
    Ссылка внизу страницы возвращает на предыдущую страницу search.php. Но не только это: URL возвращает назад строку запроса, что приводит к повторному выводу результатов предыдущего поиска. (Возврат URL без строки запроса не предоставит странице search.php значение Category или Criterion. Страница search.php тогда по умолчанию вернется на домашнюю страницу (home), и результаты предыдущего поиска будут потеряны.)
    Строка запроса передает оба значения Category и Criterion, даже если только одно из них было послано на эту страницу. Это означает просто, что одно из значений строки запроса будет null. Такая ситуация не имеет значения для страницы search.php. Она заново выполняет поиск на основе возвращаемого значения.
    Это отсутствующее значение Category или Criterion также не влияет на вывод внутри обратной ссылки.
    Back to ""
    Одно из этих двух значений будет null, поэтому будет выводиться имеющееся значение, а другое выводиться не будет.
    Страница detail.php имеет другое важно назначение, кроме вывода информации о продукте. На этой странице посетитель покупает продукты, заполняя свою корзину покупок с помощью кнопки "Buy Now". Мы вернемся к обсуждению сценария для этой задачи немного позже.


    Item Number:
    Producer:
    Price: $


    Back to


    Пример I.10.
    Как мы уже делали на предыдущих страницах, прежде всего необходимо получить посланную на страницу строку запроса. В данном случае имеется три значения строки запроса, которые могут быть посланы. Будут получены значение ItemNumber вместе со значением Category или Criterion. Не имеет значения, что одно из двух последних значений будет отсутствовать в зависимости от типа выполненного на странице search.php поиска. Присваивание все равно можно выполнить, просто одно из значений будет null.
    $ItemNumber = $_GET[ItemNumber] $Category = $_GET[Category] $Criterion = $_GET[Criterion]
    В основном разделе страницы извлекается информация о продукте. Поиск записи о продукте основывается на значении ItemNumber, переданного со страницы поиска. Когда запись извлекается, ее значения присваиваются переменным для упрощения записи. Сохраняются все поля кроме ItemQuantity. Это поле используется в дальнейшем, а не для вывода на этой странице.
    Изображение, связанное с продуктом, выводится с помощью тега , используя ItemNumber для идентификации соответствующего изображения. Все изображения именуются в соответствии с регистрационными номерами соответствующих продуктов. Затем форматируется последовательность заголовков, чтобы представить данные о продукте, вместе с расширенным описанием продукта. Никакое специальное форматирование не применяется.
    Затем появляется кнопка "Buy Now". Эта кнопка используется посетителем для покупки продукта, добавляя позицию в корзину покупателя. В данное время мы проигнорируем эту кнопку и обратимся к ней и связанному с ней программированию в дальнейшем. Можно отметить, однако, что эта кнопка имеет такие же характеристики стиля оформления, как и кнопка "Go" в меню поиска. Ее обработчики событий onMouseOver и onMouseOut связываются с процедурами JavaScript, импортированными на страницу в файле INCLUDE jscript.inc.
    Ссылка внизу страницы возвращает на предыдущую страницу search.php. Но не только это: URL возвращает назад строку запроса, что приводит к повторному выводу результатов предыдущего поиска. (Возврат URL без строки запроса не предоставит странице search.php значение Category или Criterion. Страница search.php тогда по умолчанию вернется на домашнюю страницу (home), и результаты предыдущего поиска будут потеряны.)
    Строка запроса передает оба значения Category и Criterion, даже если только одно из них было послано на эту страницу. Это означает просто, что одно из значений строки запроса будет null. Такая ситуация не имеет значения для страницы search.php. Она заново выполняет поиск на основе возвращаемого значения.
    Это отсутствующее значение Category или Criterion также не влияет на вывод внутри обратной ссылки.
    Back to ""
    Одно из этих двух значений будет null, поэтому будет выводиться имеющееся значение, а другое выводиться не будет.
    Страница detail.php имеет другое важно назначение, кроме вывода информации о продукте. На этой странице посетитель покупает продукты, заполняя свою корзину покупок с помощью кнопки "Buy Now". Мы вернемся к обсуждению сценария для этой задачи немного позже.

    Вывод счетчика посетителей

    Счетчик посетителей выводится на странице home.php. Для считывания и вывода значения счетчика используется следующий сценарий:

    При тестировании этой процедуры счетчика на странице помните об одном важном факте. Счетчик не будет увеличиваться просто при перезагрузке страницы. Счетчик увеличивается только при появлении нового посетителя и создании нового сеанса. Поэтому, чтобы увеличить счетчик, понадобится закрыть браузер (завершить текущий сеанс) и снова его открыть (запуская новый сеанс).

    Запись информации о продажах

    Подтверждение покупки и информация о выставленном заказчику счете возвращается из компании кредитных карт на страницу, указанную в ReturnURL, представленной формы. Это будет в нашем случае страница ordercapture.php. Информация посылается как скрытые поля и доступна на этой странице в массиве $_POST[] с помощью следующих имен:
    $_POST[Approval] true (заказ принят) или false (заказ отвергнут) $_POST[Amount] Общая сумма заказа в долларах $_POST[CustomerID] Номер заказа заказчика $_POST[Name] Имя в счете к оплате заказчика $_POST[Address] Адрес в счете к оплате заказчика $_POST[City] Город в счете к оплате заказчика $_POST[State] Штат в счете к оплате заказчика $_POST[Zip] Zip-код в счете к оплате заказчика $_POST[Phone] Номер телефона заказчика $_POST[Email] Адрес e-mail заказчика
    Страница ordercapture.php является страницей на PHP без какого-либо кода XHTML. Эта страница не выводится заказчику, но используется для выполнения фоновой обработки возвращаемой информации, прежде чем направить заказчика на страницу salesorder.php.
    Существенная часть работы, которая должна быть выполнена на этой странице, состоит в фиксации информации о заказа на продажу, чтобы о нем существовала постоянная запись. Эту запись можно использовать для восстановления заказа, если понадобится, и для предоставления информации для взаимодействия с системами бухгалтерии и склада (если они существуют, так как в данном примере они отсутствуют).

    Записи заголовка заказа и деталей заказа

    Традиционный способ отслеживания заказов на продажу состоит в создании двух типов записей о продажах. Запись заголовка заказа содержит идентификационную информацию заказа, такую как номер заказа, дату заказа, и информацию о счете к оплате заказчика. Для каждого заказа существует одна запись заголовка заказа. Запись деталей заказа содержит детали о купленных товарах – код товара, количество, и цену. Существует одна запись деталей заказа для каждого купленного товара. Такая информация поддерживается в этих файлах, чтобы можно было восстановить исходный заказ.
    Файлы заголовка заказа и деталей заказа являются таблицами базы данных, содержащимися в базе данных eCommerce.mdb. Их формат показан ниже.
    OrderHeader (таблица)Имя поля Тип поля Размер поля
    OrderNo Text 10
    OrderDate Date/Time
    CustomerName Text 50
    CustomerAddress Text 50
    CustomerCity Text 50
    CustomerState 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'Reilly), притяжательный падеж (Bill's), сокращения (it's) и тому подобное. Однако оператор SQL вида
    SELECT * FROM Customers WHERE LastName = 'O'Reilly'
    будет вызывать ошибку, так как не разрешается кодировать апостроф внутри значения, которое само заключено в апострофы. Решение проблемы состоит в применении двойного апострофа ('') вместо любого одиночного апострофа внутри значения:
    SELECT * FROM Customers WHERE LastName = 'O''Reilly'

    Функции HTTP/сеанса

    header() — выводит строку заголовка HTTP, такую, как место переадресации.
    setcookie("name", "value", "expire", "path", "domain", "secure") – посылает пользователю cookie.
    session_start("name", "value", "expire", "path", "domain", "secure") – посылает пользователю cookie.
    setcookie("name", "value", "expire", "path", "domain", "secure") – посылает пользователю cookie.
    session_start() – инициализирует данные сеанса. Эта функция вызывается перед созданием новой переменной сеанса с помощью $_SESSION.
    session_destroy() – разрушает все данные, зарегистрированные за текущим сеансом сценария.

    Функции MySQL

    mysql_connect(MySQL server name,username,password) – открывает соединение с сервером MySQL.
    mysql_select_db(database_name,connection_identifier) – выбирает базу данных, расположенную на сервере MySQL. Параметр database_name указывает на активную базу данных на сервере MySQL, которая была открыта с помощью функции mysql_connect. Параметр connection_identifier является ссылкой на текущее соединение с MySQL.
    mysql_query(sql query) – посылает запрос активной в данный момент базе данных.
    mysql_fetch_array(resourse result) – возвращает массив, который соответствует извлеченной строке, и перемещает внутренний указатель данных вперед.
    mysql_affected_rows(resourse result) –определяет число строк, затронутых предыдущей операцией SQL.
    mysql_close(link_identifier) – закрывает соединение с MySQL.

    Функции ODBC

    odbc_connect(dsn/dsn-less connection string,username,password) – эта функция используется для соединения с источником данных ODBC. Функция получает четыре параметра: имя источника данных или строку соединения без dsn, имя пользователя, пароль и необязательный параметр, задающий тип курсора. В тех случаях, где имя пользователя, пароль и тип курсора не требуются, параметры можно заменять пустой строкой – ''. id соединения, возвращаемый этой функцией, необходим другим функциям ODBC. Можно иметь одновременно открытыми несколько соединений, если они используют различные базы данных или различные имена пользователей и пароли.
    odbc_exec(connection_id,SQL_query_string) – функция, используемая для выполнения оператора SQL. Функция получает два параметра: объект соединения, созданный с помощью функции odbc_connect() и оператор SQL. Возвращает FALSE при ошибке. Возвращает множество записей, если команда SQL была выполнена успешно.
    odbc_fetch_array(recordset_name) – используется для извлечения записей или строк из множества записей, как из ассоциативного массива. Эта функция возвращает TRUE, если может вернуть строки, иначе FALSE.
    odbc_num_rows(recordset_name) – возвращает число строк в множестве результатов ODBC. Функция возвращает -1, если возникает ошибка. Для операторов INSERT, UPDATE и DELETE функция odbc_num_rows() возвращает число затронутых строк. Для предложения SELECT это может быть число доступных строк. Примечание: использование функции odbc_num_rows() для определения числа доступных строк после выполнения оператора SELECT будет возвращает -1 для драйверов MS Access.
    odbc_close(connection_id) – закрывает соединение с сервером базы данных, связанным с данным идентификатором соединения.

    Функции ошибок

    exit("message") – выводит сообщение об ошибке и прекращает выполнение текущего сценария.
    die("message") – выводит сообщение об ошибке и прекращает выполнение текущего сценария.

    Функции работы с файлами

    fopen(filename, mode) — используется для открытия файла. Функция требуется имя файла filename и режим mode. Она возвращает указатель на файл, который предоставляет информацию о файле и используется в качестве ссылки.
    fread(resource_handle, length) – используется для чтения содержимого файла. Читает length байтов из файла, задаваемого resource_handle. Чтение прекращается, когда будет прочитано length байтов или будет достигнут EOF (end of file). Функция требует два параметра – указатель файла, который создается при открытии файла с помощью fopen(), и длины length, определяющей объем считываемого содержимого файла.
    fgetcsv(resource_handle, length, delimiter) – используется для чтения содержимого файла и анализа данных для создания массива. Данные разделяются параметром delimiter, задаваемым в функции.
    filesize(filename) – возвращает размер файла. Если возникает ошибка, то функция возвращает значение false.
    fclose(resource_handle) – используется для закрытия файла. Функции требуется указатель файла, созданный при открытии файла с помощью функции fopen(). Возвращает TRUE при успехе или FALSE при отказе.
    fwrite(resource_handle,string) – записывает содержимое строки string в указанный поток файла. Если задан аргумент длины length, запись будет остановлена после записи length байтов или при достижении конца строки.
    copy(original_filename, new_filename) – копирует содержимое файла, заданного первым параметром, в новый файл, определенный вторым параметром. Функция возвращает значение true или false.
    unlink(filename) – удаляет файл, определенный параметром. Функция возвращает значение true или false.
    rename($orig_filename, $new_filename) – переименовывает файл, определенный первым параметром, задавая для него имя, определенное вторым параметром. Функция возвращает значение true или false.

    Функция Email

    mail("recipient","subject", "message", "mail headers") – посылает сообщение e-mail указанному получателю.

    Интегрирование данных переменной

    Обычно в операторах SQL используются порождаемые сценарием данные, а не строковые или числовые константы. В этом случае сценарий должен создать соответствующий оператор SELECT, соединяя фиксированную часть оператора SELECT с переменными данными:
    SQLString = "SELECT * FROM Customers WHERE State = '$TheState'"
    Если переменная TheState имеет значение "GA", то SQLString будет содержать оператор SQL:
    SQLString = "SELECT * FROM Customers WHERE State = 'GA'"
    Отметим, что апострофы, включенные в литеральные текстовые строки, окружают переменную, так что значение TheState равное "GA" интерпретируется как строка ('GA') в операторе SELECT.
    При извлечении числовых данных апострофы не требуются:
    SQLString = "SELECT * FROM Customers WHERE Age = $TheAge"
    Значение переменной TheAge добавляется в конце литеральной строки, создавая оператор SELECT следующего вида:
    SQLString = "SELECT * FROM Customers WHERE Age = 30"
    При создании операторов, включающих дату, переменная должна быть заключена в специальные символы "#":
    SQLString = "SELECT * FROM Orders WHERE OrderDate = #$TheDate#"
    Получающая строка в переменной SQLString представляет оператор 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 = #$DateVariable#"

    Ключевое слово DISTINCT

    Некоторые поля таблицы, вполне вероятно, содержат не уникальные значения данных. То есть, одно и то же значение может появляться более чем в одной записи. Чтобы извлекать только уникальные значения из этих полей, надо перед именем поля поставить ключевой слово DISTINCT. Например, следующий оператор извлекает один столбец данных, содержащий только уникальные значения в поле с именем ItemType:
    SELECT DISTINCT ItemType FROM Products

    Математические функции

    ceil(fraction) – округляет дробное число до ближайшего большего целого числа.
    floor(fraction) – округляет дробное число до ближайшего меньшего целого числа.
    number_format("number", "decimals", "decimal point", "thousands_sep") – возвращает форматированную версию указанного числа ("number").
    pow(number, exponent) – возвращает результат возведения заданного числа number в степень exponent.
    rand(min, max) – порождает случайное число из заданного диапазона.
    round(fraction) – округляет дробное число до ближайшего целого числа.
    sqrt(number) – возвращает квадратный корень заданного числа number.

    Оператор DELETE

    Оператор DELETE используется для удаления записей из таблицы базы данных. Обычный формат оператора для удаления одной записи показан ниже:
    DELETE FROM TableName WHERE criteria
    За ключевыми словами DELETE FROM следует имя таблицы, из которой будет удалена запись. Предложение WHERE задает идентификацию записи. Оператор DELETE не возвращает никакого множества записей.

    Оператор INSERT

    Оператор INSERT используется для добавления записей в таблицу базы данных. Его общий формат для добавления одной записи показан ниже:
    INSERT INTO TableName [(FieldName1 [,FieldName2]...)] VALUES (Value1 [,Value2]...)
    После ключевых слов INSERT INTO следует имя таблицы, в которую будет добавлена новая запись. При желании за именем таблицы может следовать заключенный в скобки и разделенный запятыми список имен полей, для которых задаются значения. Предложение VALUES задает, в скобках, разделенный запятыми список соответствующих значений данных для добавленных полей. Оператор INSERT не возвращает никакого множества записей.
    Обычно все поля именуются и для них задаются значения, но это не обязательно. Те поля, имена и соответствующие значения которых указаны, вводятся в добавляемую запись, неопределенные поля добавляются, но не имеют присвоенных значений. Если имена полей не задаются, все значения присваиваются, начиная с первого поля.
    Наиболее распространенный и простой способ определить новую запись состоит в указании имен всех полей и задании для каждого из них значения:
    INSERT INTO MyTable (Field1, Field2, Field3, Field4, Field5) VALUES('a text field value', 'a memo field value', 100, 3000, #01/01/04#)
    В этом примере в таблицу MyTable добавляется новая запись, содержащая пять полей. Имена полей задаются вместе со значениями присваиваемых данных, соответственно, для каждого поля. Значения для полей, которые определены как текстовые поля в таблице, должны быть помещены в одиночные кавычки (апострофы); значения для числовых полей не заключаются в одиночные кавычки; значения для полей даты/времени заключаются в символы #. Однако, вполне допустимо вставлять новую запись только с некоторыми полями, имеющими значения, если эти значения соответствуют именам полей и типам данных:
    INSERT INTO MyTable (Field1, Field5) VALUES('a text field value', #01/01/04#)
    Если вставляемое текстовое поле содержит апострофы, они должны быть заменены двойными апострофами. Смотрите обсуждение использования апострофов в значениях данных при рассмотрении оператора SELECT.

    Оператор SELECT

    Системы управления базами данных предоставляют для работы с информацией в базе данных язык структурированных запросов SQL. При использовании SQL всю работу выполняет система управления базой данных. Вместо программирования серверных сценариев для доступа к таблицам или для обслуживания данных в базе данных, можно передать эту работу СУБД. Сценарий просто создает запрос SQL для СУБД, которая самостоятельно выполняет задачу. Такой метод способствует использованию трехслойных, клиент-серверных систем, где доступ к данным и обработка базы данных локализованы на сервере базы данных.

    Оператор UPDATE

    Оператор UPDATE используется для изменения записей в таблице базы данных. Общий формат оператора для обновления одной записи показан ниже.
    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'
    В этом примере три поля изменяются в записи, которая определяется значением 'KEY001' в Field1 в таблице MyTable. Значения для полей, которые определяются как текстовые поля в таблице, должны заключаться в одиночные кавычки (апострофы); значения для числовых полей не заключаются в одиночные кавычки; значения для полей даты/времени заключаются в символы #.

    Предикат TOP n

    Если поставить перед выбранным полем TOP n, то будет возвращено n записей, которые будут находиться вверху или внизу диапазона, определенного предложением ORDER BY. При упорядочивании по возрастанию (DESC) извлекается верхняя часть диапазона, при упорядочивании по убыванию (ASC) — нижняя часть диапазона.
    SELECT TOP 10 ItemName, ItemPrice FROM Products ORDER BY ItemPrice ASC
    Этот оператор выбирает 10 самых дешевых продуктов из таблицы. Можно использовать также зарезервированное слово PERCENT, чтобы возвращать определенный процент записей, которые попадают в верхнюю или нижнюю часть диапазона, определенного предложением ORDER BY.

    Предложение 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),MiddleInitial
    Предложение WHERE и ORDER BY являются необязательными в операторе SELECT, но также могут появляться. Однако, если применются оба, предложение WHERE должно предшествовать предложению ORDER BY.

    Предложение WHERE

    В обоих приведенных выше случаях из таблицы извлекаются все записи. Различаются только поля, которые составляют запись. Однако могут быть ситуации, когда не требуется извлекать все записи из таблицы. Может быть желательно выбрать только те записи, которые удовлетворяют определенному критерию. Для этих целей оператор SELECT предоставляет дополнительное предложение WHERE.
    За ключевым словом WHERE следует один или несколько критериев выбора. Распространенный способ использования этого свойства состоит в проверке равенства, то есть поиска совпадающего значения в одном из полей записи. Например, если множество записей заказчиков обрабатывается на основе штата, в котором они расположены, то может быть желательно выбирать только те записи, где поле State содержит значение "GA". Для этого можно использовать оператор SQL,
    SELECT * FROM Customers WHERE State='GA'
    а система управления базой данных предоставит только те записи, которые имеют совпадающий код штата. Фактически для определения критерия выбора можно выбрать любой из обычный операторов сравнения
    = (равно)
    <> (не равно)
    < (меньше)
    > (больше)
    <= (меньше или равно)
    => (равно или больше)

    Кроме того, можно объединять критерии, используя логические операторы AND, OR и NOT для расширения или сокращения области выбора:
    SELECT * FROM Customers WHERE State='GA' OR State='KY'
    Отметим в этих примерах, что значения критерия выбора заключаются в одиночные кавычки (апострофы). При любом поиске в текстовых полях базы данных значение критерия должно заключаться в одиночные кавычки (WHERE State = 'GA'). Если тестируется числовое поле, значение данных в кавычки не заключается (WHERE Number > 10). Если тестируется поле даты/времени, то значение критерия окружается символами # (WHERE TheDate > #1/1/01#).

    За ключевым словом WHERE следует один или несколько критериев выбора. Обычно запись для изменения выбирают, сравнивая со значением ее уникального "ключевого" поля.
    Можно, однако, использовать для идентификации записи любые принятые условные операторы:
    = (равно)
    <> (не равно)
    < (меньше)
    > (больше)
    <= (меньше или равно)
    => (равно или больше)

    Кроме того, можно объединять различные проверки с помощью логических операторов 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 < $TheQuantity AND NOT ItemType = '$TheType &'"
    Этот код разрешается в оператор UPDATE следующего вида:
    SQLString = "UPDATE Products SET ItemQty = 0 WHERE ItemQuantity < 10 AND NOT ItemType = 'Software'"


    В обоих приведенных выше случаях из таблицы извлекаются все записи. Различаются только поля, которые составляют запись. Однако могут быть ситуации, когда не требуется извлекать все записи из таблицы. Может быть желательно выбрать только те записи, которые удовлетворяют определенному критерию. Для этих целей оператор SELECT предоставляет дополнительное предложение WHERE.
    За ключевым словом WHERE следует один или несколько критериев выбора. Распространенный способ использования этого свойства состоит в проверке равенства, то есть поиска совпадающего значения в одном из полей записи. Например, если множество записей заказчиков обрабатывается на основе штата, в котором они расположены, то может быть желательно выбирать только те записи, где поле State содержит значение "GA". Для этого можно использовать оператор SQL,
    SELECT * FROM Customers WHERE State='GA'
    а система управления базой данных предоставит только те записи, которые имеют совпадающий код штата. Фактически для определения критерия выбора можно выбрать любой из обычный операторов сравнения
    = (равно)
    <> (не равно)
    < (меньше)
    > (больше)
    <= (меньше или равно)
    => (равно или больше)

    Кроме того, можно объединять критерии, используя логические операторы AND, OR и NOT для расширения или сокращения области выбора:
    SELECT * FROM Customers WHERE State='GA' OR State='KY'
    Отметим в этих примерах, что значения критерия выбора заключаются в одиночные кавычки (апострофы). При любом поиске в текстовых полях базы данных значение критерия должно заключаться в одиночные кавычки (WHERE State = 'GA'). Если тестируется числовое поле, значение данных в кавычки не заключается (WHERE Number > 10). Если тестируется поле даты/времени, то значение критерия окружается символами # (WHERE TheDate > #1/1/01#).

    Создание строк SQL

    Иногда операторы SELECT могут стать достаточно сложными со всеми полями выбора, критериями выбора и предложениями упорядочивания. Поэтому часто удобно сначала создать оператор в переменной сценария, а затем выполнить оператор с помощью имени переменной.
    SQLString = "SELECT * FROM Customers WHERE State='GA' ORDER BY LastName(DESC)"
    Здесь строка символов, составляющих оператор SELECT, присваивается переменной SQLString. Затем эта переменная используется для выполнения оператора 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 (не забывая добавлять необходимые пробелы для разделения предложений).

    Строковые функции

    strlen(string) – определяет длину строки.
    ltrim(string) – удаляет пробелы в начале строки.
    rtrim(string) – удаляет пробелы в конце строки.
    strpbrk(string, char) – ищет в строке string символ (char). Возвращает false или строку, начинающуюся с найденного символа.
    strtoupper(string) – преобразует строку в верхний регистр.
    strtolower(string) – преобразует строку в нижний регистр.
    strrev(string) – записывает строку в обратном порядке.
    eregi(string pattern, string subject) – выполняет независимый от регистра поиск выражения. Выполняет поиск в subject на основе регулярного выражения, заданного в pattern.

    Вставка переменных в операторы INSERT

    Как и в случае оператора SELECT, обычно операторы SQL INSERT создаются сценарием, который вставляет переменные данные в операторы.
    SQLString = "INSERT INTO Products (ItemNo, ItemName, ItemPrice, ItemQty, ItemDate) VALUES ('$ItemNo', '$ItemName', $ItemPrice,$ItemQuantity,#$PurchaseDate#)"
    Эта конструкция создает оператор INSERT следующего вида:
    SQLString = "INSERT INTO Products (ItemNo, ItemName, ItemPrice, ItemQty, ItemDate) VALUES ('AAA111', 'Software', 100.00, 15, #07/15/04#)"

    

        Бизнес в интернете: Сайты - Софт - Языки - Дизайн