Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PHP5_nachinayushim

.pdf
Скачиваний:
29
Добавлен:
20.03.2015
Размер:
26.79 Mб
Скачать

364 Глава 8

являются частью класса созданного объекта. Существует множество доступных классов объектов. Для начала можно использовать DOMDocument объект и получить новые объек ты, отражающие такие компоненты XML документа, как элементы, атрибуты и т.д.

Например, чтобы открыть созданный ранее XML файл, можно использовать сле дующий код, создающий DOM объект с именем $my_dom_obj:

$my_dom_obj = domxml_open_file("first_xml.xml");

Затем, чтобы создать переменную, представляющую найденный в документе кор невой элемент, можно использовать такой код:

$the_root_element = $my_dom_obj->document_element();

Манипулировать созданными DOM объектами можно также с помощью несколь ких других PHP DOM функций, включая create_element(), которая создает новый элемент, и append_child(), которая добавляет какой либо элемент в качестве до чернего для существующего элемента.

Например, если в XML документе, скомпонованном согласно DOM, требуется найти определенный элемент, то можно воспользоваться функцией get_element_by_tagname DOMElement объекта, позволяющей находить элемент как узел в DOM, и он будет най ден как дочерний узел в DOM иерархии корень ветвь лист.

В DOM расширении доступно множество других классов объектов, а также боль шое количество функций для создания и манипулирования XML документами. Объект но ориентированная природа данных функций широко раскрывается в книге Профес сиональное программирование на PHP (ИД ‘‘Вильямс’’, 2006 г), в которой можно найти более подробную информацию о DOM и PHP.

XML-функции PHP5

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

Расширение SimpleXML

Расширение SimpleXML также является экспериментальным, но в PHP5 оно пол ностью переработано. Данное расширение устанавливается по умолчанию (параметр --enable-simplexml). Оно включает в себя функции для работы с XML докумен тами, которые значительно упрощают распространенные операции. Например, рас ширение позволяет сценарию принимать строку, преобразовывать ее в XML до кумент и отображать этот документ. Главное преимущество заключается в том, что XML документ становится объектом, который можно обрабатывать, как любые другие объекты в PHP, причем доступ к элементам и атрибутам документа, а также к их дан ным осуществляется с помощью обычных объектных операций (объекты более под робно рассматриваются в последующих главах).

В состав SimpleXML расширения входят следующие функции:

simplexml_load_file: принимает в качестве аргумента путь к файлу и, если содержимое файла является правильно сформированным XML документом, то выгружает данные файла в виде объекта;

XML 365

simplexml_load_string: принимает в качестве аргумента строку, которая должна быть правильно сформированным XML+документом, и преобразовыва+ ет эту строку в объект;

simplexml_import_dom: принимает узел из DOM+документа и превращает его в simplexml+узел;

simplexml_element->asXML: возвращает правильно сформированную XML+ строку из simpleXML+объекта;

simplexml_element->attributes: предоставляет определения атрибутов и значений внутри правильно сформированной XML+строки;

simplexml_element->children: данный метод предоставляет дочерние эле+ менты заданного элемента;

simplexml_element->xpath: метод выполняет XPath+запрос по simpleXML+узлу.

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

В PHP+программе можно написать (или получить как результат какого+либо выра+ жения или функции) строку, представляющую собой правильно сформированный XML+документ. Эту строку с помощью функции simplexml_load_string() можно превратить в simpleXML+объект. Чтобы преобразовать значение строковой перемен+ ной $string в simpleXML+объект на основании XML+кода внутри PHP+программы, необходимо использовать код, аналогичный следующему:

<?php

$string = <<<XML

<?xml version='1.0'?> <root_element> <child01>First element</child01> <child02>Second element</child02>

</root_element> XML;

$xml_string = simplexml_load_string($string); ?>

Сначала рассмотрим чтение XML+строки с помощью функции simplexml_load_ string. Все что требуется сделать, это передать в данную функцию строку. Как толь+ ко simpleXML+объект создан, можно использовать его метод asXML() для отображе+ ния правильно сформированной XML+строки.

Ниже приведен пример использования функции simplexml_load_string и ме+ тода asXML объекта simplexml_element. Откройте текстовый редактор и создайте

.php+документ, содержащий следующий код:

<?php

//Метод asXML форматирует данные родительского объекта в //строку XML версии 1.0. Создаем XML-строку

$my_xml_string = <<<XML

<a>

<b>

<c>text content</c> <c>more text content</c> </b>

<d>

<c>even more text content</c> </d>

</a>

XML;

366 Глава 8

//загрузка строки в объект

$xml_object = simplexml_load_string($my_xml_string); //отображение содержимого XML-объекта

echo $xml_object->asXML(); ?>

Сохраните сценарий как create_xml_doc.php и откройте его в браузере. При+ мерный результат показан на рис. 8.4.

Рис. 8.4.

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

