
Подключение к базе данных 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
- Для начала скачиваем Oracle Instance для версии Windows 32-bit (не спрашивайте, почему 32-bit, я не знаю, но именно так это работает). Версии Oracle Instance 11.2 отсюда (на момент написания статьи актуальная версия Version 11.2.0.4.0). Вам нужно будет зарегистрироваться, чтобы скачать, такая уж политика Oracle.
- Создаем на диске C папку instantclient_11_2, в которую разархивируем скачанный Oracle Instance.
- Создаем папке 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 — выполните его.
- А теперь самое невероятное!!! — копиуем содержимое папки instantclient_11_2 и вставляем его в папку с Apache 2.2/bin (мой путь — C:\OpenServer\modules\http\Apache-2.2\bin). Да-да, вы все правильно поняли — этот шаг был самый неочевидный и без него у меня ничего не работало.
- Идем в “Свойства системы” (правой кнопкой по моему компьютеру — свойства — дополнительные параметры системы — переменные среды ). В разделе «Системные переменные» добавить записи — ORACLE_HOME со значением C:\instantclient_11_2 и PATH со значением C:\instantclient_11_2
- Далее открываем файл php.ini и ищем следующие строки и раскомментируем их, если они закомментированы (убираем ‘;’ перед ними) и сохраняем:
Было:;extension=php_oci8.dll ;extension=php_oci8_11g.dll
Стало:
extension=php_oci8.dll extension=php_oci8_11g.dll
- Перезапускаем сервер. Если вы все правильно сделали, сервер выдаст сообщение “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 решение будет проще, но у меня получилось только такое.
Если есть вопросы, задавайте, всегда рад буду помочь. И, если вам помогла эта статья — оценивайте, делитесь в соц. сетях и комментируйте, нам будет очень приятно 🙂
Подписывайтесь на наш Telegram канал, чтобы не пропускать наши статьи 😎
