PHP: работа с БД Oracle используя расширение oci8 в Ubuntu 14.04

Install
Установка расширения Oci8 для работы с БД Oracle.
Ставим pecl.
sudo apt-get install php-pear php-xml php7.0-xml php7.0-dev 
sudo apt-get install pecl
Через pecl ставим Oci8. При установке указываем путь в oracle lib.
sudo pecl install oci8 
instantclient,/usr/lib/oracle/<ver>/client64/lib
Добавляем extension в php.ini. После этого перезапускаем apache (если php не для консольных скриптов).
extension=oci8.so
ПРИМЕР КОДА РАБОТЫ С БД
//подключаемся, формируем запрос, исполняем
$conn=oci_connect("<login>", "<pass>", "<db_service_name>");
$sql = "SELECT id FROM houses";
$stid = oci_parse($conn, $sql);
<OPTIONAL_BIND>
oci_execute($stid);
// кладем результат в array
$arr= array();
while (($row = oci_fetch_array($stid, OCI_BOTH))) {
 array_push($arr,"$row[0]-$row[1]");
}
// освобождаем ресурсы занятые курсором и отключаемся
oci_free_statement($stid);
oci_close($conn);
BIND
В случае использования переменных в запросе опционально bind’им значение переменных. Это повышает производительность обработки запроса за счет кэширования и защищает от sql-inject.
Для этого в запросе вместо переменной указываем Oracle placeholder.
$sql = "SELECT id FROM houses WHERE house_id=:id_h";

А после oci_parse, но перед oci_execute сопоставляем Oracle placeholder переменной.

oci_bind_by_name($stid, ':id_h' , $id_h);
ERR

В случае если PHP выдает “string(119) “ORA-12154: TNS:невозможно разрешить заданный идентификатор соединения” – скорей всего php не видит tnsnames.ora и не может отрезолвить servicename.

Можно вылечить указав полный description БД в php, по аналогии tnsnames.ora при подключении к серверу.
$db= "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)
 (HOST=".$dbHost.")(PORT=".$dbHostPort."))
 (CONNECT_DATA=(SERVICE_NAME=".$dbServiceName.")))";
$c=oci_connect("<login>", "<pass>", "<db>");

Leave a Reply