Если данные уже записаны в XML+файл, то с помощью функции simplexml_ load_file() содержимое этого файла можно преобразовать в simpleXML+объект. Как бы ни был создан simpleXML+объект, им можно манипулировать с помощью дру+ гих simpleXML+функций.

XML 367

В последующем примере для простоты используется внешний файл, содержащий XML+ строки. Данные строки считываются с помощью функции simplexml_load_file(). На+ пример, чтобы прочитать XML+файл, такой как был создан в начале данной главы, можно использовать функцию simplexml_load_file().

Ниже приводится тот же XML+файл (его следует сохранить как php_programs.xml):

<?xml version="1.0" ?> <php_programs>

<program name="cart"> <price>100</price>

</program>

<program name="survey"> <price>500</price>

</program> </php_programs>

Чтобы прочитать имена и значения элементов и атрибутов в данном XML+документе, используется simpleXML+функция для загрузки файла ++++++ simplexml_load_file(). Те+ перь следует создать PHP+документ (и назвать его, например, simplexml_01.php), а за+ тем присвоить переменной результат выполнения функции simplexml_load_file().

<?php

$php_programs = simplexml_load_file('php_programs.xml');

Данная переменная содержит объект, который можно использовать почти так же, как обычный массив. Чтобы из этой переменной извлечь имена и значения, использу+ ется цикл foreach, который возвращает ключи и значения точно так же, как и в случае обычного массива:

foreach ($php_programs->program as $program_key => $program_val) { echo "Корневой элемент <B>php_programs</B> содержит элемент с именем

<B>$program_key</B><BR>";

Однако вывести содержимое переменной $program_val непосредственно на экран не удастся; в переменной содержится подобный массиву объект, и поэтому снова при+ дется использовать цикл foreach как для дочерних элементов, так и для их атрибутов:

foreach($program_val->children() as $child_of_program_key => $child_of_program_val)

{

if ($child_of_program_key == "price") { foreach($program_val->attributes() as $att => $val) {

if ($att == "name") {

foreach($program_val->price as $the_price) {

echo "Элемент <B>$program_key</B> имеет атрибут с именем <B>$att</B> и значением <B>$val</B>.<BR>";

echo "Элемент <B>$program_key</B> имеет дочерний элемент с именем

<B>$child_of_program_key</B> и значением <B>$the_price</B>.<BR>"; echo "Следовательно, можно сказать, что ключ <B>$child_of_program_key</B> <B>$val</B> <B>$program_key</B> равен

<B>\$$the_price</B>.<BR><BR>";

}

}

}

}

}

}

?>

Результат работы данного сценария представлен на рис. 8.5.

368 Глава 8

Рис. 8.5.

Изменение значений с помощью simpleXML

Можно не только считывать части XML+документа в simpleXML+объект. Кроме этого, можно изменять данные в документе, загруженном в память. Все что требуется сделать, это правильно обратиться к данным, которые нужно изменить, а затем запи+ сать вместо них необходимые значения.

Практика Изменение значения узла

Создайте новый файл, сохраните его как simplexml_change_value.php и вве+ дите в него следующий код:

<?php

$xmlstr = <<<XML

XML 369

<php_programs>

<program name="cart"> <price>100</price>

</program>

<program name="survey"> <price>500</price>

</program> </php_programs> XML;

$first_xml_string = simplexml_load_string($xmlstr); $first_xml_string->program[0]->price = '250';

echo "<pre>"; var_dump($first_xml_string); echo "</pre>";

?>

Сохраните файл, а затем вызовите его в браузере. Результат работы сценария по+ казан на рис. 8.6.

Рис. 8.6.

370 Глава 8

Как это работает

После того как XML+строка считана в переменную $xmlstr, обращаться к частям документа можно почти так же, как если бы документ был массивом, т.е. можно исполь+ зовать имена и индексы для каждого уровня. Очевидно, что program и price ++++++ это элементы и что первая цена должна быть равна 100. Однако во второй строке приве+ денного здесь кода значение изменено на 250, а содержимое элементов распечатывает+ ся на экране с помощью функции var_dump (var_dump ++++++ PHP+функция, которая ото+ бражает структуру и данные PHP+переменных независимо от их типа). Для сохранения форматирования распечатываемых на экране данных используется HTML+тег <PRE>.

$first_xml_string = simplexml_load_string($xmlstr); $first_xml_string->program[0]->price = '250';

echo "<PRE>"; var_dump($first_xml_string); echo "</PRE>";

Практика Импорт DOM с помощью simpleXML

Используя расширение simpleXML, можно получать и создавать DOM+объекты. Создайте файл simplexml_dom.php со следующим кодом:

<?php

$xmlstr = <<<XML

<php_programs>

<program name="cart"> <price>100</price>

</program>

<program name="survey"> <price>500</price>

</program> </php_programs> XML;

