![]() |
![]() |
![]() |
Включение внешних источников данных При включении внешних источников данных, входящих в конфигурацию 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. Параметры подключения к базе данных
В значении атрибута 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> |
![]() |
![]() |
![]() |