Foros del Web » Programando para Internet » PHP »

Conectar PHP con BD Oracle

Estas en el tema de Conectar PHP con BD Oracle en el foro de PHP en Foros del Web. Hola buenas tardes, tengo un pequeño problema, estoy tratando de conectar desde un servidor Linux/PHP a un servidor Windows Server/Oracle 10.2g. Ya descargué e instalé ...
  #1 (permalink)  
Antiguo 22/03/2013, 13:05
Avatar de charolastrazoe  
Fecha de Ingreso: febrero-2008
Ubicación: En el @itscomalcalco
Mensajes: 72
Antigüedad: 16 años, 2 meses
Puntos: 5
Exclamación Conectar PHP con BD Oracle

Hola buenas tardes, tengo un pequeño problema, estoy tratando de conectar desde un servidor Linux/PHP a un servidor Windows Server/Oracle 10.2g.

Ya descargué e instalé InstantCliente de Oracle en mi servidor Ubuntu, y habilité la extensión OCI8 en el php.ini.

En teoría tengo lo necesario para hacer una conexión a Oracle desde PHP. Ahora me surge un problema, veo que oci_connect() sólo me pide usuario, contraseña y bd a la que me tengo que conectar, pero para comenzar la BD Oracle (como dije antes) está en otro servidor local de mi trabajo y entonces quiero indicar en la conexión que será en ese servidor y no en el local que tengo.

En una conexión pg_connect sería algo así:
Código PHP:
$conexion=pg_connect("host=10.0.0.20 port=5432 dbname=mibasededatos user=usuario password=contrasenia"); 
Pero con oci_connect() no lo he logrado hacerlo

Espero logren entenderme jeje y desde ya muchas gracias
  #2 (permalink)  
Antiguo 22/03/2013, 13:09
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Conectar PHP con BD Oracle

Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * Clase de conexion
  5.  * Implementada con patron de diseño singleton
  6.  *
  7.  * @author leswider
  8.  */
  9. class Conexion {
  10.  
  11.     private $_oLinkId; //objeto resource que indicara si se ha conectado
  12.     private $_sServidor;
  13.     private $_sNombreBD;
  14.     private $_sUsuario;
  15.     private $_sClave;
  16.     private $_sPuerto;
  17.     public static $sMensaje;
  18.     private static $_oSelf = null; //Almacenara un objeto de tipo Conexion
  19.  
  20.     /**
  21.      *
  22.      * @param string Nombre del usuario a conectarse.
  23.      * @param string Password de conexión.
  24.      * @param string Nombre de la base de datos.
  25.      * @param string Nombre del servidor.
  26.      */
  27.  
  28.     private function __construct() {
  29.        
  30.         $this->_sServidor = '10.x.x.x';
  31.         $this->_sNombreBD = 'BASE11G';
  32.         $this->_sUsuario = 'LUCAS';
  33.         $this->_sClave = 'holamundo';
  34.         $this->_sPuerto = '1534';
  35.     }
  36.  
  37.     /**
  38.      * Este es el pseudo constructor singleton
  39.      * Comprueba si la variable privada $_oSelf tiene un objeto
  40.      * de esta misma clase, si no lo tiene lo crea y lo guarda
  41.      * @static
  42.      * @return resource
  43.      */
  44.     public static function getInstancia() {
  45.  
  46.         if (!self::$_oSelf instanceof self) {
  47.             $instancia = new self(); //new self ejecuta __construct()
  48.             self::$_oSelf = $instancia;
  49.             if (!is_resource($instancia->conectar())) {
  50.                 self::$_oSelf = null;
  51.             }
  52.         }
  53.         $conex = self::$_oSelf;
  54.         return $conex->_oLinkId; //Se devuelve el link a la conexion
  55.     }
  56.  
  57.     /**
  58.      * Realiza la conexion
  59.      * @return link para exito, o false
  60.      */
  61.     private function conectar() {
  62.  
  63.         $this->_oLinkId = null;
  64.         $intentos = 0;
  65.         while (!is_resource($this->_oLinkId) && $intentos < 20) {
  66.             $intentos++;
  67.             $this->_oLinkId =
  68.                     oci_connect($this->_sUsuario, $this->_sClave, "(DESCRIPTION = (LOAD_BALANCE = yes)
  69.                            (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = {$this->_sServidor}) (PORT = 1534) ) )
  70.                            (CONNECT_DATA = (FAILOVER_MODE = (TYPE = select) (METHOD = basic) (RETRIES = 180) (DELAY = 5) )
  71.                            (SERVICE_NAME = {$this->_sNombreBD}) ) )");
  72.         }
  73.  
  74.         if (is_resource($this->_oLinkId)) {
  75.             self::$sMensaje = "Conexion exitosa!<br/>";
  76.         } else {
  77.             self::$sMensaje = "ERROR: No se puede conectar a la base de datos..!<br/>";
  78.         }
  79.         echo self::$sMensaje;
  80.         return $this->_oLinkId;
  81.     }
  82.  
  83.     /**
  84.      * Este método verifica si había una conexión abierta anteriormenete. Si había la cierra.
  85.      *
  86.      * @static
  87.      * @return boolean true si existía la conexión, false si no existía.
  88.      */
  89.     public static function desconectar() {
  90.  
  91.         $conexion_activa = false;
  92.         if (self::$_oSelf instanceof self) {
  93.             $bandera = true;
  94.             $instancia = self::$_oSelf;
  95.             oci_close($instancia->_oLinkId); //cierro la conexion activa
  96.             self::$_oSelf = null; //destruyo el objeto
  97.         }
  98.         return $conexion_activa;
  99.     }
  100.  
  101. }
  102.  
  103. ?>

