Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Обработка запросов к БД при помощи PEAR::XML

Источник: realcoding.net

[1 страница]
Уважаемые читатели, обратите внимание: это не продолжение серии "Всеобъемлющая история шаблонов". Это отдельная статья. Следующая статья про шаблоны появится чуть позже.

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

Скажем, как после добавления в проект поддержки XSLT формировать в XML данные, получаемые из базы? Оказывается, что делать это при помощи класса шаблона ничуть не проще, чем составлять документ прямо в скрипте:

<?php

$result
= mysql_query(SELECT DATE_FORMAT(news_date, %e.%c.%Y) AS date_typed,
    DATE_FORMAT(news_date, %d.%m.%Y) AS date_url, title, announce FROM news
    ORDER BY news_date DESC LIMIT 10
);

if(!
mysql_error()) {
   
$xml .= rn;

    while(
$row = mysql_fetch_assoc($result))
       
$xml .=
            
                {$row[date_url]}
                {$row[date_typed]}
               
                {$row[announce]}
            rn
;

   
$xml .= rn;
    }

?>

Согласитесь, с классом шаблона мы получили бы примерно тот же объём кода (а ещё файлы .tpl на диске).

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

Размышление: Если вы хотите решить какую-то проблему на php, поищите в архивах скриптов — скорее всего для вашей задачи найдётся уже готовое решение. Чужой скрипт, конечно, не будет идеальным решением (потому что наилучшим приближением к идеалу будет решение, написанное специально для задачи), но, скорее всего, будет пригодно к использованию. Вы можете быть противником применения чужого кода в своих проектах, либо не быть уверены в том, что найденный код будет работать как надо (разработчики PEAR, как известно, предупреждают, что весь их проект — вечная бета). Однако посмотреть, как чужой скрипт работает, будет полезно, чтобы написать свой собственный. Заглянув в чужой код, и профессиональный разработчик, и разработчик среднего уровня смогут лучше понять подходы к решению задачи и написать своё собственное, если это понадобится.

В конце сентября, прочитав присланный мне материал про PEAR::DB, я решил поискать на PEAR и класс для автоматического преобразования результатов запроса к базе данных в XML. В разделе XML я нашёл класс, созданный как раз для моей проблемы — XML_sql2xml.

Класс использует для доступа к базам данных другой класс библиотеки PEAR — PEAR::DB. Для операций с XML-документом использует функции DOM XML (это требует установки соответствующего модуля php). Преобразует результат запроса в XML-дерево и возвращает его либо как текст XML-документа, либо как DOM-объект.

Установка PEAR


Тема не была серьёзно описана в материале о PEAR::DB, поэтому будем разбираться.

Библиотеки PEAR раньше распространялись с дистрибутивом php, но больше этого не будет — видимо, чтобы устаревшие версии классов не распространялись с дистрибутивами php, их оттуда убрали. Теперь архивы с классами нужно брать с сервера pear.php.net.

Проблемы с установкой PEAR вызваны тем, что во всех его файлах указываются пути относительно корня директории pear, то есть для вызова PEAR::DB делается команда

include_once(DB/${type}.php);

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

Как вы могли увидеть из строки кода выше, файлы подключаются относительно include_path (который по умолчанию является директорией, из которой работает скрипт, либо директорией, в которую установлен PEAR). Если в проекте include_path устанавливается, вам повезло. Можно положить вызываемые скрипты в эту директорию и наслаждаться жизнью.

Если include_path не устанавливается, его можно установить в .htaccess такой строкой:

php_value include_path my_dir/pear

Вместо my_dir поставьте адрес нужной директории. Можно поменять include_path "на лету" в скрипте:

<?php

ini_set
(include_path, my_dir/pear);

include(
DB.php);

$dsn = mysql://user:pass@host/db_name;
$db = DB::connect($dsn, true);

if (
DB::isError($db)) {
    die (
$db->getMessage());
}

$db->setFetchMode(DB_FETCHMODE_ASSOC);

