Ver Mensaje Individual
  #7 (permalink)  
Antiguo 22/03/2006, 14:58
Avatar de MarioNunes
MarioNunes
 
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Tema: Clase conexión a Base de Datos
Pregunta: ¿Como puedo conectarme a Mysql y/o Oracle?
Respuesta:
* $host: El host de la BD de MySQL, en caso de utilizar BD Oracle el host tiene que ir vacío ya que el número de parámetros en el constructor seguirán siendo los mismos.
* $user: El usuario de la base de datos.
* $pass: El password de la base de datos.
* $db: En MySQL este parámetro tendrá el nombre del esquema existente en MySQL al que queremos conectar, el nombre de la BD. En caso de ser Oracle, $db tendrá el nombre que se ha configurado en el TNSNAMES.ORA para la conexión a Oracle.
* $tipo_db: Esta variable es la que decide que funciones utilizarán los métodos, si las de Oracle o las de MySQL. Los 2 posibles valores que podrá tener son: 0 = MySQL y 1 = Oracle.

Código PHP:
function __construct($host,$user,$pass,$db,$tipo_db)
 {
  
$this->host=$host;
  
$this->user=$user;
  
$this->pass=$pass;
  
$this->db=$db;
  
$this->tipo_db=$tipo_db;
  
//MySQL
  
if($this->tipo_db==0)
  {
   
$this->conexion mysql_connect($host$user$pass);
   if (!
$this->conexion) {
   die(
'Sin conexión : ' mysql_error());
   }
   
$db_selected mysql_select_db($db$this->conexion);
   if (!
$db_selected) {
    die (
'No se puede usar la base de datos seleccionada: ' mysql_error());
   }
  }
  
//Oracle
  
if($this->tipo_db==1)
  {
   
$this->conexion OCILogon($user,$pass,$db);
   if (!
$this->conexion)
        {
     
$mensaje "Mensaje de Error: [" OCIError($this->conexion) . "]";
     return 
$mensaje;
     exit;
    }
        else
        {
         return 
$this->conexion;
        }
  }
 } 

Podemos observar también que nada más comenzar a codificar el constructor asignamos valores a las propiedades de la clase con los parámetros que recibe, esto es necesario para que funcione el método autonumerico() que verémos más adelante.

El método lista que recibe como parámetro el string de la sentencia SQL que queremos consultar a la BD devuelve en ambos casos, si es MySQL u Oracle, un array bidimensional en la que la primera dimensión es el nombre de las columnas y la segunda los valores que contiene cada columna. Y la forma de consultar la columna de un registro en concreto sería: $rs["NombreColumna"][NumeroRegistro];
Código PHP:
function lista($sentencia)
 {
  
//MySQL
  
if($this->tipo_db==0)
  {
   
$arr = array();
   
$col=0;
   
$seleccion mysql_query($sentencia);
   if (!
$seleccion) {
    die(
'Error en consulta: ' mysql_error());
   }
   if (
mysql_num_rows($seleccion) > 0)
   {
     
$x=0;
     while(
$row mysql_fetch_row($seleccion))
     {
       foreach(
$row as $i => $value) {
       
$column mysql_field_name($seleccion,$i);
       
$arr["$column"][$x]=$value;
       }
       
$x++;
     }
   }
   
$this->nrows=$x;
   
mysql_free_result($seleccion);
   return 
$arr;
  }
  
//Oracle
  
if($this->tipo_db==1)
  {
   
$stmt OCIParse($this->conexion$sentencia);
   
OCIExecute($stmt);
   
$this->nrows=oci_fetch_all($stmt$results);
   
$this->ncolumns=ocinumcols($stmt);
   return 
$results;
   
OCI_Free_statement($stmt);
  }
 } 
Es importante tener en cuenta que el método lista solo se utilizará para listar datos, NUNCA para actualizar y/o introducir nuevos registros.