Código PHP:
Ver original
  1. $sql = "select 1 from dual" ;
  2.                
  3. $conex = Conexion::getInstancia();
  4. $stid = oci_parse($conex, $sql);
  5. oci_execute($stid);
  6.  
  7. $foo= array();
  8. while ($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS)) {
  9.  
  10.      $foo[] = $row;
  11. }
  12.  
  13. var_dump($foo);
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #3 (permalink)  
Antiguo 22/03/2013, 13:30
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Conectar PHP con BD Oracle

tambien

Código PHP:
Ver original
  1. $conect=ocilogon('user','pass','dbname');
  2.             $err=OciError();
  3.             if ($errores){
  4.               echo 'Error al conectarse. '.$errores['code'].' '.$errores['message'].' '.$errores['sqltext'];
  5.             }

una query

Código PHP:
Ver original
  1. $query = ociparse($conect,"select * from ...");
  2. ociexecute($query);

tendrías que tener habilitado en el server el oracle, y en el php.ini una extension que no recuerdo bien
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #4 (permalink)  
Antiguo 22/03/2013, 13:41
Avatar de charolastrazoe  
Fecha de Ingreso: febrero-2008
Ubicación: En el @itscomalcalco
Mensajes: 72
Antigüedad: 16 años, 2 meses
Puntos: 5
Respuesta: Conectar PHP con BD Oracle

Uff excelente solución h2swider, esa clase me solucionó mucho mi problema, sólo tuve que modificarle (además de los parámetros de conexión) en la función conectar() donde dice
Código HTML:
(PORT = 1534)
por
Código HTML:
(PORT = 1521)
que es la que está configurado en el servidor.

Ahora ya sólo falta hacer la consulta que necesito pero eso ya es otro rollo jeje

Muchas gracias amigo :P saludos!
  #5 (permalink)  
Antiguo 22/03/2013, 13:45
Avatar de charolastrazoe  
Fecha de Ingreso: febrero-2008
Ubicación: En el @itscomalcalco
Mensajes: 72
Antigüedad: 16 años, 2 meses
Puntos: 5
Respuesta: Conectar PHP con BD Oracle

Cita:
Iniciado por loncho_rojas Ver Mensaje
tambien

Código PHP:
Ver original
  1. $conect=ocilogon('user','pass','dbname');
  2.             $err=OciError();
  3.             if ($errores){
  4.               echo 'Error al conectarse. '.$errores['code'].' '.$errores['message'].' '.$errores['sqltext'];
  5.             }

una query

Código PHP:
Ver original
  1. $query = ociparse($conect,"select * from ...");
  2. ociexecute($query);

tendrías que tener habilitado en el server el oracle, y en el php.ini una extension que no recuerdo bien
Gracias loncho, esa conexión me serviría mucho si el server oracle estuviera en el mismo donde tengo PHP, pero necesitaba agregarle a qué servidor y en qué puerto me debería conectar y en esta función simple no está pero te agradezco de todas maneras tu respuesta

Etiquetas: conexion, oracle
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:58.