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/