Oracle и PHP - это очень просто
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. В этом
качестве он занимает нишу, общую с EmbPerl, Mason, Aquaruim (все -
свободное ПО) и сервлетами (например, с JavaServer Pages). Сервером
web может быть Apache, IIS или же еще несколько разновидностей.
Здесь нам важно, что PHP умеет обращаться к СУБД Oracle и что это легкая и
простая система.
Установка PHP
Дальнейшие примеры будут приведены для связки Windows +
Apache. Удобнее всего использовать версию Apache со штатного
установочного комплекта СУБД Oracle (в версии Oracle 10.1 - на Companion
CD). Дежурное напоминание: для промыщленного использования
сервера web лучше все же взять последнюю версию Apache из сети, так как
она более функциональна, надежна и защищена.
Версию PHP можно скачать с узла http://www.php.net/.
Там же имеются документация, учебные материалы, форумы и ссылки на
ресурсы, в числе которых есть русскоязычные. К примеру, для Windows
можно скачать файл php-4.3.6-Win32.zip. Его нужно поместить в
каталог, например c:\php, и разархивировать. Далее можно следовать
инструкциям в install.txt, однако само ПО PHP уже установлено. В
Unix еще потребуется построить библиотеки программой make.
Правка файла конфигурации PHP
Найдите файл php.ini. Скорее всего он в каталоге
c:\WINNT. Найдите параметр extension_dir и проставьте
extension_dir = "C:\php\php-4.3.6-Win32\sapi"
Снимите комментарии со строк
;extension=php_oci8.dll ;extension=php_oracle.dll ;extension=php_dbase.dll
Последний параметр требуется раскомментарить только если
вы намерены проиграть следующий далее пример с записью данных в формате
dbf.
Правка файла конфигурации Apache
Найдите файл httpd.conf. Скорее всего он в каталоге
%ORACLE_HOME%\Apache\Apache\conf. Добавьте строки:
LoadModule php4_module
C:/php/php-4.3.6-Win32/sapi/php4apache.dll AddModule
mod_php4.c AddType application/x-httpd-php .php
Последний параметр уже присутствует в виде комментария, и для него
достаточно просто знак комментария снять.
Копирование файлов динамических модулей
В соответствии с указанным в php.ini значением параметра
extension_dir скопируем файлы:
c: cd \php\php-4.3.0-Win32 move php4ts.dll sapi move
extensions\php_oci8.dll sapi move extensions\php_oracle.dll sapi
Перезапуск Apache и проверка
Осталось перезапустить Apache. Это можно сделать либо с помощью
меню Start, либо через останов и запуск службы Windows. Если все
проделано правильно, при запуске не будет ошибок.
Составим файл test.php:
<html> <head><title>My test for
php</title></head> <body> <h3>This is a test
how php works</h3>
<?php phpinfo()?>
<?php $currtime = time (); $currtimestr = strftime
("%H:%M:%S", $currtime); echo "The current time is:
$currtimestr"; ?>
</body> </html>
Поместим файл в %ORACLE_HOME%\Apache\Apache\htdocs. Наберем в
браузере адрес http://localhost:7778/test.php (в версии Oracle 8 номер
порта или убрать, или указать 80).
Некоторые возможности PHP
PHP, конечно, не столь универсальный язык, как Java, используемая в
JavaServer Pages, но достаточно богат. Описание его можно найти в
книгах, например в http://www.ccas.ru/~prz/ORA/phppr.html, или на
вышеуказанной официальной странице PHP в интернете. Вот некоторые
особенности языка.
Вставки PHP в текст HTML можно оформлять не только как <?php ...
?> (см. выше), но и проще как <? ... ?> (что не рекомендуется)
или же как <script language="php"> ... </script> (что
длиннее).
phpinfo() в примере выше - встроенная функция PHP. Регистр,
которым набираются имена функций в PHP несущественен, а для переменных
(предваряются знаком $, $currtime и $currtimestr в примере выше) наоборот,
существенен.
Переменные могут быть типов целого, плавающего, строка, массив, объект
и булевского. Возможно явное преобразование типов. Выражения и
операторы похожи на используемые в C и Perl.
Набор функций достаточно широк и позволяет производить вычисления (в
том числе с произвольной точностью), обращаться к файлам ОС и к различным
базам данных, к сетевым ресурсам (например, по ftp) и к серверам LDAP,
рисовать изображения и динамически выводить данные в формате pdf и многое
другое. Вот несколько примеров функций, на вскидку:
- string crypt(string str, [, string salt]) - шифрование строки по
алгоритму DES, наприме перед помещением ее в БД (для шифрования разными
методами есть и другие функции) - int syslog(int priority, string
message) - посылка сообщения в журнал ОС - int xml_parse(int
parser, string data[, int is_final]) - синтаксический разбор документа
XML
Посмотрим, как может выполняться обращение к данным в 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>
<?php
if ($c = OCILogon("scott", "tiger", "orcl")) {
$s = OCIParse($c, "select ename, sal from emp");
OCIExecute($s, OCI_DEFAULT);
while (OCIFetch($s)) {
echo "ename = " . ociresult($s, "ENAME") .
", sal = " . ociresult($s, "SAL") . "<br/>";
}
OCILogoff($c);
} else {
$err = OCIError(); echo "Oracle Connect Error " . $err[text];
}
?>
<hr/>
<?php
if ($c = ora_logon("scott@orcl","tiger")) {
$curs = ora_do($c, "SELECT ename, sal FROM emp");
while (ora_fetch($curs)) {
echo "ename = " . ora_getcolumn($curs, 0) .
", sal = " . ora_getcolumn($curs, 1) . "<br/>";
}
ora_logoff($c);
} else {
echo "Oracle Connect Error " . ora_error();
}
?>
<hr/>
</body>
</html>
Снова поместим файл в htdocs и обратимся по адресу http://localhost:7778/employees.php.
Этот пример для наглядности упрощен, а в жизни нужно
будет больше уделить места обработке ошибок и структуризации кода.
Вот пример вставки записи в БД. Данные передаются
через строку запроса 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:7778/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>
Поместим файл в htdocs и обратимся по адресу http://localhost:7778/dbase.php. В каталоге с:
должен появиться файл fromoracle.dbf с данными, полученными из
Oracle. Обратное преобразование можно проделать в качестве
упражнения.
Таким же образом можно обращаться к mySQL, PostgreSQL,
Sybase, SQL Server и другим системам управления данными и по ODBC.
Автор: Владимир Пржиялковский
Источник: www.citforum.ru
|