El método actualiza que recibe como parámetro el string de la sentencia SQL que queremos ejecutar. A diferencia del método lista, este método no devuelve ningún tipo de valor. Este método solo está para introducir nuevos registros en una tabla y para actualizar registros de tablas.
Código PHP:
function actualiza($sentencia)
 {
  
//MySQL
  
if($this->tipo_db==0)
  {
   
$seleccion mysql_query($sentencia);
   if (!
$seleccion) {
    die(
'Error en consulta: ' mysql_error());
   }
  }
  
//Oracle
  
if($this->tipo_db==1)
  {
    
$stmt=OCIParse($this->conexion$sentencia);
        
OCIExecute($stmt);
  }
 } 
Como su própio nombre indica, el método autonumerico() Al no existir en Oracle los campos autonuméricos he creado este método. Recibe como parámetro la tabla en la que deseamos buscar cual será el siguiente número de registro, y claro en esa tabla ¿qué campo tiene que ser el autonumerico?. Devuelve como resultado el número mayor + 1.
Código PHP:
function autonumerico($tabla,$campo)
 {
  
$sql="select max(".$campo.") as NUMERO from ".$tabla." ";
  
$host=$this->host;
  
$user=$this->user;
  
$pass=$this->pass;
  
$db=$this->db;
  
$tipo_db=$this->tipo_db;
  
$db=new db_conexion($host,$user,$pass,$db,$tipo_db);
  
$rs=$db->lista($sql);
  if(
is_null($rs['NUMERO'][0]))
        
$numero=0;
  else
        
$numero=$rs['NUMERO'][0];
  
$db->liberar_rs($rs);
  return 
$numero+1;
 } 
Este método es el que se utiliza para liberar de memoria los datos que contiene el contenedor. El contenedor es el que almacena en memoria el resultado de una sentencia SQL.
Código PHP:
 {
   
$recordset=null;
 } 

Al destruir el objeto que contiene la instancia de la clase, cerramos la conexión con la BD.
Código PHP:
function __destruct()
 {
  
//MySQL
  
if($this->tipo_db==0){
   
mysql_close($this->conexion);
  }
  
//Oracle
  
if($this->tipo_db==1){
   
OCI_close($this->conexion);
  }
 } 
Una vez que he terminado de explicar los métodos de la clase os explico como utilizar la clase:

Ejemplo MySQL:
Código PHP:
require('conexion.class.php');
$db="prueba";
$user="root";
$pass="root";
$host="localhost";
$db=new db_conexion($host,$user,$pass,$db);

