Основы PHP
  Что такое PHP?
  Возможности PHP
  Преимущества PHP
  История развития
  Что нового в PHP5?
  «Движок» PHP
  Переход на PHP 5.3
New Переход на PHP 5.6
  Введение в PHP
  Изучение PHP
  Основы CGI
  Синтаксис PHP
  Типы данных PHP
  Переменные в PHP
  Константы PHP
  Выражения PHP
  Операторы PHP
  Конструкции PHP
  Ссылки в PHP
  PHP и ООП
  Безопасность
  Функции PHP
  Функции по категориям
  Функции по алфавиту
  Стандартные функции
  Пользовательские
  PHP и HTTP
  Работа с формами
  PHP и Upload
  PHP и Cookies
  PHP и базы данных
  PHP и MySQL
  Документация MySQL
  Учебники
  Учебники по PHP
  Учебники по MySQL
  Другие учебники
  Уроки PHP
  Введение
  Самые основы
  Управление
  Функции
  Документация
  Математика
  Файлы
  Основы SQL
  Дата и время
  CURL
  Изображения
  Стили
  Безопасность
  Установка
  Проектирование БД
  Регулярные выражения
  Подготовка к работе
  Быстрый старт
  Установка PHP
  Установка MySQL
  Конфигурация PHP
  Download / Скачать
  Скачать Apache
  Скачать PHP
  Скачать PECL
  Скачать PEAR
  Скачать MySQL
  Редакторы PHP
  Полезные утилиты
  Документация
  PHP скрипты
  Скачать скрипты
  Инструменты
  PHP в примерах
  Новости портала
 Главная   »  Сборник статей
 
 

Работа с Oracle в PHP

Автор: Frank Naude
Перевод: Александр Войцеховский

Обсуждаемые вопросы:

Что такое PHP и что необходимо иметь для работы с Oracle?

PHP - рекурсивный акроним "PHP Hypertext Preprocessor". Это интерпретируемый язык программирования с открытым исходным кодом. Он предназначен для генерации веб-документов на сервере.

Этот документ описывает, как PHP взаимодействует с базой данных Oracle. Подразумевается, что у Вас уже установлен и настроен PHP. Проверить его работоспособность можно следующим скриптом:

<html>
<p>If PHP is working, you will see "Hello World" below:<hr>
<? php
   
echo "Hello world";
   
phpinfo();  // Print PHP version and config info
?>
</html>

Попробуйте выполнить этот код из командной строки либо откройте тестовую страницу в Вашем браузере. Если приведенный выше пример не работает, отложите этот документ и добейтесь корректной работы PHP.

В чем разница между модулями OCI и ORA?

В дистрибутив PHP входят два модуля, предназначенных для работы с PHP:

  • Стандартные Oracle-функции (ORA)
  • Интерфейс для доступа к функциям Oracle (OCI)

    Если есть возможность выбора, предпочтение стоит отдать модулю OCI, так как он более оптимизирован и имеет большую функциональность. К примеру, модуль ORA не поддерживает CLOB, BLOB, BFILE, ROWID.

    Как собрать PHP с поддержкой Oracle?

    Для того, что бы получить работоспособную связку PHP & Oracle, необходимо выполнить следующие шаги:

  • Скачать дистрибутив PHP с официального сайта www.php.net, установить его на сервер и убедиться в его работоспособности
  • Установить клиент Oracle на Ваш сервер и настроить подключение к Вашей базе данных
  • Если у Вас Windows-сервер, раскомментируйте следующие строки в файле php.ini:
    ;extension = php_oci8.dll
    ;extension = php_oracle.dll
      

    Также убедитесь в том, чтобы extension_dir указывала на директорию, содержащую указанные модули.

    Если у Вас Linux-сервер, пересоберите PHP с одной из опций:

    --with-oracle=/path/to/oracle/home/dir
    --with-oci8=/path/to/oracle/home/dir
      
  • Напишите небольшой тестовый скрипт, чтобы убедится в том, что установка завершилась успешно. В качестве тестового скрипта можно взять пример из следующего вопроса.

Как подключится к базе данных?

Если вы используете модуль OCI, воспользуйтесь следующим кодом:

<?php
if ($c=OCILogon("scott", "tiger", "orcl")) {
  echo
"Successfully connected to Oracle.\n";
  
OCILogoff($c);
} else {
  
$err = OCIError();
  echo
"Oracle Connect Error " . $err[text];
}
?>

Если вы используете модуль ORA, попробуйте следующее:

<?php
if ($c=ora_logon("scott@orcl","tiger")) {
  echo
"Successfully connected to Oracle.\n";
  
ora_commitoff($c);
  
ora_logoff($c);
} else {
  echo
"Oracle Connect Error " . ora_error();
}
?>

Замечание: если у Вас не установлены необходимые переменные окружения, поместите следующие строки в начале каждого скрипта, работающего с Oracle:

<?php
  PutEnv
("ORACLE_SID=ORCL");
  
PutEnv("ORACLE_HOME=/app/oracle/product/9.2.0");
  
PutEnv("TNS_ADMIN=/var/opt/oracle");

В случае, если Вы несколько раз в пределах одного скрипта попробуете подключится к базе данных, используя одинаковую комбинацию логин/пароль, Вы получите одно и то же соединение. Если Вам необходимы различные подключения к базе, используйте функцию OCINLogon(). Если вам нужны постоянные соединения, используйте функцию OCIPLogon().

Почему возникает ошибка "Call to undefined function: ora_logon()/ ocilogon()"?

