inderror=0; $this->ultimoerror=0; $this->estado=0; } /* ------------------------------------------------------------------------------------------- Adquiere o actualiza los datos necesarias para establecer conexiones Par�etros de entrada: servidor: Servidor donde se ubica la base de datos usuario : Un usuario con acceso al servidor passwor : Clave de usuario basedato: Base de datos a la se quiere acceder proveedor: Proveedor de Base de datos Devuelve : true : Si los datos aportadospara establecer conexiones son correctos false: En caso contrario En el caso de devolver false, la funci� TomaUltimoError() devuelve el error ocurrido ----------------------------------------------------------------------------------------------*/ function CadenaConexion($servidor,$usuario,$password,$basedatos,$proveedor){ $this->servidor=$servidor; $this->usuario=$usuario; $this->password=$password; $this->basedatos=$basedatos; $this->proveedor=$proveedor; if (!$this->_cadena_conexion()) return(false); else return(true); } /* ------------------------------------------------------------------------------------------- Abre una conexión Devuelve : true : Si la apertura de la conexiónha sido satisfactoria false: En caso contrario En el caso de devolver false, la funci� TomaUltimoError() devuelve el error ocurrido ----------------------------------------------------------------------------------------------*/ function Abrir(){ $this->inderror=-1; // Inicializar contador de errores $this->ultimoerror=-1; $MAXIMOS_INTENTOS_DE_CONECCION=10; if (!$this->_cadena_conexion()) return(false); // Comprueba si los datos necesarios para conexiones se han aportado switch ($this->estado) { case 1: // Existe actualmente una conexiónabierta que se sustituir�por la nueva if (mysql_close($this->controlador)){ // Se cierra la conexion actual $this->estado=0; $intentos_de_conexion=0; while(true){ $intentos_de_conexion++; $resul=($this->_nueva_conexion()); if ($resul || $intentos_de_conexion>$MAXIMOS_INTENTOS_DE_CONECCION) return($resul); sleep(1); // Espera 1 segundo para intentar la conexiónde nuevo } } else{ // Error al cerrar la conexi� $this->error[$this->inderror++]=3; $this->ultimoerror=3; return(false); } break; case 2: // Actualmente est�objeto est�ocupado intentando establecer otra conexi� $this->error[$this->inderror++]=4; $this->ultimoerror=4; return(false); break; default : // No existe actualmente ninguna conexiónabierta, se abrir�una nueva $intentos_de_conexion=0; while(true){ $intentos_de_conexion++; $resul=($this->_nueva_conexion()); if ($resul || $intentos_de_conexion>$MAXIMOS_INTENTOS_DE_CONECCION) return($resul); sleep(1); // Espera 1 segundo para intentar la conexiónde nuevo } } } /* ------------------------------------------------------------------------------------------- Cierra una conexión Devuelve : true : Si la conexiónse ha cerrado satisfactoriamente false: En caso contrario En el caso de devolver false, la funci� TomaUltimoError() devuelve el error ocurrido ----------------------------------------------------------------------------------------------*/ function Cerrar(){ $this->inderror=-1; // Inicializar contador de errores $this->ultimoerror=-1; switch ($this->estado) { case 1: // Actualmente la conexion est�abierta if (mysql_close($this->controlador)){ // Se cierra la conexion actual $this->estado=0; $this->error[$this->inderror++]=0; $this->ultimoerror=0; return(true); } else{ // Error al cerrar la conexi� $this->error[$this->inderror++]=3; $this->ultimoerror=3; return(false); } break; case 2: // Actualmente est�objeto est�ocupado intentando establecer otra conexi� $this->error[$this->inderror++]=4; $this->ultimoerror=4; return(false); break; default : // Actualmente la conexiónest�ya cerrada $this->error[$this->inderror++]=5; $this->ultimoerror=5; return(false); } } /* ------------------------------------------------------------------------------------------- Establece una nueva conexi�. Este m�odo es privado y s�o lo puede ejecutar la propia clase desde el m�odo pblico Abrir. ----------------------------------------------------------------------------------------------*/ function _nueva_conexion(){ $this->estado=2;// Intenta la conexion if ($this->controlador=mysql_connect($this->servidor,$this->usuario,$this->password)){// Conexion O.K. $this->estado=1; // La conexion con el servidor se estableci� if (mysql_select_db($this->basedatos, $this->controlador)){// Base datos O.K. $this->error[$this->inderror++]=0; $this->ultimoerror=0; return(true); } else{ // Problemas con la base de datos $this->error[$this->inderror++]=2; $this->ultimoerror=2; if (mysql_close ($this->controlador)) $this->estado=0; // Se cierra la conexion return(false); } } else{ // Problemas con la conexion $this->estado=0; $this->error[$this->inderror++]=1; $this->ultimoerror=1; return(false); } } /* ------------------------------------------------------------------------------------------- Establece una sistema UTF8 para las consultas ----------------------------------------------------------------------------------------------*/ function SetUtf8(){ mysql_query("SET NAMES 'utf8'"); } /* ------------------------------------------------------------------------------------------- Revisa y detecta las condiciones que deben cumplir los datos necesarios para establecer conexiones Devuelve : true : Si los datos aportados son correctos false: Si algn dato NO ha sido aportado o es incorrecto Este m�odo es privado y s�o lo ejecutan m�odos pblicos de la propia clase ----------------------------------------------------------------------------------------------*/ function _cadena_conexion(){ if ($this->servidor==null){ $this->error[$this->inderror++]=6; // Servidor no establecido $this->ultimoerror=6; return(false); } if ($this->usuario==null){ $this->error[$this->inderror++]=7;// usuario no establecido $this->ultimoerror=7; return(false); } if ($this->password==null){ $this->error[$this->inderror++]=8; // password no establecido $this->ultimoerror=8; return(false); } if ($this->basedatos==null){ $this->error[$this->inderror++]=9; // base de datos no establecido $this->ultimoerror=9; return(false); } if ($this->proveedor==null){ $this->error[$this->inderror++]=10; // proveedor no establecido $this->ultimoerror=10; return(false); } $this->error[$this->inderror++]=0; // Datos de conexióncorrectos $this->ultimoerror=0; return(true); } /* ------------------------------------------------------------------------------------------- Devuelve el c�igo del ltimo error ocurrido durante el proceso anterior. ----------------------------------------------------------------------------------------------*/ function UltimoError(){ return($this->ultimoerror); } /* ------------------------------------------------------------------------------------------- Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. ----------------------------------------------------------------------------------------------*/ function DescripUltimoError(){ return($this->msgerrores[$this->ultimoerror]); } } /*========================================================================================= Clase para usarla con la clase comando. Especificaciones: Esta clase tiene dos propiedades que definen su contenido nombre=nombre del parametro valor = valor de dicho par�etro tipo = tipo de parametro: 0: El valor del par�etro debe ir encerrado entre comillas simples 1: El valor del par�etro no necesita ir entre comillas simples ========================================================================================*/ class parametro{ var $nombre; var $valor; var $tipo; /*--------------------------------------------------------------------------------------------*/ function parametro($nombre="SinNombre",$valor="",$tipo="0"){ // Constructor de la clase $this->SetParametro($nombre,$valor,$tipo); } /* ------------------------------------------------------------------------------------------- Modifica los valores de las propiedades de la clase ----------------------------------------------------------------------------------------------*/ function SetParametro($nombre,$valor,$tipo){ $this->nombre=$nombre; $this->valor=$valor; $this->tipo=$tipo; if($tipo==1 && empty($valor)) $this->valor=0; } } /*========================================================================================== Clase para manipular bases de datos a traves de una conexiónprevia. Especificaciones: Las sentencias SQL pueden contener par�etros que pueden ser sustituidos por el valor de los objetos par�etro. Estos par�etros tendr� la forma:@nombre_del_parametro ==================================================================================================*/ class Comando{ var $texto; var $Conexion; var $parametros=array(); var $Recordset; var $resul; var $error; // Error var $ultimoerror; // Ultimo error detectado var $inderror; // Contador de errores var $msgerrores=array( "No se ha producido ningn error", "001 : Comando Error - No se ha establecido el texto del comando", "002 : Comando Error - No se ha establecido la conexióndel comando", "003 : Comando Error - No se ha abierto la conexion", "004 : Comando Error - La sentencia SQL del comando no es correcta", "005 : Comando Error - No se ha podido recuperar el valor @@identity de la ltima clave insertada", ); /*--------------------------------------------------------------------------------------------*/ function Comando(){ // Constructor de la clase $this->inderror=0; $this->ultimoerror=0; $this->Recordset=new Recordset; } /* ------------------------------------------------------------------------------------------- Devuelve el c�igo del ltimo error ocurrido durante el proceso anterior. ----------------------------------------------------------------------------------------------*/ function UltimoError(){ return($this->ultimoerror); } /* ------------------------------------------------------------------------------------------- Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. ----------------------------------------------------------------------------------------------*/ function DescripUltimoError(){ return($this->msgerrores[$this->ultimoerror]); } /* ------------------------------------------------------------------------------------------- A�de un par�etro a la colecci� de parametros. La matriz que implementa la colecci� es una matriz asociativa cuyo indice asociativo es el nombre del par�etro Par�etros de entrada: objparam: Un objeto parametro ---------------------------------------------------------------------------------------------*/ function AddParametro($objparam){ $tbparametro["nombre"]=$objparam->nombre; $tbparametro["valor"]=$objparam->valor; $tbparametro["tipo"]=$objparam->tipo; $this->parametros[]=$tbparametro; } /* ------------------------------------------------------------------------------------------- A�de un par�etro a la colecci� de parametros. La matriz que implementa la colecci� es una matriz asociativa cuyo indice asociativo es el del par�etro Par�etros de entrada: nombre: El nombre del par�etro valor : El valor del par�etro tipo = tipo de parametro: 0: El valor del par�etro debe ir encerrado entre comillas simples 1: El valor del par�etro no necesita ir entre comillas simples Versión 1.1: Al incluir los valores se escapan caracteres especiales (ticket #777) Autor: Irina Gómez - ETSII, Universidad de Sevilla Fecha: 2017-03-30 ---------------------------------------------------------------------------------------------*/ function CreaParametro($nombre,$valor,$tipo){ for($i=0;$iparametros);$i++){ if($this->parametros[$i]["nombre"]==$nombre){ $this->parametros[$i]["valor"]=mysql_real_escape_string($valor); return; } } $p = new parametro($nombre,mysql_real_escape_string($valor),$tipo); $this->AddParametro($p); } /* ------------------------------------------------------------------------------------------- Sustituye el valor de un par�etro existente por otro Par�etros de entrada: nombre: El nombre del par�etro valor : El nuevo valor del par�etro Versión 1.1: Al incluir los valores se escapan caracteres especiales (ticket #777) Autor: Irina Gómez - ETSII, Universidad de Sevilla Fecha: 2017-03-30 ---------------------------------------------------------------------------------------------*/ function ParamSetValor($nombre,$valor){ for($i=0;$iparametros);$i++){ if($this->parametros[$i]["nombre"]==$nombre) $this->parametros[$i]["valor"]=mysql_real_escape_string($valor); } } /* ------------------------------------------------------------------------------------------- Establece la conexiónque se usar�para ejecutar las acciones pertinentes Par�etros de entrada: objconexion: Un objeto conexion ---------------------------------------------------------------------------------------------*/ function EstableceConexion($objconexion){ $this->Conexion= $objconexion; } /* ------------------------------------------------------------------------------------------- Establece la conexiónque se usar�para ejecutar las acciones pertinentes Par�etros de entrada: textocomando: Un texto con la sentencia SQL (Puede contener par�etros) ---------------------------------------------------------------------------------------------*/ function EstableceTexto($textocomando){ $this->texto=$textocomando; } /* ------------------------------------------------------------------------------------------- Sustituye el valor de los parametros en la expresi� que forma el texto del Comando ---------------------------------------------------------------------------------------------*/ function Traduce(){ $execomando=$this->texto; if (sizeof($this->parametros)>0){ // Hay par�etros que sustituir foreach($this->parametros as $parametro){ if ($parametro["tipo"]==0) // Tipo alfanum�ico $execomando=str_replace($parametro["nombre"],"'".$parametro["valor"]."'",$execomando); else $execomando=str_replace($parametro["nombre"],$parametro["valor"],$execomando); } } $this->texto=$execomando; } /* ------------------------------------------------------------------------------------------- Ejecuta la sentencia SQL contenida en la propiedad texto ---------------------------------------------------------------------------------------------*/ function Ejecutar(){ $this->inderror=-1; // Inicializar contador de errores $this->ultimoerror=-1; if ($this->texto==null){ $this->error[$this->inderror++]=1; // Texto no especificado $this->ultimoerror=1; return(false); } else{ if ($this->Conexion==null){ $this->error[$this->inderror++]=2; // conexiónNO establecida $this->ultimoerror=2; return(false); } else{ if ($this->Conexion->estado==0){ $this->error[$this->inderror++]=3; // conexiónNO abierta $this->ultimoerror=3; return(false); } } } $this->Traduce(); if (!$this->resul=mysql_query($this->texto,$this->Conexion->controlador)){ $this->error[$this->inderror++]=4; // Error en la sentencia SQL del comando $this->ultimoerror=4; return(false); } $sqlstr=trim($this->texto); if (strtoupper(substr($sqlstr,0,6))=="SELECT"){ $this->Recordset->Inicializar(); $this->Recordset->filas=$this->resul; $this->Recordset->numerodecampos=mysql_num_fields($this->Recordset->filas); $this->Recordset->numeroderegistros=mysql_num_rows($this->Recordset->filas); if ($this->Recordset->numeroderegistros>0){ $this->Recordset->BOF=false; $this->Recordset->EOF=false; $this->Recordset->campos=mysql_fetch_array($this->Recordset->filas); } } $this->error[$this->inderror++]=0; // Comando ejecutado correctamante $this->ultimoerror=0; return(true); } /* ------------------------------------------------------------------------------------------- Esta funci� recupera el ltimo nmero asignado a una clave autonum�ica de una tabla ---------------------------------------------------------------------------------------------*/ function Autonumerico(){ $ulreg=mysql_insert_id(); return($ulreg); } } /*========================================================================================= Clase para consultar tablas y vistas de una base de datos. Especificaciones: - Estado del recordset ($estado) 0: Cerrado 1: Abierto =========================================================================================*/ class Recordset{ var $Comando; var $filas= array(); var $BOF,$EOF,$estado; var $campos; var $numeroderegistros,$numerodecampos,$posicion; var $error; // Error var $ultimoerror; // Ultimo error detectado var $inderror; // Contador de errores var $msgerrores=array( "No se ha producido ningn error", "001 : Recordset Error - Comando no establecido", "002 : Recordset Error - No se ha establecido la conexióndel comando", "003 : Recordset Error - No se ha abierto la conexion", "004 : Recordset Error - No se pudo abrir la consulta", "005 : Recordset Error - La sentencia SQL del comando no contiene la clausula SELECT", "006 : Recordset Error - No se puede liberar la consulta", ); /*--------------------------------------------------------------------------------------------*/ function Recordset(){ // Constructor de la clase $this->Inicializar(); } /* ------------------------------------------------------------------------------------------- Inicializa propiedades de las clase ----------------------------------------------------------------------------------------------*/ function Inicializar(){ $this->BOF=true; $this->EOF=true; $this->posicion=0; $this->numeroderegistros=0; $this->numerodecampos=0; $this->estado=0; } /* ------------------------------------------------------------------------------------------- Devuelve el c�igo del ltimo error ocurrido durante el proceso anterior. ----------------------------------------------------------------------------------------------*/ function UltimoError(){ return($this->ultimoerror); } /* ------------------------------------------------------------------------------------------- Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. ----------------------------------------------------------------------------------------------*/ function DescripUltimoError(){ return($this->msgerrores[$this->ultimoerror]); } /* ------------------------------------------------------------------------------------------- Establece el comando que se usar�para ejecutar las consultas pertinentes Par�etros de entrada: objcomando: Un objeto comando con la sentencia SQL (Puede contener par�etros) Devuelve : true : Si el texto del comando contiene la clausula SELECT false: En caso contrario En el caso de devolver false, la funci� TomaUltimoError() devuelve el error ocurrido ---------------------------------------------------------------------------------------------*/ function EstableceComando($objcomando){ $this->inderror=-1; // Inicializar contador de errores $this->ultimoerror=-1; if (stristr($objcomando->texto,"select")){ $this->Comando=$objcomando; $this->error[$this->inderror++]=0; // Comando v�ido, contiene "SELECT" $this->ultimoerror=0; return(true); } else{ $this->error[$this->inderror++]=5; // Comando no valido, NO contiene "SELECT" $this->ultimoerror=5; return(false); } } /* ------------------------------------------------------------------------------------------- Sustituye el valor de los parametros en la expresi� que forma el texto del Comando ---------------------------------------------------------------------------------------------*/ function Traduce(){ $execomando=$this->Comando->texto; if (sizeof($this->Comando->parametros)>0){ // Hay par�etros que sustituir foreach($this->Comando->parametros as $parametro){ if ($parametro["tipo"]==0) // Tipo alfanum�ico $execomando=str_replace($parametro["nombre"],"'".$parametro["valor"]."'",$execomando); else $execomando=str_replace($parametro["nombre"],$parametro["valor"],$execomando); } } $this->Comando->texto=$execomando; } /* ------------------------------------------------------------------------------------------- Recupera registros de la base de datos ---------------------------------------------------------------------------------------------*/ function Abrir(){ $this->inderror=-1; // Inicializar contador de errores $this->ultimoerror=-1; if ($this->Comando==null){ $this->error[$this->inderror++]=1; // Comando no especificado $this->ultimoerror=1; return(false); } else{ if ($this->Comando->Conexion==null){ $this->error[$this->inderror++]=2; // conexiónNO establecida $this->ultimoerror=2; return(false); } else{ if ($this->Comando->Conexion->estado==0){ $this->error[$this->inderror++]=3; // conexiónNO abierta $this->ultimoerror=3; return(false); } } } $this->Traduce(); $this->Inicializar(); if (!$this->filas=mysql_query($this->Comando->texto,$this->Comando->Conexion->controlador)){ $this->error[$this->inderror++]=4; // Error en la sentencia SQL del comando o al abrir la consula $this->ultimoerror=4; return(false); } $this->numeroderegistros=mysql_num_rows($this->filas); // La consulta se ha realizado con �ito $this->numerodecampos=mysql_num_fields($this->filas); if ($this->numeroderegistros>0){ $this->BOF=false; $this->EOF=false; $this->campos=mysql_fetch_array($this->filas); } $this->estado=1; // Recordset abierto $this->error[$this->inderror++]=0; // Recuperaci� de registros correcta $this->ultimoerror=0; return(true); } /* ------------------------------------------------------------------------------------------- Libera los registros de una consulta de la base de datos ---------------------------------------------------------------------------------------------*/ function Cerrar(){ $this->inderror=-1; // Inicializar contador de errores $this->ultimoerror=-1; if (!mysql_free_result($this->filas)){ $this->error[$this->inderror++]=6; // Error al cerrar la consulta (Al liberar memoria) $this->ultimoerror=6; return(false); } $this->Inicializar(); $this->error[$this->inderror++]=0; // Recuperaci� de registros correcta $this->ultimoerror=0; return(true); } /* ------------------------------------------------------------------------------------------- Mueve el puntero de lectura al siguiente registro del recordset ---------------------------------------------------------------------------------------------*/ function Siguiente(){ if (!$this->EOF){ $this->posicion++; if ($this->posicion==$this->numeroderegistros) $this->EOF=true; else{ if (mysql_data_seek($this->filas,$this->posicion)) $this->campos=mysql_fetch_array($this->filas); } } } /* ------------------------------------------------------------------------------------------- Mueve el puntero de lectura al anterior registro del recordset ---------------------------------------------------------------------------------------------*/ function Anterior(){ if (!$this->BOF){ $this->posicion--; if ($this->posicion<0) $this->BOF=true; else{ if (mysql_data_seek($this->filas,$this->posicion)); $this->campos=mysql_fetch_array($this->filas); } } } /* ------------------------------------------------------------------------------------------- Mueve el puntero de lectura al primer registro del recordset ---------------------------------------------------------------------------------------------*/ function Primero(){ if ($this->numeroderegistros>0){ $this->posicion=0; if (mysql_data_seek($this->filas,$this->posicion)) $this->campos=mysql_fetch_array($this->filas); } } /* ------------------------------------------------------------------------------------------- Mueve el puntero de lectura al ltimo registro del recordset ---------------------------------------------------------------------------------------------*/ function Ultimo(){ if ($this->numeroderegistros>0){ $this->posicion=$this->numeroderegistros-1; if (mysql_data_seek($this->filas,$this->posicion)) $this->campos=mysql_fetch_array($this->filas); } } } /* ------------------------------------------------------------------------------------------- Esta funci�n devuelve una matriz asociativa con el nombre de los campos del recordset ---------------------------------------------------------------------------------------------*/ function DatosNombres(){ if (mysql_data_seek($this->filas,$this->posicion)) return(mysql_fetch_assoc($this->filas)); return(""); } /* ------------------------------------------------------------------------------------------- Esta funci�n devuelve informaci�n sobre los campos de la tabla ---------------------------------------------------------------------------------------------*/ function InfoCampos(){ $infocampos= array (); while ($row = mssql_fetch_field($this->filas)) { $campo["name"]=$row->name; $campo["column_source"]=$row->column_source; $campo["maxlon"]=$row->max_length; $campo["numeric"]=$row->numeric; array_push($infocampos,$campo); } return($infocampos); } ?>