ini_restore(include_path);

?>

После подключения файлов PEAR лучше вернуть include_path на место командой ini_restore. В комментариях к предыдущей статье меня спросили, зачем нужен ini_restore. Во-первых, у меня все скрипты работают из корня сайта, а подключаемые файлы находятся в разных директориях (например, содержимое страницы сайта может быть статичным XML-файлом, а может быть скриптом, который будет вызываться основными скриптами). Пути к подключаемым файлам я указываю тоже от корня. PEAR на сайте появилась не сразу, поэтому ini_restore нужен, чтобы подключить библиотеку, и это не мешало остальным скриптам работать по-старому. Во-вторых, в php.ini или в .htaccess может указываться путь к директории с подключаемыми файлами, а PEAR, по-моему, лучше положить в отдельную директорию, чтобы библиотека не захламляла рабочую. Впрочем, каждый делает как ему удобнее.

Однако хостинг-провайдер может держать php в безопасном режиме, который запрещает менять include_path. В таком случае, конечно, можно попробовать положить файлы PEAR в корень сайта или вручную править все include в файлах — больше ничем разработчики помочь не могут. В новостях PEAR пишут, что Стиг Баккен сообщил о плане добавить новую директиву {get,set,restore}_include_path(), чтобы можно было менять iclude_path даже в безопасном режиме.

DOM XML в PHP


DOM (Document Object Model) — модель работы с документом, в которой документ содержит объекты, которыми можно манипулировать. Модель DOM является стандартом W3C. Функции DOM XML в php — это одна из реализаций данной модели.

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

Стандартный модуль php_domxml не поддерживает кириллицу. При работе с ним вам придётся конвертировать данные на входе в UTF-8, а на выходе — обрабатывать сущности вроде &x440;. Чтобы установить DOM XML с поддержкой кириллицы на рабочей машине под Win32, рекомендую скачать мой архив, в котором находится модуль php_domxml скомпилированный с поддержкой кириллицы и необходимые для его работы библиотеки iconv, libxml, libxslt и libexslt. Положите файл php_domxml.dll в extenstion_dir, а остальные библиотеки — в директорию c:windowssystem.

Несколько примеров по работе с DOM XML:

<?php

// Создание XML-документа
$xmldoc = domxml_new_doc(1.0);

// В условиях документа создаётся элемент под названием my_root.
$my_element = $xmldoc->create_element(my_root);

// Затем этот элемент присоединяется к документу как узел-потомок. До этой операции в
//документе нет корневого узла!
$my_root = $xmldoc->append_child($my_element);

// Создаётся ещё один элемент — текст и добавляется как потомок к корневому узлу.
$my_element = $xmldoc->create_text_node(iconv(windows-1251, UTF-8, Это содержимое
//корневого узла XML-документа.
));
$my_root->append_child($my_element);

// XML-документ преобразуется в текстовый вид и выводится
print($xmldoc->dump_mem());

?>

К сожалению, в приведённом примере возникнут проблемы с русскими символами — на выходе они опять превращаются в &xXXX;. Чтобы модуль domxml понял, что идёт работа с русской кодировкой, нужно на входе дать XML-документ с параметром encoding="windows-1251" вот так:



Похожие статьи:
- Руководство по TCP/IP для начинающих
- Протокол PPP
- Спецификация и функции DOM в PHP
- Отрисовка связанного дерева с помощью XSLT - как с умом использовать XSLT и XPath
- ADODB – русская документация (часть 1)
- Хранение древовидных структур в Базах данных (Nested Sets)
- Обработка запросов к БД при помощи PEAR::XML
- Дополнительные возможности JpGraph
- Установка и конфигурация веб сервера Apache с поддержкой PHP, JSP и MySQL на Windows XP
- Установка и конфигурация веб сервера Apache с поддержкой PHP, JSP и MySQL на Windows XP
- Парсинг на Perl
- Perl & XML. Библиотека программиста
- Генерация контента сайта с использованием Template Toolkit


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.002]