Самоучитель по SQL-сервер в Linux

         

Включение внешних источников данных

При включении внешних источников данных, входящих в конфигурацию 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>



Содержание раздела