Ver Mensaje Individual
  #8 (permalink)  
Antiguo 06/09/2011, 08:40
Avatar de vgonga1986
vgonga1986
 
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 8 meses
Puntos: 253
Respuesta: Control de errores como Dios manda

Te lanzo una pequeña idea de lo que creo que tiene que tener toda clase de acceso a bases de datos (control de errores incluido). Esto se puede aplicar a los errores normales de los query o a excepciones, como bien ha indicado @masterpuppet.

La idea es sencilla, encapsular toda operación, de forma que desde fuera de la clase sólo haya que llamar a una función cada vez (simulando que son operaciones atómicas). Yo lo tengo más o menos así:
- Atributos de la clase: host, user, password, database, connection y message.
- Constructor: que asigne host, user, password y database.
- Funciones de Connect y Disconnect: en la primera tendrás que hacer mysql_connect y mysql_select_db, de forma que crees ya la conexión.
- Funciones de ejecución de sentencias: normalmente una para cada tipo de operación, aunque luego el código es casi idéntico, pero así lo modularizas más: Update, Insert, Delete y Select. La diferencia es que la última tendrá que devolver el ResultSet, para que luego puedas hacer fetch y recorrer los resultados (esto también lo puedes hacer en la clase, pero yo lo veo innecesario).
- Funciones de control de errores: tienes un atributo llamado $message. Pues creas unas cuantas funciones para acceder, modificar e imprimir dicho mensaje: SetMessage, GetMessage, PrintMessage y ConcatMessage (por ejemplo).

Una vez la tengas montada, tienes que añadir a las funciones susceptibles de dar error el control de errores gracias a las funciones para ello. Por ejemplo:
Código PHP:
Ver original
  1. function SetMessage($message) {
  2.     $this->message = $message;
  3. }
  4. function GetMessage() {
  5.     if (empty($this->message)) {
  6.         return '';
  7.     }
  8.     return $this->message;
  9. }

Luego en Connect puedes hacer lo siguiente:
Código PHP:
Ver original
  1. if (!$this->connection = mysql_connect($this->host, $this->user, $this->pass)) {
  2.         $errno = mysql_errno($this->connection);
  3.         $error = mysql_error($this->connection);
  4.         $this->SetDBMessage('Error en el acceso a la Base de Datos. Por favor, asegúrese de que las credenciales de acceso son correctas. Error MySQL (' . $errno . '): ' . $error);
  5.     }

De esta forma te queda todo bastante ordenado, incluso, si te animas puedes construir un fichero de log. Es simplemente añadir el acceso al log y la escritura cuando llames a SetMessage, puedes ir añadiendo una línea por cada operación.

Este método tiene una ventaja más, puedes utilizar las funciones que afectan al mensaje no sólo como control de errores, sino también para aciertos. Por ejemplo, en el Select puedes poner un mensaje en $message:
Código PHP:
Ver original
  1. $this->SetDBMessage('La consulta ha sido ejecutada de forma satisfactoria. Se han obtenido ' . mysql_num_rows($rs) . ' resultados.');

Bueno, sólo son unas pequeñas anotaciones, pero si decides montarlo así, me puedes preguntar siempre que tengas alguna duda.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?