00001 <?php
00013 class Mysql{
00014
00015 public $mysqli;
00016
00024 public function Mysql($host, $bd, $usuario, $clave){
00025 $this->conectar($host, $bd, $usuario, $clave);
00026 }
00033 public function conectar($host, $bd, $usuario, $clave){
00034 $this->host = $host;
00035 $this->usuario = $usuario;
00036 $this->clave = $clave;
00037 $this->bd = $bd;
00038 $this->mysqli = new mysqli($host, $usuario, $clave, $bd);
00039 if (!$this->mysqli) throw new ExcepcionMySQLConexion($host,$usuario);
00040
00041 return this;
00042 }
00050 public function actualizar($tabla, $nombreClave, $valorClave, $valores){
00051 $consulta = "UPDATE $tabla SET ";
00052 foreach($valores as $columna => $valor){
00053 if ($valor == NULL) $consulta .= "$columna = NULL,";
00054 else $consulta .= "$columna = '$valor',";
00055 }
00056 $consulta = substr($consulta, 0, strlen($consulta)-1);
00057 if ($valorClave == NULL)
00058 $consulta .= " WHERE $nombreClave = NULL";
00059 else
00060 $consulta .= " WHERE $nombreClave = '$valorClave'";
00061
00062 $this->ejecutar($consulta);
00063
00064 return $this->mysqli->affected_rows;
00065 }
00073 public function actualizarAtributo($tabla, $atributo, $valor, $filtro){
00074 $consulta = "UPDATE $tabla ";
00075 if ($valor == NULL)
00076 $consulta .= "SET $atributo = NULL ";
00077 else
00078 $consulta .= "SET $atributo = '$valor' ";
00079 if (isset($filtro))
00080 $consulta .= "WHERE $filtro";
00081 $this->ejecutar($consulta);
00082
00083 return $this->mysqli->affected_rows;
00084 }
00091 public function actualizarPorClaveCompuesta($tabla, $claveCompuesta, $valores){
00092 $consulta = "UPDATE $tabla SET ";
00093 foreach ($valores as $columna => $valor)
00094 if ($valor == NULL) $consulta .= "$columna = NULL,";
00095 else $consulta .= "$columna = '$valor',";
00096 $consulta = substr($consulta, 0, strlen($consulta)-1);
00097 $consulta .= " WHERE ";
00098 foreach ($claveCompuesta as $columna => $valor){
00099 if ($valor == NULL) $consulta .= "$columna = NULL AND ";
00100 else $consulta .= "$columna = '$valor' AND ";
00101 }
00102 $consulta = substr($consulta, 0, strlen($consulta)-strlen(' AND '));
00103 $this->ejecutar($consulta);
00104
00105 return $this->mysqli->affected_rows;
00106 }
00111 public function borrar($tabla, $filtro){
00112 $consulta = "DELETE FROM $tabla WHERE ";
00113 foreach($filtro as $columna => $valor){
00114 if ($valor == NULL) $consulta .= "$columna = NULL AND ";
00115 else $consulta .= "$columna = '$valor' AND ";
00116 }
00117 $consulta = substr($consulta, 0, strlen($consulta)-5);
00118 $this->ejecutar($consulta);
00119 }
00124 public function cargarTabla($tabla, $fichero){
00125 $comando = 'mysql -u '.$this->usuario.' --password='.$this->clave.' '.$this->bd.' < '.$fichero;
00126 exec($comando, $salida, $ret);
00127
00128 if ($ret != 0) throw new ExcepcionMySQLErrorCargandoTabla($tabla, $fichero);
00129 }
00136 public function codificarResultado($resultado, $campos){
00137 $maxResultado = sizeof($resultado);
00138 $maxCampos = sizeof($campos);
00139 for($i=0; $i<$maxResultado;$i++)
00140 for($j=0;$j<$maxCampos;$j++)
00141 $resultado[$i][$campos[$j]] = utf8_encode($resultado[$i][$campos[$j]]);
00142 return $resultado;
00143 }
00147 public function ejecutar($consulta){
00148 $this->mysqli->query('SET NAMES utf8');
00149 $this->mysqli->query($consulta);
00150 if ($this->mysqli->errno){
00151 throw new ExcepcionMySQLError($consulta,$this->mysqli->error);
00152 }
00153 }
00159 public function escaparCaracteres($parametros){
00160
00161 $max = sizeof($parametros);
00162 for($i=0;$i<$max;$i++)
00163 $parametros[$i] = mysql_real_escape_string($parametros[$i]);
00164 return $parametros;
00165 }
00171 public function guardarTabla($tabla, $fichero){
00172 $comando = 'mysqldump --add-drop-table -u '.$this->usuario.' --password='.$this->clave.' '.$this->bd.' '.$tabla.' > '.$fichero;
00173 exec($comando, $salida, $ret);
00174 if ($ret != 0) throw new ExcepcionMySQLErrorGuardandoTabla($tabla, $fichero);
00175 }
00181 public function insertar($tabla, $valores){
00182 $consulta = "INSERT INTO $tabla SET ";
00183 foreach($valores as $columna => $valor){
00184 if ($valor === NULL) $consulta .= "$columna = NULL,";
00185 else $consulta .= "$columna = '$valor',";
00186 }
00187 $consulta = substr($consulta, 0, strlen($consulta)-1);
00188 $this->ejecutar($consulta);
00189
00190 return $this->mysqli->insert_id;
00191 }
00196 public function seleccionar($consulta){
00197 $this->mysqli->query('SET NAMES utf8');
00198 $respuesta = array();
00199 $resultado = $this->mysqli->query($consulta);
00200 if ($this->mysqli->errno) throw new ExcepcionMySQLError($consulta,$this->mysqli->error);
00201
00202 while ($tupla = $resultado->fetch_array())
00203 array_push($respuesta, $tupla);
00204
00205 $resultado->free();
00206
00207 return $respuesta;
00208 }
00216 public function seleccionarAtributosPorFiltro($tabla, $atributos, $filtro, $limite=1){
00217 $listaAtributos = "";
00218 foreach($atributos as $atributo)
00219 $listaAtributos .= $atributo.",";
00220 $listaAtributos = substr($listaAtributos, 0, strlen($listaAtributos) -1);
00221 $consulta = "SELECT $listaAtributos FROM $tabla WHERE $filtro";
00222 $respuesta = $this->seleccionar($consulta);
00223 if ($limite)
00224 $consulta .= " LIMIT $limite";
00225
00226 return $respuesta[0];
00227 }
00236 public function seleccionarPorAtributo($tabla, $atributo, $valor, $limite=1, $ordenacion=false){
00237 if ($valor == NULL)
00238 $consulta = "SELECT * FROM $tabla WHERE $atributo = NULL";
00239 else
00240 $consulta = "SELECT * FROM $tabla WHERE $atributo = '$valor'";
00241 if ($limite)
00242 $consulta .= " LIMIT $limite";
00243 if ($ordenacion)
00244 $consulta .=" ORDER BY $ordenacion";
00245
00246 $respuesta = $this->seleccionar($consulta);
00247
00248 return $respuesta;
00249 }
00255 public function seleccionarTabla($tabla, $limite=1000){
00256
00257 $consulta = "SELECT * FROM $tabla ";
00258 $respuesta = $this->seleccionar($consulta);
00259 if ($limite)
00260 $consulta .= " LIMIT $limite";
00261
00262 return $respuesta;
00263 }
00269 public function verFechaMysql($fechaEsp, $hora){
00270 Registro::anotar($fechaEsp);
00271 if ($fechaEsp == null) return null;
00272 if (strlen($fechaEsp) < 6 ) throw new ExcepcionMySQLFormatoFechaInvalido($fechaEsp);
00273 if (strlen($fechaEsp) > 19) throw new ExcepcionMySQLFormatoFechaInvalido($fechaEsp);
00274 $trozos = explode(" ",$fechaEsp);
00275 $formatoMysql = "%Y-%m-%d";
00276
00277
00278 $fecha = $trozos[0];
00279 $trozosFecha = explode("/",$fecha);
00280 if (sizeof($trozosFecha) != 3) throw new ExcepcionMySQLFormatoFechaInvalido($fechaEsp);
00281 $dia = $trozosFecha[0];
00282 $mes = $trozosFecha[1];
00283 $ano = $trozosFecha[2];
00284 if ((strlen($ano) == 4) AND (($ano > '2037') OR ($ano < '1901'))) throw new ExcepcionMySQLFechaFueraRango($fechaEsp);
00285
00286
00287 $horas = 0;
00288 $minutos = 0;
00289 $segundos = 0;
00290 if ($hora) $formatoMysql .= " %H:%M:%S";
00291 if ((sizeof($trozos) > 1) AND ($hora !== false)){
00292 $formatoMysql .= " %H:%M:%S";
00293 $hora = $trozos[1];
00294 $trozosHora = explode(":",$hora);
00295 if (sizeof($trozosHora) != 3) throw new ExcepcionMySQLFormatoFechaInvalido($fechaEsp);
00296 $horas = $trozosHora[0];
00297 $minutos = $trozosHora[1];
00298 $segundos = $trozosHora[2];
00299 }
00300
00301
00302 $tiempo = mktime($horas, $minutos, $segundos, $mes, $dia, $ano);
00303
00304
00305 return strftime($formatoMysql,$tiempo);
00306 }
00311 public function verFechaEsp($fechaMysql){
00312 if ($fechaMysql == null) return null;
00313
00314 $trozos = explode(' ',$fechaMysql);
00315 $fecha = $trozos[0];
00316 $hora = $trozos[1];
00317
00318 $trozosFecha = explode('-',$fecha);
00319 $anio = $trozosFecha[0];
00320 $mes = $trozosFecha[1];
00321 $dia = $trozosFecha[2];
00322
00323 return $dia.'/'.$mes.'/'.$anio;
00324 }
00325 }
00326
00327
00328 class ExcepcionMySQLConexion extends Excepcion{
00329 public function __construct($host, $usuario){
00330 $titulo = "No se pudo conectar con el servidor de MySQL";
00331 $texto = "La aplicación no ha podido realizar la conexión al servidor de base de datos MySQL en $host con el usuario $usuario.";
00332 $solucion = "Revise los datos de conexión (host, usuario y clave) y compruebe que el servidor MySQL está en funcionamiento y es accesible.";
00333 parent::__construct($titulo,$texto,$solucion);
00334 }
00335 }
00336 class ExcepcionMySQLSeleccionBd extends Excepcion{
00337 public function __construct($bd){
00338 $titulo = "No se pudo seleccionar la base de datos $bd en MySQL";
00339 $texto = "La aplicación no ha podido seleccionar la base de datos $bd para realizar las operaciones.";
00340 $solucion = "Compruebe el nombre de la base de datos en los parámetros de configuración y que exista en el servidor MySQL indicado.";
00341 parent::__construct($titulo,$texto,$solucion);
00342 }
00343 }
00344 class ExcepcionMySQLError extends Excepcion{
00345 public function __construct($consulta, $error){
00346 $titulo = "Ha fallado la operación de base de datos.";
00347 $texto = "La aplicación no ha podido realizar la operación de base de datos solicitada.";
00348 $solucion = "La consulta que produjo el error es ($consulta) y el error producido es ($error).";
00349 parent::__construct($titulo,$texto,$solucion);
00350 }
00351 }
00352 class ExcepcionMySQLFormatoFechaInvalido extends Excepcion{
00353 public function __construct($fecha){
00354 $titulo = "El formato de fecha no es válido.";
00355 $texto = "La aplicación no ha podido utilizar una fecha recibida ($fecha) porque el formato es inválido.";
00356 $solucion = "Los formatos de fecha soportados son: DD/MM/AA, DD/MM/AAAA, DD/M/AAAA, DD/M/AA con o sin horas con el formato HH:MM:SS. Por ejemplo '13/02/1968 17:45:32'";
00357 parent::__construct($titulo,$texto,$solucion);
00358 }
00359 }
00360 class ExcepcionMySQLFechaFueraRango extends Excepcion{
00361 public function __construct($fecha){
00362 $titulo = "La fecha está fuera de rango.";
00363 $texto = "La aplicación no puede transformar la fecha ($fecha) porque excede los rangos permitidos.";
00364 $solucionProgramador = "La función Mysql::verFechaMysql utiliza la función mktime, que tiene limitado su rango de validez. Tendrás que programar otra función.";
00365 $solucionUsuario = "Revise el año de la fecha introducida. Si realmente necesita una fecha con ese año, póngase en contacto con el administrador.";
00366 parent::__construct($titulo,$texto,$solucionProgramador, $solucionUsuario);
00367 }
00368 }
00369 class ExcepcionMySQLErrorCargandoTabla extends Excepcion{
00370 public function __construct($tabla, $fichero){
00371 $titulo = "Error al cargar la tabla '$tabla' del fichero '$fichero'.";
00372 $texto = "La aplicación no ha podido cargar la tabla del fichero indicado.";
00373 $solucionProgramador = "Revise los parámetros de la llamada y los permisos del fichero.";
00374 parent::__construct($titulo,$texto,$solucionProgramador);
00375 }
00376 }
00377 class ExcepcionMySQLErrorGuardandoTabla extends Excepcion{
00378 public function __construct($tabla, $fichero){
00379 $titulo = "Error al guardar la tabla '$tabla' en el fichero '$fichero'.";
00380 $texto = "La aplicación no ha podido guardar la tabla en el fichero indicado.";
00381 $solucionProgramador = "Revise los parámetros y los permisos.";
00382 parent::__construct($titulo,$texto,$solucionProgramador);
00383 }
00384 }
00385 return true;
00386 ?>