Si uno está acostumbrado a la programación estructurada, probablemente las clases, y la programación orientada a objetos, OOP, suenen como algo nuevo y un poco intimidatorio. Pero el uso de las clases aporta tantas ventajas que merece la pena perder un poco de tiempo en comprender su funcionamiento. Además, una vez que uno comienza usar PHPLib, se olvida que está usando OOP...
Cualquier llamada del tipo $db->metodo(), es una llamada al método de una clase (se podría decir que un método equivale a una función), y que algo del tipo $q->variable es una variable de la clase.
Dentro de la clase la llamada a las funciones y variables se hace con la palabra reservada this. Por lo tanto cuando se tiene un $this->algo, hay que fijarse si tiene o no paréntesis a continuación, y así se sabrá si es una llamada a un método de la clase o alguna operación con variables.
Si se estuviera haciendo una consulta a una BD MySQL, en PHP se tendría la siguiente sintáxis:
$db = mysql_connect("nombrehost", "usuario");
mysql_select_db("nombrebd",$db);
$result = mysql_query("SELECT campo1,campo2 FROM tabla",$db);
echo "<table border='1'>\n";
echo "<tr><td>Campo1</td><td>Campo2</td></tr>\n";
while ($myrow = mysql_fetch_row($result)) {
echo "<tr><td>".$myrow[1]."</td><td>".$myrow[2]."</td></tr>\n";
}
echo "</table>\n";
Esto mismo, usando PHPLib quedaría como:
$db=new DB_prueba(); nueva instancia de la BD
$sel="SELECT campo1,campo2 FROM tabla"; consulta SQL
$db->query($sel); se hace la consulta
echo "<table border='1'>\n";
echo "<tr><td>Campo1</td><td>Campo2</td></tr>\n";
while ($db->next_record()) { se recorren los registros resultantes
echo "<tr><td>".$db->f('campo1')."</td><td>".$db->f('campo2')."</td></tr>\n";
}
echo "</table>\n";
Cual es la ventaja? Bueno, a primera vista ninguna, pero si se quiere usar este código para ejecutar la misma consulta sobre una BD PosgtreSQL u Oracle, no sería necesario cambiar ni una sóla línea de código!! Bastaría con sólo modificar el prepend.php indicando db_pgsql.php o db_oracle.php y listo!!
Nota: quizás alguien se estará preguntando; "en que momento se debe cerrar la conexión a la BD?". Bueno, el método next_record() que recorre los registros obtenidos mediante un select, al llegar al último registro + 1 cierra la conexión a la BD.
Para asegurse de que una consulta ha sido exitosa, se debe 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:
$db=new DB_prueba();
$sel="SELECT campo1,campo2 FROM tabla where campo3 = condicion";
if (!$db->query($sel))
echo "No se pudo establecer una conexión con la BD.";
else
if (!$db->num_rows()) $db->num_rows() devuelve cantidad
de registros según consulta
echo "No se ha obtenido ningún resultado.";
else
echo "Hay ".$db->num_rows()." registros que cumplen la condición!";
De la misma forma que se hace un select, se debe hacer un insert, update o delete. Como estos tres últimos no devuelven resultados, sería útil saber si los queries han funcionado. Para esto se puede usar el método affected_rows() de la clase DB_Sql, de esta forma:
$db=new DB_prueba();
$query="delete from tabla where campo4 = condicion";
if ( !$db->query($query) )
echo "No se pudo establecer la conexión.";
else
if ( !$db->affected_rows() )
echo "No se encontro ningún registro que cumpla la condición.";
else
echo "Se han eliminado ".$db->affected_rows()." registros";
Halt_On_Error
Una de las variables de la clase DB_Sql es Halt_On_Error. Está variable se puede setear al definir la clase, pudiendo ser su valor "yes", "report" o "no". Por defecto, su valor es "yes", lo cual significa que se mostrará cualquier error de BD, y se detendrá la ejecución de la aplicación PHP.
Si se setea esta variable en "report", la aplicación mostrará los mensajes de error de la BD, pero también dejará los correspondientes valores Errno y Error en sus respectivas variables.
Finalmente, si Halt_On_Error se deja en "no", no se reportarán errores de BD, no se detiene la ejecución de la aplicación PHP, y se setean las variables Errno y Error.
Básicamente, se setea mediante:
class DB_prueba extends DB_Sql {
.
.
var $Halt_On_Error="no"; aca se deja en yes, no o report
}
Método haltmsg()
La clase DB_Sql provee del método haltmsg(), que se ejecuta al ocurrir en error de BD, mostrando un mensaje de error por defecto.
Por ejemplo en db_mysql.inc está definido como:
function haltmsg($msg) {
printf("</td></tr></table><b>Database error:</b> %s<br>\n", $msg);
printf("<b>MySQL Error</b>: %s (%s)<br>\n",
$this->Errno,
$this->Error);
}
La variable $msg puede ser usada para pasarle al método un string con un mensaje cualquiera.
El método haltmsg() puede ser re-creado al momento de definir nuestra clase, por ejemplo:
class DB_prueba extends DB_Sql {
.
.
var $Halt_On_Error="no";
function haltmsg($msg) {
printf("<br>Ha ocurrido un error de Base de Datos. %s<br>\n", $msg);
}
}
Un ejemplo práctico y más completo del manejo de errores podría ser:
$db=new DB_prueba();
$query="delete from tabla where campo4 = condicion";
$q->query($query);
Para ver el número y mensaje de error:
echo $db->Errno;
echo $db->Error;
if (!$db->Errno0)
$db->haltmsg("Disculpe las molestias.");
else
{
código o HTML
}
Se tratará de ejecutar la query, si ocurre algún error se mostrará:
Ha ocurrido un error de Base de Datos.
Disculpe las molestias.
Lo bueno de este método es que en cada clase se pueden manejar los errores de BD de manera distinta. No necesariamente debe ser con un mensaje por pantalla, tambíen se podria enviar un correo electrónico al administrador de la BD y/o Webmaster, con información del error, en que página ocurrió, etc.
Hasta aquí llega la primera parte. Como pueden ver no es tan complicado usar PHPLib, no olviden leer la documentación oficial y también si quieren revisar el código fuente.
En la segunda parte del artículo, se revisará el manejo de sesiones, autentificación y permisos. Hasta pronto!