Подключение к базе данных Oracle на PHP

Вы используете блокировщик рекламы

Пожалуйста, отключите блокировщик рекламы

Подробнее

По работе пришлось совершить подключение к базе данных Oracle на PHP. С Oracle раньше работать не приходилось, так что засел за долгое и мучительное гугление. Перелопатив англо- и русскоязычные форумы, Stack Overflow и прочие подобные ресурсы, в итоге получилось добиться результата, но путь был пройден не близкий. Так что, может быть, данная статья кому-нибудь пригодится.
Итак, начну с исходных данных, т.к. подключение к БД Oracle на разных системах и разных версиях PHP отличается. Вот что было у меня:

  • Windows 10, 64-bit;
  • OpenServer 5.2.2 (на других локальных серверах не пробовал, но думаю данное решение подойдет для XAMPP, Denwer и если вы развернете свой локальный сервер);
  • PHP 5.3 (на PHP 5.4 данная инструкция не работает);
  • Apaсру 2.2.

А теперь сделаем подключение к базе данных Oracle

  1. Для начала скачиваем Oracle Instance для версии Windows 32-bit (не спрашивайте, почему 32-bit, я не знаю, но именно так это работает). Версии Oracle Instance 11.2 отсюда (на момент написания статьи актуальная версия Version 11.2.0.4.0). Вам нужно будет зарегистрироваться, чтобы скачать, такая уж политика Oracle.
  2. Создаем на диске C папку instantclient_11_2, в которую разархивируем скачанный Oracle Instance.
  3. Создаем папке instantclient_11_2 папку network, а в ней папку admin и создаем в последней файл tnsnames.ora (тут немного инфы об этом файле). Конченый путь к файлу должен быть такой C:\instantclient_11_2\network\admin\tnsnames.ora. Открываем этот файл через редактор и вставляем следующий код:
    MYDB =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = ххх.ххх.ххх.ххх)(PORT = 1521))
          (CONNECT_DATA =
           (SERVER = DEDICATED)
           (SERVICE_NAME = ХХХ)
          )
     )
    

    где ххх.ххх.ххх.ххх — адрес хоста, к которому нужно подключиться. Порт обычно стандартный 1521. SERVICE_NAME = ХХХ — имя БД, к которой подключаемся. Данный шаг не обязательный, но если в итоге у вас не получиться подключиться к удаленной базе Oracle — выполните его.

  4. А теперь самое невероятное!!! — копиуем содержимое папки instantclient_11_2 и вставляем его в папку с Apache 2.2/bin (мой путь — C:\OpenServer\modules\http\Apache-2.2\bin). Да-да, вы все правильно поняли — этот шаг был самый неочевидный и без него у меня ничего не работало.
  5. Идем в “Свойства системы” (правой кнопкой по моему компьютеру — свойства — дополнительные параметры системы — переменные среды ). В разделе «Системные переменные» добавить записи — ORACLE_HOME со значением C:\instantclient_11_2 и PATH со значением C:\instantclient_11_2
  6. Далее открываем файл php.ini и ищем следующие строки и раскомментируем их, если они закомментированы (убираем ‘;’ перед ними) и сохраняем:
    Было:

    ;extension=php_oci8.dll
    ;extension=php_oci8_11g.dll
    

    Стало:

    extension=php_oci8.dll
    extension=php_oci8_11g.dll
    
  7. Перезапускаем сервер. Если вы все правильно сделали, сервер выдаст сообщение “Module ‘oci8’ already loaded”.

Вот, собственно и все. Теперь можете пробовать подключаться к БД Oracle. Сделать это можно так:

$conn = oci_connect('username', 'password', 'xxx.xxx.xxx.xxx/db_name');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM employees); // Выберем все из таблицы employees

oci_execute($stid);
$row = oci_fetch_array($stid, OCI_BOTH);
while ( ( $row = oci_fetch_array( $stid, OCI_BOTH ) ) != false ) {
	echo $row["ID"]; // Выведем значение ID из таблицы
}

Важно! Не забудьте поменять значения ‘username’, ‘password’ и ‘xxx.xxx.xxx.xxx/db_name’ на свои значения.

Вот такое нетривиальное решение не самой сложной задачи. Возможно, под другие версии PHP решение будет проще, но у меня получилось только такое.

Если есть вопросы, задавайте, всегда рад буду помочь. И, если вам помогла эта статья — оценивайте, делитесь в соц. сетях и комментируйте, нам будет очень приятно 🙂

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Подписывайтесь на наш Telegram канал, чтобы не пропускать наши статьи 😎

Оцените нашу статью
4/54
Комментарии (0)
Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *