среда, 23 января 2019 г.

Oracle и PHP - это очень просто!

Oracle и PHP - это очень просто!

Автор: Владимир Пржиялковский
Владимир Пржиялковский , преподаватель технологий Oracle
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 и снимите комментарии (;) со строк:
; Расширение = php_oci8.dll
; Расширение = php_oracle.dll
; Расширение = php_dbase.dll
Последний параметр требуется раскомментарить только если вы намерены проиграть следующий далее пример с записью данных в формате dbf.
Копирование файлов динамических модулей
В соответствии с указанным в php.ini значением параметра extension_dir скопируем файлы:
переместить расширения \ php_oci8.dll корова
переместить расширения \ 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> Доступ к Oracle с php </ title> </ head>
<Тело>
<h3> Два типа доступа к Oracle из php: </ h3>
<? PHP
if ($ c = OCILogon ("скотт", "тигр", "orcl")) {
$ s = OCIParse ($ c, "выберите ename, sal from emp");
OCIExecute ($ s, OCI_DEFAULT);
while (OCIFetch ($ s)) {
echo "ename =". ociresult ($ s, "ENAME").
", Сал =". ociresult ($ s, "SAL"). "<br/>";
}
OCILogoff ($ с);
} еще {
$ err = OCIError (); эхо "Ошибка Oracle Connect". $ ERR [Текст];
}
?>
<Ч />
<? PHP
if ($ c = ora_logon ("scott @ orcl", "tiger")) {
$ curs = ora_do ($ c, "SELECT ename, sal FROM emp");
while (time_fetch ($ course)) {
echo "ename =". ora_getcolumn ($ curs, 0).
", Сал =". ora_getcolumn ($ curs, 1). "<br/>";
}
ora_logoff ($ с);
} еще {
эхо "Ошибка Oracle Connect". ora_error ();
}
?>
<Ч />
</ Body>
</ Html>
Обратимся по адресу Http: //localhost/employees.php.
Этот пример для наглядности упрощен, а в жизни нужно будет больше уделить места обработке ошибок и структуризации кода.
Вот пример вставки записи в БД. Данные передаются через строку запроса HTTP. Это позволяет организовать в приложении содержательный диалог, подключив средства ввода форм HTML.
Подготовим файл insert.php:
<HTML>
<head> <title> Доступ к Oracle с php </ title> </ head>
<Тело>
<h3> Пример INSERT: </ h3>
<? PHP
if ($ c = OCILogon ("скотт", "тигр", "orcl")) {
$ name = (строка) $ _ 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 ($ с);
OCILogoff ($ с);
}
?>
Готово.
<Ч />
</ 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> Доступ с php к различным базам данных </ title> </ head>
<Тело>
<h3> Удаленная передача данных из Oracle в dbf: </ h3>
<? PHP
$ dbname = "c: /fromoracle.dbf";
$ def =
массив (
массив ("ename", "C", 10),
массив ("sal", "N", 7, 2)
);
$ dbid = dbase_create ($ dbname, $ def);
if (! $ dbid) echo "Не удалось открыть dbf."
?>
<? PHP
if ($ c = OCILogon ("скотт", "тигр", "orcl")) {
$ s = OCIParse ($ c, "выберите 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, массив ($ rec [1], $ rec [2])))
echo "Не удалось добавить запись.";
}
OCILogoff ($ с);
}
?>
Готово.
<Ч />
</ Body>
</ Html>
Обратимся по адресу: Http: //localhost/dbase.php. В корневом каталоге с: должен появиться файл fromoracle.dbf с данными, полученными из Oracle. Обратное преобразование можно проделать в качестве упражнения.
Таким же образом можно обращаться к mySQL, PostgreSQL, Sybase, SQL Server и другим системам управления данными и по ODBC.