7
respostas

PHP PDO conexão remota com Oracle 19c

Boa tarde !

Tenho um banco oracle 19c em uma maquina remota, o qual quero acessar os dados.

Quero fazer a conexão da minha maquina local (Ubuntu) com oracle 19c remoto (CentOS), via Php PDO; visualizado com php -S localhost:8080

segue o código:

$odb = new PDO('oci:dbname=191.191.191.55', 'root', '123');

if ($odb == FALSE) { echo "Erro na conexão"; }else{ echo "Conectado";}

Cujo erro é: PHP Fatal error: Uncaught PDOException: could not find driver in /var/www/html/oracle/conexao.php:10

Então tentei descomentar o ";extension=pdo_oci" do 7.4/cli/php.ini seguido das ações: sudo service apache2 restart

sudo php -S localhost:8080 , no diretório html do apache2.

Rodando, aparecendo ,então, os seguintes erros:

PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci' (tried: /usr/lib/php/20190902/pdo_oci (/usr/lib/php/20190902/pdo_oci: cannot open shared object file: No such file or directory), /usr/lib/php/20190902/pdo_oci.so (/usr/lib/php/20190902/pdo_oci.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

PHP Fatal error: Uncaught PDOException: could not find driver in /var/www/html/oracle/conexao.php:10 Stack trace:

#0 /var/www/html/oracle/conexao.php(10): PDO->__construct()

#1 {main}

Obrigado!

7 respostas

Olá, MrSitech.

Não basta descomentar a linha no php.ini. Você precisa instalar a extensão.

Vê se esses links te ajudam:

Certo, estou tentando aplicar os passos do rosemberg.net. Acho que fiz confução nas criações das "extension":

Passo 10 – Habilite a lib gerada no PHP:

Segue o Passo:

Crie o arquivo o oci8.ini na pasta de módulos disponíveis do php, no meu caso foi na pasta /etc/php/7.0/mods-available/ , e após isso crie um link simbólico para ativar a lib, no meu caso foi na pasta /etc/php/7.0/apache2/conf.d

$ sudo nano /etc/php/7.0/mods-available/oci8.ini cole o nome da lib : extension=oci8.so salve o arquivo com as teclas CTRL+x

$ cd /etc/php/7.0/apache2/conf.d $ sudo ln -s /etc/php/7.0/mods-available/oci8.ini oci8.in

No meu caso, imagino que eu deva colocar no etc/php/7.4/cli. Se alguem compreendeu melhor esse passo para me explicar, agradeço.

Acho que confundi aqui. Vou refatorar e aviso.

Obrigado!

Opa. Então, isso tudo que ele recomendou pode se resumir a colocar a linha extension=oci8 no seu php.ini

Mas em /etc/php/7.4/cli você tem as configurações do PHP na linha de comando, não na web. Tem que ver como tá a sua estrutura de instalação pra saber onde tá o php.ini do servidor web.

Se você acessar um arquivo com esse conteúdo na web, dá pra ver todas as informações:

<?php

phpinfo();

Boa noite! Continuo usando o tutorial do Rosemberg.

Depois de várias tentativas, mudei a versão do pacote Oracle de 11.2 para 19.8, uma vez que eu estou usando PHP 7.4.11, achei que poderia ajudar. Já, para resolver o erro :

Uncaught PDOException: could not find driver in /var/www/html/oracle.com/conexao.php:10 Stack trace

, além de usar as ultimas versões, também vi que os drivers poderiam estar na mesma DIR do código php, conseguindo solucionar o "not find driver". Porém, não consegui conexão. Segue os erros

SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor (/var/www/html/oracle.com/php-src-PHP-7.4.11/ext/pdo_oci/oci_driver.c:728)

Para resolver o TNS, coloquei na seguinte forma:

$tns = " (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = MeuIp:porta/orcl) ) ) ) "; $db_username = "usuario"; $db_password = "senha"; try { $conn = new PDO("oci:dbname=".$tns, $db_username, $db_password); } catch (PDOException $e) { echo($e->getMessage()); }

Segue o erro que continua:

SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12545: Connect failed because target host or object does not exist (/var/www/html/oracle.com/php-src-PHP-7.4.11/ext/pdo_oci/oci_driver.c:728)

Porém verifiquei, e há sim o "oci_driver.c" dentro do "pdo_oci".

dentro do info.php parece tudo certo:

PDO drivers oci, mysql, sqlite

PDO Driver for OCI 8 and later

oci8:OCI8 Support enabled , OCI8 DTrace Support disabled, OCI8 Version 2.2.0

https://github.com/mrsitech/orcl

Agora a mensagem parece ser " Connect failed because target host or object does not exist", ou seja, o host ou objeto que parece estar errado. Confere se o ip tá acessível de onde você está tentando se conectar...

A sim, claro, agora entendi!

Fui eu que instalei o Oracle remoto, será que preciso colocar um driver PDO no servidor remoto também? Penso isso pois, o servidor tem um index.html no ar e o Oracle Database Express ( aquele da porta 5500/em) está funcionando.

Teoricamente não precisa de nada a mais no servidor não. Só garantir que esse servidor está acessível através do servidor de onde você está tentando se conectar. Da máquina onde você tem a conexão usando PDO, dá um ping pra esse IP do banco e vê se funciona...

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software