Este va a ser el último tip para ir mejorando nuestra clase. Durante todo el recorrido hemos podido ver una evolución de nuestra clase, ganando abstracción, ganando flexibilidad y ahora vamos a ganar capacidad gestión de errores.
Un problema que podemos tener al trabajar con nuestra base de datos, es que ésta no esté disponible en un momento determinado por que esté sobrecargada o por que no hay posibilidad de conexión. Por ello, debemos controlar que si no tenemos conexión a la base de datos, la ejecución de nuestra aplicación sea detenida inmediatamente (en el caso de que el uso de la base de datos sea crítico y nuestra aplicación sea 100% dependiente de la conexión a la base de datos.
Existen multitud de formas de controlar y gestionar los errores. PHP nos da ciertas herramientas para intentar capturar estas situaciones. En el ejemplo vamos a utilizar la función exit, que permite detener inmediatamente la ejecución de nuestro script, y también la función error_log que permite registrar en el log de errores de nuestro servidor web un evento, en nuestro caso, una frase identificadora para que podamos saber cuando ha pasado el problema. Si tenemos un hosting contratado (no un servidor dedicado), es prácticamente seguro que no tendremos acceso al fichero de logs del servidor web, pero lo bueno de esta función es que también es capaz de guardar el registro que nosotros queramos en un determinado fichero o incluso mandar un e-mail a una determinada cuenta. Recomiendo mirar la documentación por que además de las capacidades citadas, permite más opciones, las cuales puedes ser muy útiles para nuestra aplicación.
Lo que vamos a hacer es modificar la función pública conectar() de la clase Db. En dicha función vamos a detectar si nuestra conexión ha fallado, y si se da el caso, registrar dicho error para luego diagnosticar el problema, además de mostrar un error por pantalla avisando al visitante de existe un problema con nuestra aplicación.
Código :
/*Realiza la conexión a la base de datos.*/
private function conectar(){
switch ($this->tipo){
case 'mysql': $link=mysql_connect($this->servidor, $this->usuario, $this->password);
if ($link){
mysql_select_db($this->base_datos,$this->link);
@mysql_query("SET NAMES 'utf8'");
}
break;
case 'postgress': $link=pg_connect("host=".$this->servidor." dbname=".$this->base_datos." user=".$this->usuario." password=".$this->password)
break;
break;
}
if (!$link){
error_log(0,'Problema de conexión a la base de datos.');
exit('Perdonen las molestias. Tenemos un problema técnico. Esperamos resolverlo en los próximos minutos');
}else{
$this->link=$link;
}
}Descargar fichero Db.class.php actualizado (en formato UTF8)
Con esto ponemos fin a una pequeña colección de tips. Espero que esto les haya servidor para ir aprendiendo como poder crear y desarrollar una clase, utilizar un patrón de diseño y crear niveles de abastracción.
Temas relacionados:
Crear una clase para conectar a la base de datos
Crear una clase para conectar a la base de datos (II)
Crear una clase para conectar a la base de datos (III)

Por marcosdev el 22 de Noviembre de 2008
M@U :
Freddie :
M@U :
Sí, es interesante, pero no nueva. Yo diría que es una versión mejorada del intento deel OsoCariñoso con los tips sobre CSS.
The Fricky! :
Freddie :
Sí, es interesante, pero no nueva. Yo diría que es una versión mejorada del intento de el OsoCariñoso con los tips sobre CSS.
Entonces, se que no es el lugar adecuado pero ¿es acaso una buena opción dividir en dos partes un tutorial (que tardara años en ser publicado), en múltiples Tips?
Es decir, el ClabLvL para mi es lo de menos, pero es el mismo resultado en menos tiempo, y dos espacios en portada... Como dije, ¿que opinan?
Está muy interesante toda la serie
Por Gracias por la guia, el 02 de Diciembre de 2008
$bd=Db::getInstance();
Alguna idea?
Gracias.
Gustavo.
Por Flippy el 02 de Diciembre de 2008
Por marcosdev el 03 de Diciembre de 2008
Gracias por la guia, me r :
$bd=Db::getInstance();
Alguna idea?
Gracias.
Gustavo.
Si se para la ejecución en ese punto es que hay algún problema con la conexión o los parámetros. Recuerda tener la clase completa, la clase conf y el fichero de configuración
Por francisco Birrer (fb el 02 de Julio de 2009
¿como se cierran las conexiones?
Que sucede cuando cierro varias instancias, que pasa con las conexiones??
Gracias
Por guambe el 02 de Agosto de 2009
Por Angela el 07 de Octubre de 2010
tengo el mismo problema de Gustavo:
$con = Db->getInstance();
en esta linea se corta la ejecución, tengo todos los archivos pero en distintas carpetas por cuestiones de orden y uso include_once pero pareciera que no se ejecuta correctamente D:
estoy algo desesperada T_T!!! ayuda!!!
Por marcosdev el 09 de Octubre de 2010
Un saludo
Por Angela el 14 de Octubre de 2010
el servidor no tenía habilitado el mostrar errores, ya lo hice y ahora sé que el error está en el include del constructor de Conf.class.php (lo tengo dentro de una carpeta) porque para la vista lo incluyo y todo bien (la vista está en la raiz) pero cuando lo hago desde el controlador (esta dentro de una carpeta) no encuentra a Conf.class.php
Intenté usando una constante con $_SERVER['DOCUMENT_ROOT'] pero en mi servidor eso se traduce como "/", por ahi lei que debía poner un punto antes para que se reconozca como raiz es decir "./" pero el include no encuentra a la clase con esas correcciones.
Incluso intenté usar la ruta del host, ruta completa con "http://" pero tampoco x_x
Sigo bastate desesperada por esto!!
Por marcosdev el 19 de Octubre de 2010
<?php
function __autoload($classname){
$carpeta="classes/";
if (substr_count($classname,"Controller")>0){
$carpeta = "controllers/";
}else{
if (substr_count($classname,"VO")>0){
$carpeta="classes/VO/";
}else if (substr_count($classname,"DAO")>0){
$carpeta="classes/DAO/";
}
}
$fichero=$classname.'.php';
require "$carpeta$fichero";
}
$conf=Conf::getInstance();
?>
Como ves, hace uso de la función __autoload, que es una función especial que se puede registrar en php para que cuando hagas uso de una clase no tengas que ir haciendo includes y requires por todo los lados. Se pierde una parte de rendimiento, pero insignificativa si tu proyecto no gigante, pero ganas un código mucho más limpio y ordenado. Como se puede ver en esta función, lo que hago es ir a una carpeta u otra en busca del fichero a incluir en función del nombre de clase. Y por último, este fichero api, lo que siempre hace es iniciar la clase conf.
Espero que te sirva de ayuda.
Un saludo
Por fede el 14 de Septiembre de 2011
/*Realiza la conexión a la base de datos.*/
private function conectar(){
switch ($this->tipo){
case 'mysql': $link=$this->link=mysql_connect($this->servidor, $this->usuario, $this->password);
if ($link){
mysql_select_db($this->base_datos,$this->link);
@mysql_query("SET NAMES 'utf8'");
}
break;
case 'postgress': $link=$this->link=pg_connect("host=".$this->servidor." dbname=".$this->base_datos." user=".$this->usuario." password=".$this->password) ;
break;
}
if (!$link){
error_log(0,'Problema de conexión a la base de datos.');
exit('Perdonen las molestias. Tenemos un problema técnico. Esperamos resolverlo en los próximos minutos');
}else{
$this->link=$link;
}
Por kitsunekei1 el 09 de Noviembre de 2011
Por cazadorxD el 07 de Diciembre de 2011
if (!$cn){
error_log(0,'Problema de conexión a la base de datos.');
exit('Perdonen las molestias. Tenemos un problema técnico. Esperamos resolverlo en los próximos minutos');
}else{
$this->cn=$cn;
}
se supone q sal el error siempre y cuando halla una falla en la conexion al servidor....??