En este reportaje se explica el acceso a bases de datos en PHP mediante las clases de PHPLIB, con soporte a las bases de datos más populares.
El acceso a base de datos es una de las tareas más comunes, en cualquier aplicación sobre Internet. Y una de las primeras que cualquier programador trata de automatizar. Y como casi todo en está vida se les ha ocurrido antes a algunos miles, y en algunos casos lo han resuelto francamente bien.
Como muestra, las clases de base de datos que incluye PHPLIB entre otras, como las que incorpora para la gestión de sesiones, autentificación, etc.
Si vienes de la programación estructurada, probablemente las clases y la programación orientada a objetos, OOP, te resulten un tanto intimidatorias. Pero francamente el uso de las clases aporta tantas ventajas que merece la pena perder un poco de tiempo en comprender su funcionamiento.
Procuraré no hacer uso de la terminología que se utiliza en la OOP, aunque algunas veces será inevitable. En estos casos pasaré de puntillas sobre estos temas, ya que no es finalidad de este tutorial introducirte en el mundo de los objetos.
Para el uso de DB_Sql, solo tienes que <http://phplib.netuse.de/download/index.php3>descargarte la librería de clases y descomprimirlas. No te asustes entre todos esos ficheros, solo nos interesan unos pocos, en concreto los que empiezan por db_. Como podrás ver PHPLIB incluye clases para manejar las bases de datos más populares, entre las que se cuentan las de MySql, en la que nos centraremos, Oracle y Postgress entre otras.
Para utilizar una clase lo primero que hacemos es crear una instancia de la misma y para ello debemos informar a PHP donde encontrar la clase. Lo haremos de la siguiente forma:
include ('/ruta_al_fichero/db_mysql.inc');
$q= new DB_Sql;
Como puedes ver para ello hemos utilizado la palabra new y lo hemos asignado, a una variable. En realidad esto es un objeto, una instancia de la clase DB_Sql.
Ahora inicializaremos los parámetros de conexión a la base de datos, modificando algunas variables definidas dentro de la clase:
$q->Host = "tuHost";
$q->Database = "tuBaseDeDatos";
$q->User = "tuUsuario";
$q->Password = "tuPassword";
Por supuesto, puedes asignar estos parámetros dentro de la clase a las correspondientes variables, de esta forma los datos de conexión siempre serán los mismos.
Hasta el momento deberías tener algo como esto:
<?php
include ('/ruta_al_fichero/db_mysql.inc');
$q= new DB_Sql;
$q->Host = "tuHost";
$q->Database = "tuBaseDeDatos";
$q->User = "tuUsuario";
$q->Password = "tuPassword";
?>
Y llego el momento de hacer algo práctico con nuestra clase. Supongamos una base de datos con la siguiente estructura:
create table amigos (
id int(11) default '0' not null auto_increment,
nombre varchar(25),
apellidos varchar(25),
dirección varchar(50),
ciudad varchar(50),
pais varchar(50),
primary key (id)
);
Vamos a realizar un query a la base de datos, usando la clase. La construcción del query se hace de la misma forma que si atacaramos directamente a la base de datos, con las funciones de PHP:
$query='select * from amigos';
$q->query($query);
Con esto, si todo fué bien, habremos conseguido los registros que cumplen la condición de la tabla amigos. Pero, ¿como podemos asegurarnos de que hemos obtenido algún registro?. Bien, por un lado deberemos asegurarnos de que la conexión con la base de datos se ha establecido. DB_sql establece una conexión persistente al efectuar la consulta, por lo tanto si query devuelve algún valor, sabremos que la conexión se ha establecido. Para asegurarnos de que la consulta ha sido exitosa, deberemos tener en cuenta que algunas veces una consulta puede ser verdadera, pero no devolver ningún resultado, caso muy común al realizar un select. Es por lo tanto una buena práctica verificar este punto, así es como quedaría nuestro código:
$query='select * from amigos';
if (!$q->query($query)){
echo 'Lo siento no se pudo establecer la conexión<br>';
}else{
if (!$q->num_rows()){
echo 'Lo siento no se ha obtenido ningún resultado<br>';
}else{
echo 'Hey! hay '.$q->num_rows().' registros que cumplen la condición';
}
}
Esto esta muy bien, veamos ahora como manejar los registros y campos de forma individual. Para ello recorreremos los resultados e iremos mostrando los datos que nos interesen uno a uno:
$query='select * from amigos';
if (!$q->query($query)){
echo 'Lo siento no se pudo establecer la conexión<br>';
}else{
if (!$q->num_rows()){
echo 'Lo siento no se ha obtenido ningún resultado<br>';
}else{
echo '<pre>';
echo 'Hey! hay '.$q->num_rows().' registros que cumplen la condición';
while ($q->next_record()!=0){
echo 'El id es: '.$q->f('id').'\n';
echo $q->f('nombre').' '.$q->f('apellidos').'\n';
}
echo '</pre>';
}
}
De la misma forma que hacemos un select, haremos un insert, update o delete. Obviamente estos tres últimos no devuelven resultados, por lo tanto para saber si nuestros queries han funcionado recurriremos a la función affected_rows de la clase DB_Sql, de esta forma:
$query='delete from amigos where ciudad=\'Medellín\'';
if (!$q->query($query)){
echo 'Lo siento no se pudo establecer la conexión<br>';
}else{
if (!$q->affected_rows()){
echo 'Lo siento no se encontro ningún registro que cumpla la condición<br>';
}else{
echo 'Se han eliminado '.$q->affected_rows().' registros';
}
}
Como puedes comprobar, el uso de una clase no es nada complicado. Solo debes preocuparte por conocer los métodos, las funciones de la clase que tienes disponibles y lo que hacen. Habitualmente las clases están suficientemente documentadas y te muestran los valores de entrada y salida requeridos. Además es una buena forma de mejorar tu estilo de programación y adquirir nuevos conocimientos.
El uso básico de las clases que incorpora PHPLIB para otras bases de datos es básicamente igual, puede que más o menos funciones, aunque las básicas son iguales en todos los casos. Es importante que revises la documentación, para comprobar las posibles diferencias.
Ten en cuenta que cualquier llamada del tipo $q->loquesea(), es una llamada al método de una clase y que algo del tipo $q->otracosa es una variable de la clase. Con paréntesis, un método, como una función normal de PHP y sin ellos una variable. Dentro de la clase la llamada a las funciones y variables se hace con la palabra reservada this. Por lo tanto cuando te encuentres un $this->algo, fíjate si tiene o no paréntesis a continuación, y así sabrás si es una llamada a un método de la clase o alguna operación con variables.
Y esto es todo de momento, espero que te sirva de ayuda. Hasta pronto.
José Valle