Вероятнее всего, у Вас не включена поддержка Oracle. Вернитесь к вопросу "Как собрать PHP с поддержкой Oracle?". Вам необходимо пересобрать php, если у Вас Linux или раскомментировать загрузку соответствующей библиотеки, если у вас Windows.

Как выполнять запросы SELECT, INSERT, UPDATE и DELETE посредством PHP?

Приведенный ниже исходный код демонстрирует, как удалять/создавать новые таблицы, записывать/извлекать из них данные в PHP.

<?php
  $c
=OCILogon("scott", "tiger", "orcl");
  if ( !
$c ) {
    echo
"Невозможно подключится к базе: " . var_dump( OCIError() );
    die();
  }

  
// Удаляем старую табоицу
  
$s = OCIParse($c, "drop table tab1");
  
OCIExecute($s, OCI_DEFAULT);

  
// Создаем новую таблицу
  
$s = OCIParse($c, "create table tab1 (col1 number, col2 varchar2(30))");
  
OCIExecute($s, OCI_DEFAULT);

  
// Заносим строку в только что созданную таблицу
  
$s = OCIParse($c, "insert into tab1 values (1, 'Frank')");
  
OCIExecute($s, OCI_DEFAULT);

  
// Заносим данные в таблицу используя конструкцию "bind"
  
$var1 = 2;
  
$var2 = "Scott";
  
$s = OCIParse($c, "insert into tab1 values (:bind1, :bind2)");
  
OCIBindByName($s, ":bind1", $var1);
  
OCIBindByName($s, ":bind2", $var2);
  
OCIExecute($s, OCI_DEFAULT);

  
// Производим выборку из базы данных
  
$s = OCIParse($c, "select * from tab1");
  
OCIExecute($s, OCI_DEFAULT);
  while (
OCIFetch($s)) {
    echo
"COL1=" . ociresult($s, "COL1") .
       
", COL2=" . ociresult($s, "COL2") . "\n";
  }

  
// Выполняем commit;
  
OCICommit($c);

  
// Отключаемся от базы данных
  
OCILogoff($c);
?>

Как получить доступ к механизму транзакций из PHP?

При использовании модуля OCI каждый раз после удачного выполнения ociexecute() автоматически происходит commit, и, таким образом, транзакция сразу же завершается. Вы можете управлять этим процессом, указывая дополнительный параметр OCI_COMMIT_ON_SUCCESS либо OCI_DEFAULT при вызове функции ociexecute(). В случае использования OCI_DEFAULT вы сможете полностью управлять механизмом транзакций, для этого используйте функции OCICommit() и OCIRollback().

Следует учесть, что использование OCI_DEFAULT в одном из вызовов ociexecute() автоматически наследуется для всего подключения к базе данных и будет использовано при дальнейших операциях с базой данных. Если вы не хотите использовать автоматический и ручной механизм управления транзакциями одновременно, используйте OCINLogon().

В случае, если Вы используете модуль ORA, управление транзакциями выглядит немного иначе. Используйте функции ORA_CommitOn() и ORA_CommitOff() для переключения между ручным и автоматическим механизмом управления транзакциями. Для завершения транзакции и отката используйте функции ORA_Commit() и ORA_Rollback() соответственно.

В случае, если после завершения работы скрипта ни разу не выполнялся ни commit, ни rollback, PHP завершит транзакцию командой commit.

Как корректно обрабатывать возникающие ошибки?

В случае, если вы используете модуль OCI, используйте функцию OCIError() для получения массива, содержащего детальную информацию о возникающих ошибках. Если подключений несколько, OCIError() позволяет получить информацию об ошибке в каждом их них индивидуально. Если данная функция вызывается без параметров, она возвращает массив с информацией о последней произошедшей ошибке.

<?php
  $err
= OCIError();
  
var_dump($err);

  print
"\nError code = "     . $err[code];
  print
"\nError message = "  . $err[message];
  print
"\nError position = " . $err[offset];
  print
"\nSQL Statement = "  . $err[sqltext];
?>

В случае, если вы используете модуль ORA, воспользуйтесь функциями ora_error() и errorcode() для получения информации о последней произошедшей ошибке.

<?php
  
print "\nError code = "    . ora_errorcode();
  print
"\nError message = " . ora_error();
?>

Как вызвать из PHP хранимую процедуру?

Приведенный ниже пример демонстрирует создание и вызов хранимой процедуры.

<?php
  
// Подключаемся к базе данных
  
$c=OCILogon("scott", "tiger", "orcl");
  if ( !
$c ) {
     echo
"Unable to connect: " . var_dump( OCIError() );
     die();
  }

  
// Создаем хранимую процедуру
  
$s = OCIParse($c, "create procedure proc1(p1 IN number, p2 OUT number) as " .
                    
"begin" .
                    
"  p2 := p1 + 10;" .
                    
"end;");
  
OCIExecute($s, OCI_DEFAULT);

  
// Вызываем процедуру
  
$in_var = 10;
  
$s = OCIParse($c, "begin proc1(:bind1, :bind2); end;");
  
OCIBindByName($s, ":bind1", $in_var);
  
OCIBindByName($s, ":bind2", $out_var, 32); // 32 is the return length
  
OCIExecute($s, OCI_DEFAULT);
  echo
"Procedure returned value: " . $out_var;

  
// Отключаемся от базы данных
  
OCILogoff($c);
?>

Где можно найти больше информации о работе с Oracle в PHP?

Для получения более детальной информации посетите следующие сайты:

 
 » Обсудить эту статью на форуме

 
 Сборник статей 
 Содержание раздела 
Есть еще вопросы или что-то непонятно - добро пожаловать на наш  форум портала PHP.SU 
 

 
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS