PHP – простое в употреблении, легкое и бесплатное средство для
динамического построения страниц HTML на сервере, перед передачей клиенту
в браузер. PHP умеет обращаться в СУБД Oracle, и это делает его хорошим
кандидатом для разработки приложений web на основе Oracle малой и средней
сложности.
Введение
СУБД Oracle, когда против желания фирмы-изготовителя, а когда согласно
– в зависимости от направления политических ветров в конкретные периоды
времени, – никогда, кроме начального периода своего существования, не была
полностью закрытой системой. Например, с момента возникновения движения
свободного ПО, разработки, ведущиеся открытым образом («открытыми
текстами»), все время держали эту СУБД в зоне своих интересов. Когда
некоторые представители такого ПО стали достаточно зрелыми, фирма Oracle,
подобно другим крупным фирмам, «легализовала» связь своей СУБД с ними: ОС
Linux входит в число стратегических платформ для Oracle, web-сервер Apache
входит в состав штатной поставки; там же можно обнаружить следы Perl и
Tcl, нашедших себе место во внутреннх процессах установки (OUI) и
администрирования (OEM). Эти средства помогают организовать взаимодействие
с Oracle вместо средств собственной разработки (например, Developer) или в
дополнение к ним.
PHP принадлежит к числу средств открытого ПО,
вполне состоявшихся, востребованность которых непрерывно растет (см. http://www.php.net/usage.php). PHP
позволяет динамически формировать страницы HTML на сервере web. В этом
качестве он занимает нишу, общую с Perl, Mason, Aquaruim (все –
свободное ПО) и сервлетами (например, с JavaServer Pages). Сервером web
может быть Apache, IIS или же еще несколько разновидностей. Здесь нам
важно, что PHP умеет обращаться к СУБД Oracle и что это легкая и простая
система.
Установка Oracle
Дальнейшие примеры будут приведены для включения поддержки Oracle в PHP. Можно использовать версию Apache со штатного установочного комплекта СУБД
Oracle (в версии Oracle 10.1 – на Companion CD). Дежурное напоминание: для
промышленного использования сервера web лучше все же взять последнюю
версию Apache из сети, так как она более функциональна, надежна и
защищена.
В Unix потребуется построить библиотеки
программой make.
Найдите файл php.ini. Скорее всего он в каталоге c:\WINNT. Найдите
параметр extension_dir и снимите комментарии (;) со строк:
;extension=php_oci8.dll
;extension=php_oracle.dll
;extension=php_dbase.dll
Последний параметр требуется раскомментарить только если вы намерены
проиграть следующий далее пример с записью данных в формате dbf.
Копирование файлов динамических модулей
В соответствии с указанным в php.ini значением параметра extension_dir
скопируем файлы:
move
extensions\php_oci8.dll sapi
move
extensions\php_oracle.dll sapi
Перезапуск Apache и проверка
Осталось перезапустить Apache. Это можно сделать либо с помощью меню
Start, либо через останов и запуск службы Windows. Если все проделано
правильно, при запуске не будет ошибок.
Составим файл test.php:
<?php phpinfo(); ?>
Наберем в браузере
адрес http://localhost/test.php. Если ошибок не имеется, значит модули *.dll для Oracle установлены правильно.
Посмотрим, как может выполняться обращение к данным в Oracle.
Работа с Oracle
Обращение с помощью PHP к данным в Oracle может осуществляться через
CGI или через специальные функции. Первая возможность рискована с точки
зрения безопасности и здесь не рассматривается.
Вторая, в свою очередь, реализуется двумя имеющимися библиотеками:
php_oracle и php_oci8, из которых вторая считается более эффективной.
Продемонстрировать ту и другую можно на примере файла employees.php:
<html>
<head><title>Access to Oracle from
php</title></head>
<body>
<h3>The two types of
Access to Oracle from php:</h3>
Этот пример для наглядности упрощен, а в жизни нужно будет больше
уделить места обработке ошибок и структуризации кода.
Вот пример вставки записи в БД. Данные передаются через строку запроса
HTTP. Это позволяет организовать в приложении содержательный диалог,
подключив средства ввода форм HTML.
Подготовим файл insert.php:
<html>
<head><title>Access to Oracle from
php</title></head>
<body>
<h3>INSERT
example:</h3>
<?php
if ($c = OCILogon("scott",
"tiger", "orcl")) {
$name =
(string)$_REQUEST['empname'];
$no =
(int)$_REQUEST['empno'];
$query = "INSERT INTO emp
(ename, empno) VALUES (:bind1, :bind2)";
$s = OCIParse($c, $query);
OCIBindByName($s, ":bind1",
$name);
OCIBindByName($s, ":bind2",
$no);
OCIExecute($s,
OCI_DEFAULT);
OCICommit($c);
OCILogoff($c);
}
?>
Done.
<hr/>
</body>
</html>
Поместим файл в htdocs и обратимся по адресу http://localhost/insert.php?empname=Вася&empno=1111.
В SQL*Plus или предыдущей страницей PHP можно проверить результат.
Обратите внимание на то, что в приведенном примере никак не обрабатывается
(а) блокировка строк, возможно мешающая вставке и (б) возможный конфликт
первичного ключа.
Oracle, да не
только
Как говорилось выше, PHP имеет функции обращения к данным отнюдь не
только в Oracle. Наличие этих функций дает возможным использования этого
инструмента достаточно экзотично, например для переноса данных между
Oracle и другими системами. Например, нередко стоит задача переноса из
формата dbf в БД под управлением Oracle или наоборот. Вот как ее можно
решить «на коленке». Обратите внимание, что перенос инициируется из окошка
браузера, а выполняется целиком на узле web.
Составим файл dbase.php:
<html>
<head><title>Access from php to different data
bases</title></head>
<body>
<h3>Distant data
transfer from Oracle to dbf:</h3>
<?php
$dbname =
"c:/fromoracle.dbf";
$def =
array(
array("ename", "C", 10),
array("sal", "N", 7, 2)
);
$dbid =
dbase_create($dbname, $def);
if (!$dbid) echo "Failed to
open dbf."
?>
<?php
if ($c=OCILogon("scott",
"tiger", "orcl")) {
$s = OCIParse($c, "select
ename, sal from emp");
OCIExecute($s,
OCI_DEFAULT);
while (OCIFetch($s)) {
$rec[1] = ociresult($s,
"ENAME");
$rec[2] = ociresult($s,
"SAL");
if
(!dbase_add_record($dbid, array($rec[1],$rec[2])))
echo "Failed to add a
record. ";
}
OCILogoff($c);
}
?>
Done.
<hr/>
</body>
</html>
Обратимся по адресу: http://localhost/dbase.php.
В корневом каталоге с: должен появиться файл fromoracle.dbf с данными, полученными
из Oracle. Обратное преобразование можно проделать в качестве упражнения.
Таким же образом можно обращаться к mySQL, PostgreSQL, Sybase, SQL
Server и другим системам управления данными и по ODBC.