//Listar información
$sql="select Nombre from prueba";
$rs=$db->lista($sql);
$nrows=$db->nrows;
for(
$i=0$i<$nrows;$i++)
{
    echo 
$rs['Nombre'][$i]."";

//Autonumérico
echo $db->autonumerico("prueba","id");
//Actualizar un registro
$sql="update prueba set nombre = 'nuevo valor' where id=1";
$db->actualiza($sql);
//Insertar un nuevo registro
$sql="insert into prueba (id,nombre) values (2,'Nuevo Nombre'";
$db->actualiza($sql); 

Ejemplo Oracle:
Código PHP:
require('conexion.class.php');
$db="NombreTNS";
$user="user";
$pass="pass";
$host=""//Si contiene algún valor tampoco sería problema, ya que en caso de ser Oracle no se utiliza para nada
          //pero como es una de las variables del constructor no se puede omitir.
$db=new db_conexion($host,$user,$pass,$db);
//Listar información
$sql="select Nombre from prueba";
$rs=$db->lista($sql);
$nrows=$db->nrows;
for(
$i=0$i<$nrows;$i++)
{
    echo 
$rs['Nombre'][$i]."";
}

//Autonumérico
echo $db->autonumerico("prueba","id");
//Actualizar un registro
$sql="update prueba set nombre = 'nuevo valor' where id=1";
$db->actualiza($sql);
//Insertar un nuevo registro
$sql="insert into prueba (id,nombre) values (2,'Nuevo Nombre'";
$db->actualiza($sql); 

Como podeis observar los dos ejemplos son idénticos a diferencia de la creación del objeto conexión, para que sea más práctico el reutilizar el código, os dejo aquí el código de la clase completa.

conexion.class.php
Código PHP:
class db_conexion
{
 var 
$conexion;
 var 
$nrows;
 var 
$host;
 var 
$user;
 var 
$pass;
 var 
$db;
 var 
$tipo_db;
function 
__construct($host,$user,$pass,$db,$tipo_db)
 {
  
$this->host=$host;
  
$this->user=$user;
  
$this->pass=$pass;
  
$this->db=$db;
  
$this->tipo_db=$tipo_db;
  
//MySQL
  
if($this->tipo_db==0)
  {
   
$this->conexion mysql_connect($host$user$pass);
   if (!
$this->conexion) {
   die(
'Sin conexión : ' mysql_error());
   }
   
$db_selected mysql_select_db($db$this->conexion);
   if (!
$db_selected) {
    die (
'No se puede usar la base de datos seleccionada: ' mysql_error());
   }
  }
  
//Oracle
  
if($this->tipo_db==1)
  {
   
$this->conexion OCILogon($user,$pass,$db);
   if (!
$this->conexion)
        {
     
$mensaje "Mensaje de Error: [" OCIError($this->conexion) . "]";
     return 
$mensaje;
     exit;
    }
        else
        {
         return 
$this->conexion;
        }
  }
 }
 function 
lista($sentencia)
 {
  
//MySQL
  
if($this->tipo_db==0)
  {
   
$arr = array();
   
$col=0;
   
$seleccion mysql_query($sentencia);
   if (!
$seleccion) {
    die(
'Error en consulta: ' mysql_error());
   }
   if (
mysql_num_rows($seleccion) > 0)
   {
     
$x=0;
     while(
$row mysql_fetch_row($seleccion))
     {
       foreach(
$row as $i => $value) {
       
$column mysql_field_name($seleccion,$i);
       
$arr["$column"][$x]=$value;
       }
       
$x++;
     }
   }
   
$this->nrows=$x;
   
mysql_free_result($seleccion);
   return 
$arr;
  }
  
//Oracle
  
if($this->tipo_db==1)
  {
   
$stmt OCIParse($this->conexion$sentencia);
   
OCIExecute($stmt);
   
$this->nrows=oci_fetch_all($stmt$results);
   
$this->ncolumns=ocinumcols($stmt);
   return 
$results;
   
OCI_Free_statement($stmt);
  }
 }
 function 
actualiza($sentencia)
 {
  
//MySQL
  
if($this->tipo_db==0)
  {
   
$seleccion mysql_query($sentencia);
   if (!
$seleccion) {
    die(
'Error en consulta: ' mysql_error());
   }
  }
  
//Oracle
  
if($this->tipo_db==1)
  {
    
$stmt=OCIParse($this->conexion$sentencia);
        
OCIExecute($stmt);
  }
 }

function 
autonumerico($tabla,$campo)
 {
  
$sql="select max(".$campo.") as NUMERO from ".$tabla." ";
  
$host=$this->host;
  
$user=$this->user;
  
$pass=$this->pass;
  
$db=$this->db;
  
$tipo_db=$this->tipo_db;
  
$db=new db_conexion($host,$user,$pass,$db,$tipo_db);
  
$rs=$db->lista($sql);
  if(
is_null($rs['NUMERO'][0]))
        
$numero=0;
  else
        
$numero=$rs['NUMERO'][0];
  
$db->liberar_rs($rs);
  return 
$numero+1;
 }

function 
liberar_rs($recordset)
 {
   
$recordset=null;
 }

function 
__destruct()
 {
  
//MySQL
  
if($this->tipo_db==0){
   
mysql_close($this->conexion);
  }
  
//Oracle
  
if($this->tipo_db==1){
   
OCI_close($this->conexion);
  }
 }


También es de interés que visitéis estas direcciones:

http://www.jvmultimedia.com/portal/node/6

http://adodb.sourceforge.net/
__________________
www.pensandoenred.com

Última edición por jam1138; 22/03/2006 a las 18:11