4. Usando el PHPLib para trabajar con una Base de Datos
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.
4.1 Consulta b¨¢sica a una BD
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.
4.2 Usando num_rows()
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!";
4.3 Usando affected_rows()
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";
4.4 Manejo de errores
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->Errno
)
$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!