Включение внешних источников данных
При включении внешних источников данных, входящих в конфигурацию Apache, тег <include> вызывается с методом URI или local. В обоих случаях выполняется подзапрос к Apache, то есть включение обрабатывается как прямой запрос Apache, результаты которого вставляются в позицию тега <include> документа LXP.
Принципиальное различие между этими двумя способами заключается в том, что метод URI получает атрибут src в том виде, в котором Apache получает его от браузера — с начальным символом / и заданным по отношению к корневому каталогу хоста (например, /example.php). С другой стороны, при использовании метода local серверу Apache передается информация о местонахождении файла в локальной файловой системе (например, /home/web/example.php).
В листинге 13.26 приведен файл LXP с двумя вариантами включения сценария РНР. В обоих случаях включение производится с участием Apache и потому зависит от правильной настройки запрашиваемого типа данных в Apache. Это особенно важно для метода local, требующего наличия соответствующих прав доступа к каталогу, содержащему включаемый сценарий.
Листинг 13.26. Включение внешних данных
<1хр>
An example PHP scnpt:<br />
<include src="/example.php" method="URI" />
<hr />
The same PHP script, using the local method:<br />
<include src="/home/web/default/example.php" method="local" />
</lxp>
Если при включении документа, заданного атрибутом src, атрибут method отсутствует, а имя документа завершается одним из стандартных расширений РНР (.php, .php3 и .phtml), по умолчанию выбирается метод local. В LXP 0.8 метод URI не выбирается по умолчанию. Чтобы использовать метод URI, необходимо передать в теге <1nclude> атрибут method="URI".
Включение данных SQL
Метод SQL обладает исключительно широкими возможностями в области непосредственного взаимодействия с PostgreSQL. В частности, он позволяет внедрять динамические результаты запросов к базе данных в web-страницу, не прибегая к языку программирования, создавать программные объекты подключений или команд и даже производить лексический разбор и форматирование результатов.
Метод SQL выбирается включением BTcr<include> атрибутаmethod="SQL". Кроме того, этот метод выбирается по умолчанию при передаче атрибута sql с выполняемой командой SQL. В следующем примере используется второй вариант, то есть метод SQL подразумевается благодаря атрибуту sql:
<include sql="SELECT * FROM pg_database">
По аналогии с методами лексического разбора данных, блок между открывающим и закрывающим тегами <1 ncl ude> выполняется для всех записей, полученных в результате успешно выполненного запроса SQL.
Выбор базы данных
При использовании метода SQL атрибут src тега <indude> определяет базу данных, с которой выполняется операция. Если атрибут не указан, LXP пытается восстановить устойчивое подключение к базе данных (если оно существует).
ПРИМЕЧАНИЕ
Хотя для каждого процесса Apache httpd существует одно устойчивое подключение к базе данных, на самом деле за его поддержанием следит модуль LXP, а не Apache.
Формат строки подключения хорошо знаком всем, кому доводилось подключаться к PostgreSQL из программ С или РНР. Строка содержит несколько параметров, описывающих источник данных. Параметры подключения перечислены в табл. 13.2.
Таблица 13.2. Параметры подключения к базе данных
Параметр | Описание |
dbname |
Имя базы данных (по умолчанию совпадает с именем подключающегося пользователя) |
host |
Имя хоста |
user |
Имя пользователя (по умолчанию совпадает с именем, под которым работает Apache) |
password |
Пароль (если аутентификация обязательна) |
port |
Порт (по умолчанию 5432) |
В значении атрибута src параметры разделяются пробелами, а имя параметра отделяется от его значения знаком равенства (=). Порядок перечисления параметров не важен.
В листинге 13.27 приведен пример запроса SQL с подключением к базе данных example на сервере db_server под именем пользователя John.
Листинг 13.27. Подключение к базе данных
<1хр>
<include sql-"SELECT * FROM users ORDER BY username ASC"
src="dbname=example host=db_server user=john">
User: <field /><br />
</include>
</lxp>
ВНИМАНИЕ
В LXP 0.8 при вложении подключения SQL в другое подключение SQL во вложенном теге обязательно определяется атрибут src, даже если подключение производится к базе данных по умолчанию. В LXP 0.8.1 этот недостаток исправлен.
Работа с полями
При итеративном выполнении блока включения SQL возможны два варианта обращения к значениям полей: можно воспользоваться общим тегом <f lei d> или объектом this, который заполняется значениями всех полей для текущей итерации.
Как и при включении XML, тег <field> может содержать атрибут name, идентифицирующий выводимое поле. В противном случае поля выводятся последовательными тегами <field> в порядке их перечисления в запросе (слева направо).
Кроме того, к значениям полей можно обращаться при помощи конструкции this. поле, где поле — имя поля. Например, во включенном блоке SQL следующие два тега выводят одинаковый результат:
<field name="id" /> <putvar name="this.id" />
Объект this поддерживается в основном ради применения условных тегов и подстановки переменных с данными, возвращаемыми в итоговых наборах SQL. В листинге 13.28 приведен пример запроса SQL и форматирования выходных данных с применением условных тегов.
Листинг 13.28. Включение результатов запроса SQL
<1хр>
<1nclude sql="SELECT datname. datdba AS userjd FROM pg_database">
<if this.user_id="$userid">
<strong><field /></strong><br />
<setvar owned_databases="$owned_databases @this.datname" /> </if> <else>
<f1eld /><br />
</else>
</include>
</1 xp>
Работа с метаданными SQL
При выполнении запросов SQL объект LXP с именем sql заполняется информацией о полученном итоговом наборе. Он содержит переменные sql .numrows, sql .numcols, sql .numfields (псевдоним для sql .numcols), sql .rown sql .offset.
Переменная sql. numrows содержит количество записей, полученных в результате запроса. Переменная sql .numcols (атакже ее псевдоним sql .numfields) содержит количество полей в каждой записи. При итеративном выполнении блока, заключенного между <1nclude> и </1nclude>, переменная sql. row содержит числовой индекс текущей записи, начиная с 1, а переменная sql .offset — числовой индекс, начиная с 0.
В листинге 13.29 переменная sql .row используется для вывода индекса текущей записи в блоке <include>. После вывода результатов запроса переменная sql .numrows выводит количество выбранных записей.
Листинг 13.29. Использование объектной переменной sql
<1хр>
<include sqVSELECT * FROM pg_user ORDER BY usename LIMIT 5">
User #<putvar name="sql .row" />: <putvar name="this.usename" /><br />
</include>
<br />
Selected <putvar name="sql.numrows" /> rows.
</lxp>
Результат выполнения листинга 13.29 выглядит так:
User #i: al!en<br />
User #2: barbara<br />
User #3: ben<br />
User #4: corwin<br />
User #5: david<br />
<br />
Selected 5 rows.
Присваивание значений объектным переменным SQL
Если запрос SQL должен выполняться только для получения доступа к итоговому набору (в обход автоматического перебора в теге <include>), передайте атрибут setvars с именем объекта LXP, заполняемого информацией о результатах запроса, и немедленно закройте блок парным тегом </include>.
Если итоговый набор состоит из одной записи, для каждого поля этой записи создается переменная объект.поле, где объект — имя объекта, указанное в атрибуте servars, а поле — имя поля, возвращаемого запросом.
Если итоговый набор содержит более одной записи, к имени поля присоединяются квадратные скобки с индексом (например, object, col umn[0], object, col umn[l] и т. д.).
В листинге 13.30 выполняется запрос к таблице pg_user с выборкой трех полей, содержащей информацию о конкретном пользователе.
Листинг 13.30. Заполнение объекта LXP результатами выборки
<1хр>
<include sql="SELECT usenarne. usesuper. usecreatedb
FROM pg_user
WHERE usesysid = Suserid"
setvars="usennfo"></include>
<1f sql,numrows="l">
User name: <putvar name="usennfo.usename"><br />
<if userinfo.usecreatedb-'t'>
<strong>This user can create databases.</strong><br />
</if>
<if userinfo.usesuper='t'>
<strong>Trns user is a superuser.</strong><br />
</1f>
</1f>
<else>
Error: No user was found.
</else>
</lxp>