$dom = new domDocument; $dom->loadXML($xmlstr);

$s_dom = simplexml_import_dom($dom);

echo "Цена первой программы: <B>$" . $s_dom->program[0]->price . "</B>"; ?>

Сохраните созданный файл и откройте его в браузере. Результат работы сценария показан на рис. 8.7.

Как это работает

Сначала с помощью ключевого слова new из класса domDocument создается новый XML+документ (более подробно создание объекта с помощью ключевого слова new рассматривается в главе 12, ‘‘Введение в объектно+ориентированное программирова+ ние’’). Затем с помощью функции loadXML этого объекта XML+строка передается в DOMDocument+объект. Наконец, на экран выводится содержимое элемента price.

$dom = new domDocument; $dom->loadXML($xmlstr);

$s_dom = simplexml_import_dom($dom);

echo "Цена первой программы: <B>$" . $s_dom->program[0]->price . "</B>";

XML 371

Рис. 8.7.

Резюме

Вданной главе рассматривались основы технологии XML, включая правила фор+ мирования XML+документа, а также определение типа документа (DTD), написанное

вформате EBNF, и обращение к DTD для проверки корректности XML+документа. В главе обсуждалась поддержка пространств имен в XML и ссылки на несколько XML+ схем из одного XML+документа.

Вглаве также рассматривалась документная объектная модель (DOM) ++++++ иерархи+ ческая модель структуры XML+документов, и некоторые PHP+функции, связанные с DOM. Также здесь были описаны некоторые функции PHP4 для использования XML+ анализаторов, а также с новое расширение simpleXML, которое появилось в PHP5.

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

Упражнение

Создайте приложение, которое считывало бы XML+файл с несколькими элемента+ ми и атрибутами в simpleXML+объект, изменяло бы значения некоторых или всех элементов или атрибутов файла, а затем записывало бы модифицированный документ обратно в файл.

9

Введение в базы данных

иSQL

Вдвух последних главах было показано, как PHP+сценарии могут использовать внеш+ ние файлы для хранения и получения данных. Хотя непосредственный доступ к файлам во многих обстоятельствах позволяет решать серьезные задачи, по мере увеличения реше+ ний для хранения данных такой доступ становится все более ограниченным ++++++ что видим, то и получаем, ни больше ни меньше. В конце концов, на плечи разработчика и его сцена+ рия ложится реализация выборки и сортировки данных, а также других операций с дан+ ными, и чем больше данных приходится обрабатывать, тем дольше выполняется сцена+ рий. Это не такая уж большая проблема, если иметь дело с несколькими килобайтами данных, но что произойдет, если эти килобайты превратятся в мегабайты (или даже гигабайты)? Разработчик, намеревающийся создать успешный, популярный, управ+ ляемый данными Web+сайт, действительно должен учитывать такую возможность.

Подумать только: если бы в крупном коммерческом сайте, таком как Amazon, все данные извлекались непосредственно из простых текстовых файлов, то поиск какой+ либо одной книги, не говоря уже о размещении заказа, занял бы несколько месяцев.

Базы данных специально предназначены для решения описанной проблемы. Учи+ тывая их собственные специальные возможности по организации и безупречному хранению данных, базы данных можно представить себе как огромные библиотеки мира IT. Нет необходимости часами просматривать полки пыльных томов, одно только слово, неясное описание ++++++ и на столе немедленно появляется нужная книга.

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

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

Введение в базы данных и SQL 373

вать MySQL ++++++ свободно доступную и широко используемую систему управления база+ ми данных, познакомится с некоторыми PHP+функциями для подключения к MySQL,

атакже для получения и модификации информации в базах данных.

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

Хранение данных

В начале работы над управляемым данными приложением разработчик вынужден определиться с тем, какое хранилище данных будет использоваться в этом приложе+ нии. Иначе говоря, как и где приложение будет сохранять данные. Правильный ответ на этот вопрос всегда зависит от требований, предъявляемых к разрабатываемому приложению. В самом простом случае следует задать себе следующие вопросы:

Велико ли количество используемых приложением данных?

Высока ли частота доступа приложения к данным?

Высока ли частота модификаций данных?

Много ли пользователей могут одновременно попытаться получить данные?

Увеличивается ли количество данных со временем?

Велики ли будут потери в случае искажения, похищения или неумышленного уничтожения данных?

Если ответ на любой из этих вопросов положительный, то, вероятно, хранения данных в простых текстовых файлах придется избегать.

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

Часто наиболее эффективной альтернативой этому способу является использование для хранения, получения и модификации информации базы данных или, точнее, систе+ мы управления базами данных (СУБД). Хорошая система управления базами данных от+ лично справляется с ролью эффективного посредника между пользователем и данными. Она организовывает, каталогизирует, резервирует и выполняет целый ряд других опе+ раций, которые направлены на то, чтобы ускорить и облегчить работу с данными.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]