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>");