1 | <?php |
---|
2 | /*================================================================================ |
---|
3 | Clase para conectar con una base de datos. |
---|
4 | |
---|
5 | Especificaciones: |
---|
6 | - Estado de la conexión($estado) |
---|
7 | 0: No conectado |
---|
8 | 1: Conectado |
---|
9 | 2: Se está intentando conectar |
---|
10 | |
---|
11 | ================================================================================*/ |
---|
12 | |
---|
13 | class Conexion{ |
---|
14 | var $basedatos; // Base de datos |
---|
15 | var $servidor; // Servidor de Base de datos |
---|
16 | var $usuario; // Nombre de usuario |
---|
17 | var $password; // Clave de usuario |
---|
18 | var $controlador; // Controlador |
---|
19 | var $estado; // Estado de la conexion |
---|
20 | var $proveedor; // Proveedor de BD |
---|
21 | var $error; // Colecci� de errores ocurridos durante el proceso (C�igo de error) |
---|
22 | var $ultimoerror; // Ultimo error detectado |
---|
23 | var $inderror; // Nmero de errores ocurridos durante el proceso |
---|
24 | var $msgerrores=array( |
---|
25 | "No se ha producido ningn error", |
---|
26 | "001 : conexiónError - La conexion no se pudo establecer", |
---|
27 | "002 : conexiónError - Se estableció la conexióncon el servidor pero la base de datos no responde", |
---|
28 | "003 : conexiónError - No se ha podido cerrar la actual conexión", |
---|
29 | "004 : conexiónError - El objeto está ocupado intentando establecer una conexiónanterior", |
---|
30 | "005 : conexiónError - La conexiónya está cerrada", |
---|
31 | "006 : conexiónError - No se ha especificado ningn servidor de base de datos", |
---|
32 | "007 : conexiónError - No se ha especificado ningn usuario de la base de datos", |
---|
33 | "008 : conexiónError - No se ha especificado password de usuario", |
---|
34 | "009 : conexiónError - No se ha especificado ninguna base de datos", |
---|
35 | "010 : conexiónError - No se ha especificado ningn proveedor de bases de datos", |
---|
36 | ); |
---|
37 | /*--------------------------------------------------------------------------------------------*/ |
---|
38 | function __construct(){ // Constructor de la clase |
---|
39 | $this->inderror=0; |
---|
40 | $this->ultimoerror=0; |
---|
41 | $this->estado=0; |
---|
42 | } |
---|
43 | /* ------------------------------------------------------------------------------------------- |
---|
44 | Adquiere o actualiza los datos necesarias para establecer conexiones |
---|
45 | |
---|
46 | Parámetros de entrada: |
---|
47 | servidor: Servidor donde se ubica la base de datos |
---|
48 | usuario : Un usuario con acceso al servidor |
---|
49 | passwor : Clave de usuario |
---|
50 | basedato: Base de datos a la se quiere acceder |
---|
51 | proveedor: Proveedor de Base de datos |
---|
52 | |
---|
53 | Devuelve : |
---|
54 | true : Si los datos aportadospara establecer conexiones son correctos |
---|
55 | false: En caso contrario |
---|
56 | |
---|
57 | En el caso de devolver false, la función TomaUltimoError() devuelve el error ocurrido |
---|
58 | ----------------------------------------------------------------------------------------------*/ |
---|
59 | function CadenaConexion($servidor,$usuario,$password,$basedatos,$proveedor){ |
---|
60 | $this->servidor=$servidor; |
---|
61 | $this->usuario=$usuario; |
---|
62 | $this->password=$password; |
---|
63 | $this->basedatos=$basedatos; |
---|
64 | $this->proveedor=$proveedor; |
---|
65 | if (!$this->_cadena_conexion()) return(false); else return(true); |
---|
66 | } |
---|
67 | /* ------------------------------------------------------------------------------------------- |
---|
68 | Abre una conexión |
---|
69 | |
---|
70 | Devuelve : |
---|
71 | true : Si la apertura de la conexiónha sido satisfactoria |
---|
72 | false: En caso contrario |
---|
73 | |
---|
74 | En el caso de devolver false, la función TomaUltimoError() devuelve el error ocurrido |
---|
75 | ----------------------------------------------------------------------------------------------*/ |
---|
76 | function Abrir(){ |
---|
77 | $this->inderror=-1; // Inicializar contador de errores |
---|
78 | $this->ultimoerror=-1; |
---|
79 | $MAXIMOS_INTENTOS_DE_CONECCION=10; |
---|
80 | if (!$this->_cadena_conexion()) return(false); // Comprueba si los datos necesarios para conexiones se han aportado |
---|
81 | switch ($this->estado) { |
---|
82 | case 1: // Existe actualmente una conexiónabierta que se sustituir�por la nueva |
---|
83 | if (mysqli_close($this->controlador)){ // Se cierra la conexion actual |
---|
84 | $this->estado=0; |
---|
85 | $intentos_de_conexion=0; |
---|
86 | while(true){ |
---|
87 | $intentos_de_conexion++; |
---|
88 | $resul=($this->_nueva_conexion()); |
---|
89 | if ($resul || $intentos_de_conexion>$MAXIMOS_INTENTOS_DE_CONECCION) return($resul); |
---|
90 | sleep(1); // Espera 1 segundo para intentar la conexiónde nuevo |
---|
91 | } |
---|
92 | } |
---|
93 | else{ // Error al cerrar la conexi� |
---|
94 | $this->error[$this->inderror++]=3; |
---|
95 | $this->ultimoerror=3; |
---|
96 | return(false); |
---|
97 | } |
---|
98 | break; |
---|
99 | case 2: // Actualmente este objeto está ocupado intentando establecer otra conexión |
---|
100 | $this->error[$this->inderror++]=4; |
---|
101 | $this->ultimoerror=4; |
---|
102 | return(false); |
---|
103 | break; |
---|
104 | default : // No existe actualmente ninguna conexiónabierta, se abrirá una nueva |
---|
105 | $intentos_de_conexion=0; |
---|
106 | while(true){ |
---|
107 | $intentos_de_conexion++; |
---|
108 | $resul=($this->_nueva_conexion()); |
---|
109 | if ($resul || $intentos_de_conexion>$MAXIMOS_INTENTOS_DE_CONECCION) return($resul); |
---|
110 | sleep(1); // Espera 1 segundo para intentar la conexiónde nuevo |
---|
111 | } |
---|
112 | } |
---|
113 | } |
---|
114 | /* ------------------------------------------------------------------------------------------- |
---|
115 | Cierra una conexión |
---|
116 | |
---|
117 | Devuelve : |
---|
118 | true : Si la conexiónse ha cerrado satisfactoriamente |
---|
119 | false: En caso contrario |
---|
120 | |
---|
121 | En el caso de devolver false, la función TomaUltimoError() devuelve el error ocurrido |
---|
122 | ----------------------------------------------------------------------------------------------*/ |
---|
123 | function Cerrar(){ |
---|
124 | $this->inderror=-1; // Inicializar contador de errores |
---|
125 | $this->ultimoerror=-1; |
---|
126 | switch ($this->estado) { |
---|
127 | case 1: // Actualmente la conexion está abierta |
---|
128 | if (mysqli_close($this->controlador)){ // Se cierra la conexion actual |
---|
129 | $this->estado=0; |
---|
130 | $this->error[$this->inderror++]=0; |
---|
131 | $this->ultimoerror=0; |
---|
132 | return(true); |
---|
133 | } |
---|
134 | else{ // Error al cerrar la conexión |
---|
135 | $this->error[$this->inderror++]=3; |
---|
136 | $this->ultimoerror=3; |
---|
137 | return(false); |
---|
138 | } |
---|
139 | break; |
---|
140 | case 2: // Actualmente este objeto está ocupado intentando establecer otra conexión |
---|
141 | $this->error[$this->inderror++]=4; |
---|
142 | $this->ultimoerror=4; |
---|
143 | return(false); |
---|
144 | break; |
---|
145 | |
---|
146 | default : // Actualmente la conexión está ya cerrada |
---|
147 | $this->error[$this->inderror++]=5; |
---|
148 | $this->ultimoerror=5; |
---|
149 | return(false); |
---|
150 | } |
---|
151 | } |
---|
152 | /* ------------------------------------------------------------------------------------------- |
---|
153 | Establece una nueva conexión. Este método es privado y sólo lo puede ejecutar la propia |
---|
154 | clase desde el método pblico Abrir. |
---|
155 | ----------------------------------------------------------------------------------------------*/ |
---|
156 | function _nueva_conexion(){ |
---|
157 | $this->estado=2;// Intenta la conexion |
---|
158 | if ($this->controlador=mysqli_connect($this->servidor,$this->usuario,$this->password)){// Conexion O.K. |
---|
159 | $this->estado=1; // La conexion con el servidor se estableció |
---|
160 | if (mysqli_select_db($this->controlador, $this->basedatos)){// Base datos O.K. |
---|
161 | $this->error[$this->inderror++]=0; |
---|
162 | $this->ultimoerror=0; |
---|
163 | return(true); |
---|
164 | } |
---|
165 | else{ // Problemas con la base de datos |
---|
166 | $this->error[$this->inderror++]=2; |
---|
167 | $this->ultimoerror=2; |
---|
168 | if (mysqli_close($this->controlador)) $this->estado=0; // Se cierra la conexion |
---|
169 | return(false); |
---|
170 | } |
---|
171 | } |
---|
172 | else{ // Problemas con la conexion |
---|
173 | $this->estado=0; |
---|
174 | $this->error[$this->inderror++]=1; |
---|
175 | $this->ultimoerror=1; |
---|
176 | return(false); |
---|
177 | } |
---|
178 | } |
---|
179 | /* ------------------------------------------------------------------------------------------- |
---|
180 | Establece una sistema UTF8 para las consultas |
---|
181 | ----------------------------------------------------------------------------------------------*/ |
---|
182 | function SetUtf8(){ |
---|
183 | mysqli_query($this->controlador, "SET NAMES 'utf8'"); |
---|
184 | } |
---|
185 | /* ------------------------------------------------------------------------------------------- |
---|
186 | Revisa y detecta las condiciones que deben cumplir los datos necesarios para establecer |
---|
187 | conexiones |
---|
188 | |
---|
189 | Devuelve : |
---|
190 | true : Si los datos aportados son correctos |
---|
191 | false: Si algn dato NO ha sido aportado o es incorrecto |
---|
192 | |
---|
193 | Este método es privado y sólo lo ejecutan métodos pblicos de la propia clase |
---|
194 | ----------------------------------------------------------------------------------------------*/ |
---|
195 | function _cadena_conexion(){ |
---|
196 | |
---|
197 | if ($this->servidor==null){ |
---|
198 | $this->error[$this->inderror++]=6; // Servidor no establecido |
---|
199 | $this->ultimoerror=6; |
---|
200 | return(false); |
---|
201 | } |
---|
202 | if ($this->usuario==null){ |
---|
203 | $this->error[$this->inderror++]=7;// usuario no establecido |
---|
204 | $this->ultimoerror=7; |
---|
205 | return(false); |
---|
206 | } |
---|
207 | if ($this->password==null){ |
---|
208 | $this->error[$this->inderror++]=8; // password no establecido |
---|
209 | $this->ultimoerror=8; |
---|
210 | return(false); |
---|
211 | } |
---|
212 | if ($this->basedatos==null){ |
---|
213 | $this->error[$this->inderror++]=9; // base de datos no establecido |
---|
214 | $this->ultimoerror=9; |
---|
215 | return(false); |
---|
216 | } |
---|
217 | if ($this->proveedor==null){ |
---|
218 | $this->error[$this->inderror++]=10; // proveedor no establecido |
---|
219 | $this->ultimoerror=10; |
---|
220 | return(false); |
---|
221 | } |
---|
222 | $this->error[$this->inderror++]=0; // Datos de conexióncorrectos |
---|
223 | $this->ultimoerror=0; |
---|
224 | return(true); |
---|
225 | } |
---|
226 | /* ------------------------------------------------------------------------------------------- |
---|
227 | Devuelve el c�igo del ltimo error ocurrido durante el proceso anterior. |
---|
228 | ----------------------------------------------------------------------------------------------*/ |
---|
229 | function UltimoError(){ |
---|
230 | return($this->ultimoerror); |
---|
231 | } |
---|
232 | /* ------------------------------------------------------------------------------------------- |
---|
233 | Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. |
---|
234 | ----------------------------------------------------------------------------------------------*/ |
---|
235 | function DescripUltimoError(){ |
---|
236 | return($this->msgerrores[$this->ultimoerror]); |
---|
237 | } |
---|
238 | } |
---|
239 | /*========================================================================================= |
---|
240 | Clase para usarla con la clase comando. |
---|
241 | |
---|
242 | Especificaciones: |
---|
243 | |
---|
244 | Esta clase tiene dos propiedades que definen su contenido |
---|
245 | nombre=nombre del parametro |
---|
246 | valor = valor de dicho parámetro |
---|
247 | tipo = tipo de parametro: |
---|
248 | 0: El valor del parámetro debe ir encerrado entre comillas simples |
---|
249 | 1: El valor del parámetro no necesita ir entre comillas simples |
---|
250 | ========================================================================================*/ |
---|
251 | class parametro{ |
---|
252 | var $nombre; |
---|
253 | var $valor; |
---|
254 | var $tipo; |
---|
255 | /*--------------------------------------------------------------------------------------------*/ |
---|
256 | function __construct($nombre="SinNombre", $valor="", $tipo="0"){ // Constructor de la clase |
---|
257 | $this->SetParametro($nombre,$valor,$tipo); |
---|
258 | } |
---|
259 | /* ------------------------------------------------------------------------------------------- |
---|
260 | Modifica los valores de las propiedades de la clase |
---|
261 | ----------------------------------------------------------------------------------------------*/ |
---|
262 | function SetParametro($nombre,$valor,$tipo){ |
---|
263 | $this->nombre=$nombre; |
---|
264 | $this->valor=$valor; |
---|
265 | $this->tipo=$tipo; |
---|
266 | if($tipo==1 && empty($valor)) $this->valor=0; |
---|
267 | } |
---|
268 | } |
---|
269 | /*========================================================================================== |
---|
270 | Clase para manipular bases de datos a traves de una conexiónprevia. |
---|
271 | |
---|
272 | Especificaciones: |
---|
273 | |
---|
274 | Las sentencias SQL pueden contener parámetros que pueden ser sustituidos por el valor |
---|
275 | de los objetos parámetro. Estos parámetros tendrán la forma: @nombre_del_parametro |
---|
276 | ==================================================================================================*/ |
---|
277 | class Comando{ |
---|
278 | var $texto; |
---|
279 | var $Conexion; |
---|
280 | var $parametros=array(); |
---|
281 | var $Recordset; |
---|
282 | var $resul; |
---|
283 | var $error; // Error |
---|
284 | var $ultimoerror; // Ultimo error detectado |
---|
285 | var $inderror; // Contador de errores |
---|
286 | var $msgerrores=array( |
---|
287 | "No se ha producido ningn error", |
---|
288 | "001 : Comando Error - No se ha establecido el texto del comando", |
---|
289 | "002 : Comando Error - No se ha establecido la conexióndel comando", |
---|
290 | "003 : Comando Error - No se ha abierto la conexion", |
---|
291 | "004 : Comando Error - La sentencia SQL del comando no es correcta", |
---|
292 | "005 : Comando Error - No se ha podido recuperar el valor @@identity de la ltima clave insertada", |
---|
293 | ); |
---|
294 | /*--------------------------------------------------------------------------------------------*/ |
---|
295 | function __construct(){ // Constructor de la clase |
---|
296 | $this->inderror=0; |
---|
297 | $this->ultimoerror=0; |
---|
298 | $this->Recordset=new Recordset; |
---|
299 | } |
---|
300 | /* ------------------------------------------------------------------------------------------- |
---|
301 | Devuelve el código del ltimo error ocurrido durante el proceso anterior. |
---|
302 | ----------------------------------------------------------------------------------------------*/ |
---|
303 | function UltimoError(){ |
---|
304 | return($this->ultimoerror); |
---|
305 | } |
---|
306 | /* ------------------------------------------------------------------------------------------- |
---|
307 | Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. |
---|
308 | ----------------------------------------------------------------------------------------------*/ |
---|
309 | function DescripUltimoError(){ |
---|
310 | return($this->msgerrores[$this->ultimoerror]); |
---|
311 | } |
---|
312 | /* ------------------------------------------------------------------------------------------- |
---|
313 | Añade un parámetro a la colección de parametros. La matriz que implementa la colección |
---|
314 | es una matriz asociativa cuyo indice asociativo es el nombre del parámetro |
---|
315 | |
---|
316 | Parámetros de entrada: |
---|
317 | objparam: Un objeto parametro |
---|
318 | ---------------------------------------------------------------------------------------------*/ |
---|
319 | function AddParametro($objparam){ |
---|
320 | $tbparametro["nombre"]=$objparam->nombre; |
---|
321 | $tbparametro["valor"]=$objparam->valor; |
---|
322 | $tbparametro["tipo"]=$objparam->tipo; |
---|
323 | $this->parametros[]=$tbparametro; |
---|
324 | } |
---|
325 | /* ------------------------------------------------------------------------------------------- |
---|
326 | Añade un parámetro a la colección de parametros. La matriz que implementa la colección |
---|
327 | es una matriz asociativa cuyo indice asociativo es el del parámetro |
---|
328 | |
---|
329 | Parámetros de entrada: |
---|
330 | nombre: El nombre del parámetro |
---|
331 | valor : El valor del parámetro |
---|
332 | tipo = tipo de parametro: |
---|
333 | 0: El valor del parámetro debe ir encerrado entre comillas simples |
---|
334 | 1: El valor del parámetro no necesita ir entre comillas simples |
---|
335 | Versión 1.1: Al incluir los valores se escapan caracteres especiales (ticket #777) |
---|
336 | Autor: Irina Gómez - ETSII, Universidad de Sevilla |
---|
337 | Fecha: 2017-03-30 |
---|
338 | |
---|
339 | ---------------------------------------------------------------------------------------------*/ |
---|
340 | function CreaParametro($nombre,$valor,$tipo){ |
---|
341 | for($i=0;$i<sizeof($this->parametros);$i++){ |
---|
342 | if($this->parametros[$i]["nombre"]==$nombre){ |
---|
343 | $this->parametros[$i]["valor"]=mysqli_real_escape_string($this->Conexion->controlador, $valor); |
---|
344 | return; |
---|
345 | } |
---|
346 | } |
---|
347 | $p = new parametro($nombre,mysqli_real_escape_string($this->Conexion->controlador, $valor),$tipo); |
---|
348 | $this->AddParametro($p); |
---|
349 | } |
---|
350 | |
---|
351 | /* ------------------------------------------------------------------------------------------- |
---|
352 | Sustituye el valor de un parámetro existente por otro |
---|
353 | Parámetros de entrada: |
---|
354 | nombre: El nombre del parámetro |
---|
355 | valor : El nuevo valor del parámetro |
---|
356 | Versión 1.1: Al incluir los valores se escapan caracteres especiales (ticket #777) |
---|
357 | Autor: Irina Gómez - ETSII, Universidad de Sevilla |
---|
358 | Fecha: 2017-03-30 |
---|
359 | ---------------------------------------------------------------------------------------------*/ |
---|
360 | function ParamSetValor($nombre,$valor){ |
---|
361 | for($i=0;$i<sizeof($this->parametros);$i++){ |
---|
362 | if($this->parametros[$i]["nombre"]==$nombre) |
---|
363 | $this->parametros[$i]["valor"]=mysqli_real_escape_string($this->Conexion->controlador, $valor); |
---|
364 | } |
---|
365 | } |
---|
366 | /* ------------------------------------------------------------------------------------------- |
---|
367 | Establece la conexiónque se usará para ejecutar las acciones pertinentes |
---|
368 | |
---|
369 | Parámetros de entrada: |
---|
370 | objconexion: Un objeto conexion |
---|
371 | ---------------------------------------------------------------------------------------------*/ |
---|
372 | function EstableceConexion($objconexion){ |
---|
373 | $this->Conexion= $objconexion; |
---|
374 | } |
---|
375 | /* ------------------------------------------------------------------------------------------- |
---|
376 | Establece la conexiónque se usará para ejecutar las acciones pertinentes |
---|
377 | |
---|
378 | Parámetros de entrada: |
---|
379 | textocomando: Un texto con la sentencia SQL (Puede contener parámetros) |
---|
380 | ---------------------------------------------------------------------------------------------*/ |
---|
381 | function EstableceTexto($textocomando){ |
---|
382 | $this->texto=$textocomando; |
---|
383 | } |
---|
384 | /* ------------------------------------------------------------------------------------------- |
---|
385 | Sustituye el valor de los parametros en la expresión que forma el texto del Comando |
---|
386 | ---------------------------------------------------------------------------------------------*/ |
---|
387 | function Traduce(){ |
---|
388 | $execomando=$this->texto; |
---|
389 | if (sizeof($this->parametros)>0){ // Hay parámetros que sustituir |
---|
390 | foreach($this->parametros as $parametro){ |
---|
391 | if ($parametro["tipo"]==0) // Tipo alfanumérico |
---|
392 | $execomando=str_replace($parametro["nombre"],"'".$parametro["valor"]."'",$execomando); |
---|
393 | else |
---|
394 | $execomando=str_replace($parametro["nombre"],$parametro["valor"],$execomando); |
---|
395 | } |
---|
396 | } |
---|
397 | $this->texto=$execomando; |
---|
398 | } |
---|
399 | /* ------------------------------------------------------------------------------------------- |
---|
400 | Ejecuta la sentencia SQL contenida en la propiedad texto |
---|
401 | ---------------------------------------------------------------------------------------------*/ |
---|
402 | function Ejecutar(){ |
---|
403 | $this->inderror=-1; // Inicializar contador de errores |
---|
404 | $this->ultimoerror=-1; |
---|
405 | if ($this->texto==null){ |
---|
406 | $this->error[$this->inderror++]=1; // Texto no especificado |
---|
407 | $this->ultimoerror=1; |
---|
408 | return(false); |
---|
409 | } |
---|
410 | else{ |
---|
411 | if ($this->Conexion==null){ |
---|
412 | $this->error[$this->inderror++]=2; // conexión NO establecida |
---|
413 | $this->ultimoerror=2; |
---|
414 | return(false); |
---|
415 | } |
---|
416 | else{ |
---|
417 | if ($this->Conexion->estado==0){ |
---|
418 | $this->error[$this->inderror++]=3; // conexiónNO abierta |
---|
419 | $this->ultimoerror=3; |
---|
420 | return(false); |
---|
421 | } |
---|
422 | } |
---|
423 | } |
---|
424 | $this->Traduce(); |
---|
425 | if (!$this->resul=mysqli_query($this->Conexion->controlador, $this->texto)){ |
---|
426 | $this->error[$this->inderror++]=4; // Error en la sentencia SQL del comando |
---|
427 | $this->ultimoerror=4; |
---|
428 | return(false); |
---|
429 | } |
---|
430 | |
---|
431 | $sqlstr=trim($this->texto); |
---|
432 | |
---|
433 | if (strtoupper(substr($sqlstr,0,6))=="SELECT"){ |
---|
434 | $this->Recordset->Inicializar(); |
---|
435 | $this->Recordset->filas=$this->resul; |
---|
436 | $this->Recordset->numerodecampos=mysqli_num_fields($this->Recordset->filas); |
---|
437 | $this->Recordset->numeroderegistros=mysqli_num_rows($this->Recordset->filas); |
---|
438 | if ($this->Recordset->numeroderegistros>0){ |
---|
439 | $this->Recordset->BOF=false; |
---|
440 | $this->Recordset->EOF=false; |
---|
441 | $this->Recordset->campos=mysqli_fetch_array($this->Recordset->filas); |
---|
442 | } |
---|
443 | } |
---|
444 | |
---|
445 | $this->error[$this->inderror++]=0; // Comando ejecutado correctamante |
---|
446 | $this->ultimoerror=0; |
---|
447 | return(true); |
---|
448 | } |
---|
449 | /* ------------------------------------------------------------------------------------------- |
---|
450 | Esta función recupera el ltimo nmero asignado a una clave autonum�ica de una tabla |
---|
451 | ---------------------------------------------------------------------------------------------*/ |
---|
452 | function Autonumerico(){ |
---|
453 | $ulreg=mysqli_insert_id($this->Conexion->controlador); |
---|
454 | return($ulreg); |
---|
455 | } |
---|
456 | } |
---|
457 | /*========================================================================================= |
---|
458 | Clase para consultar tablas y vistas de una base de datos. |
---|
459 | |
---|
460 | Especificaciones: |
---|
461 | - Estado del recordset ($estado) |
---|
462 | 0: Cerrado |
---|
463 | 1: Abierto |
---|
464 | =========================================================================================*/ |
---|
465 | class Recordset{ |
---|
466 | var $Comando; |
---|
467 | var $filas; |
---|
468 | var $BOF,$EOF,$estado; |
---|
469 | var $campos; |
---|
470 | var $numeroderegistros,$numerodecampos,$posicion; |
---|
471 | |
---|
472 | var $error; // Error |
---|
473 | var $ultimoerror; // Ultimo error detectado |
---|
474 | var $inderror; // Contador de errores |
---|
475 | var $msgerrores=array( |
---|
476 | "No se ha producido ningn error", |
---|
477 | "001 : Recordset Error - Comando no establecido", |
---|
478 | "002 : Recordset Error - No se ha establecido la conexióndel comando", |
---|
479 | "003 : Recordset Error - No se ha abierto la conexion", |
---|
480 | "004 : Recordset Error - No se pudo abrir la consulta", |
---|
481 | "005 : Recordset Error - La sentencia SQL del comando no contiene la clausula SELECT", |
---|
482 | "006 : Recordset Error - No se puede liberar la consulta", |
---|
483 | ); |
---|
484 | /*--------------------------------------------------------------------------------------------*/ |
---|
485 | function __construct(){ // Constructor de la clase |
---|
486 | $this->Inicializar(); |
---|
487 | } |
---|
488 | /* ------------------------------------------------------------------------------------------- |
---|
489 | Inicializa propiedades de las clase |
---|
490 | ----------------------------------------------------------------------------------------------*/ |
---|
491 | function Inicializar(){ |
---|
492 | $this->BOF=true; |
---|
493 | $this->EOF=true; |
---|
494 | $this->posicion=0; |
---|
495 | $this->numeroderegistros=0; |
---|
496 | $this->numerodecampos=0; |
---|
497 | $this->estado=0; |
---|
498 | } |
---|
499 | /* ------------------------------------------------------------------------------------------- |
---|
500 | Devuelve el código del ltimo error ocurrido durante el proceso anterior. |
---|
501 | ----------------------------------------------------------------------------------------------*/ |
---|
502 | function UltimoError(){ |
---|
503 | return($this->ultimoerror); |
---|
504 | } |
---|
505 | /* ------------------------------------------------------------------------------------------- |
---|
506 | Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. |
---|
507 | ----------------------------------------------------------------------------------------------*/ |
---|
508 | function DescripUltimoError(){ |
---|
509 | return($this->msgerrores[$this->ultimoerror]); |
---|
510 | } |
---|
511 | /* ------------------------------------------------------------------------------------------- |
---|
512 | Establece el comando que se usará para ejecutar las consultas pertinentes |
---|
513 | |
---|
514 | Parámetros de entrada: |
---|
515 | objcomando: Un objeto comando con la sentencia SQL (Puede contener parámetros) |
---|
516 | |
---|
517 | Devuelve : |
---|
518 | true : Si el texto del comando contiene la clausula SELECT |
---|
519 | false: En caso contrario |
---|
520 | |
---|
521 | En el caso de devolver false, la función TomaUltimoError() devuelve el error ocurrido |
---|
522 | ---------------------------------------------------------------------------------------------*/ |
---|
523 | function EstableceComando($objcomando){ |
---|
524 | $this->inderror=-1; // Inicializar contador de errores |
---|
525 | $this->ultimoerror=-1; |
---|
526 | if (stristr($objcomando->texto,"select")){ |
---|
527 | $this->Comando=$objcomando; |
---|
528 | $this->error[$this->inderror++]=0; // Comando válido, contiene "SELECT" |
---|
529 | $this->ultimoerror=0; |
---|
530 | return(true); |
---|
531 | } |
---|
532 | else{ |
---|
533 | $this->error[$this->inderror++]=5; // Comando no valido, NO contiene "SELECT" |
---|
534 | $this->ultimoerror=5; |
---|
535 | return(false); |
---|
536 | } |
---|
537 | } |
---|
538 | /* ------------------------------------------------------------------------------------------- |
---|
539 | Sustituye el valor de los parametros en la expresión que forma el texto del Comando |
---|
540 | ---------------------------------------------------------------------------------------------*/ |
---|
541 | function Traduce(){ |
---|
542 | $execomando=$this->Comando->texto; |
---|
543 | if (sizeof($this->Comando->parametros)>0){ // Hay parámetros que sustituir |
---|
544 | foreach($this->Comando->parametros as $parametro){ |
---|
545 | if ($parametro["tipo"]==0) // Tipo alfanumérico |
---|
546 | $execomando=str_replace($parametro["nombre"],"'".$parametro["valor"]."'",$execomando); |
---|
547 | else |
---|
548 | $execomando=str_replace($parametro["nombre"],$parametro["valor"],$execomando); |
---|
549 | } |
---|
550 | } |
---|
551 | $this->Comando->texto=$execomando; |
---|
552 | } |
---|
553 | /* ------------------------------------------------------------------------------------------- |
---|
554 | Recupera registros de la base de datos |
---|
555 | ---------------------------------------------------------------------------------------------*/ |
---|
556 | function Abrir(){ |
---|
557 | $this->inderror=-1; // Inicializar contador de errores |
---|
558 | $this->ultimoerror=-1; |
---|
559 | if ($this->Comando==null){ |
---|
560 | $this->error[$this->inderror++]=1; // Comando no especificado |
---|
561 | $this->ultimoerror=1; |
---|
562 | return(false); |
---|
563 | } |
---|
564 | else{ |
---|
565 | if ($this->Comando->Conexion==null){ |
---|
566 | $this->error[$this->inderror++]=2; // conexiónNO establecida |
---|
567 | $this->ultimoerror=2; |
---|
568 | return(false); |
---|
569 | } |
---|
570 | else{ |
---|
571 | if ($this->Comando->Conexion->estado==0){ |
---|
572 | $this->error[$this->inderror++]=3; // conexiónNO abierta |
---|
573 | $this->ultimoerror=3; |
---|
574 | return(false); |
---|
575 | } |
---|
576 | } |
---|
577 | } |
---|
578 | $this->Traduce(); |
---|
579 | $this->Inicializar(); |
---|
580 | if (!$this->filas=mysqli_query($this->Comando->Conexion->controlador, $this->Comando->texto)){ |
---|
581 | $this->error[$this->inderror++]=4; // Error en la sentencia SQL del comando o al abrir la consula |
---|
582 | $this->ultimoerror=4; |
---|
583 | return(false); |
---|
584 | } |
---|
585 | $this->numeroderegistros=mysqli_num_rows($this->filas); // La consulta se ha realizado con éxito |
---|
586 | $this->numerodecampos=mysqli_num_fields($this->filas); |
---|
587 | if ($this->numeroderegistros>0){ |
---|
588 | $this->BOF=false; |
---|
589 | $this->EOF=false; |
---|
590 | $this->campos=mysqli_fetch_array($this->filas); |
---|
591 | } |
---|
592 | $this->estado=1; // Recordset abierto |
---|
593 | $this->error[$this->inderror++]=0; // Recuperación de registros correcta |
---|
594 | $this->ultimoerror=0; |
---|
595 | return(true); |
---|
596 | } |
---|
597 | /* ------------------------------------------------------------------------------------------- |
---|
598 | Libera los registros de una consulta de la base de datos |
---|
599 | ---------------------------------------------------------------------------------------------*/ |
---|
600 | function Cerrar(){ |
---|
601 | $this->inderror=-1; // Inicializar contador de errores |
---|
602 | $this->ultimoerror=-1; |
---|
603 | mysqli_free_result($this->filas); |
---|
604 | $this->Inicializar(); |
---|
605 | $this->error[$this->inderror++]=0; // Recuperaci� de registros correcta |
---|
606 | $this->ultimoerror=0; |
---|
607 | return(true); |
---|
608 | } |
---|
609 | /* ------------------------------------------------------------------------------------------- |
---|
610 | Mueve el puntero de lectura al siguiente registro del recordset |
---|
611 | ---------------------------------------------------------------------------------------------*/ |
---|
612 | function Siguiente(){ |
---|
613 | if (!$this->EOF){ |
---|
614 | $this->posicion++; |
---|
615 | if ($this->posicion==$this->numeroderegistros) |
---|
616 | $this->EOF=true; |
---|
617 | else{ |
---|
618 | if (mysqli_data_seek($this->filas,$this->posicion)) |
---|
619 | $this->campos=mysqli_fetch_array($this->filas); |
---|
620 | } |
---|
621 | } |
---|
622 | } |
---|
623 | /* ------------------------------------------------------------------------------------------- |
---|
624 | Mueve el puntero de lectura al anterior registro del recordset |
---|
625 | ---------------------------------------------------------------------------------------------*/ |
---|
626 | function Anterior(){ |
---|
627 | if (!$this->BOF){ |
---|
628 | $this->posicion--; |
---|
629 | if ($this->posicion<0) |
---|
630 | $this->BOF=true; |
---|
631 | elseif (mysqli_data_seek($this->filas,$this->posicion)) { |
---|
632 | $this->campos=mysqli_fetch_array($this->filas); |
---|
633 | } |
---|
634 | } |
---|
635 | } |
---|
636 | /* ------------------------------------------------------------------------------------------- |
---|
637 | Mueve el puntero de lectura al primer registro del recordset |
---|
638 | ---------------------------------------------------------------------------------------------*/ |
---|
639 | function Primero(){ |
---|
640 | if ($this->numeroderegistros>0){ |
---|
641 | $this->posicion=0; |
---|
642 | if (mysqli_data_seek($this->filas,$this->posicion)) |
---|
643 | $this->campos=mysqli_fetch_array($this->filas); |
---|
644 | } |
---|
645 | } |
---|
646 | /* ------------------------------------------------------------------------------------------- |
---|
647 | Mueve el puntero de lectura al ltimo registro del recordset |
---|
648 | ---------------------------------------------------------------------------------------------*/ |
---|
649 | function Ultimo(){ |
---|
650 | if ($this->numeroderegistros>0){ |
---|
651 | $this->posicion=$this->numeroderegistros-1; |
---|
652 | if (mysqli_data_seek($this->filas,$this->posicion)) |
---|
653 | $this->campos=mysqli_fetch_array($this->filas); |
---|
654 | } |
---|
655 | } |
---|
656 | } |
---|
657 | /* ------------------------------------------------------------------------------------------- |
---|
658 | Esta función devuelve una matriz asociativa con el nombre de los campos del recordset |
---|
659 | ---------------------------------------------------------------------------------------------*/ |
---|
660 | function DatosNombres(){ |
---|
661 | if (mysqli_data_seek($this->filas,$this->posicion)) |
---|
662 | return(mysqli_fetch_assoc($this->filas)); |
---|
663 | return(""); |
---|
664 | } |
---|
665 | /* ------------------------------------------------------------------------------------------- |
---|
666 | Esta función devuelve información sobre los campos de la tabla |
---|
667 | ---------------------------------------------------------------------------------------------*/ |
---|
668 | function InfoCampos(){ |
---|
669 | $infocampos= array (); |
---|
670 | while ($row = mysqli_fetch_field($this->filas)) { |
---|
671 | $campo["name"]=$row->name; |
---|
672 | $campo["column_source"]=$row->column_source; |
---|
673 | $campo["maxlon"]=$row->max_length; |
---|
674 | $campo["numeric"]=$row->numeric; |
---|
675 | array_push($infocampos,$campo); |
---|
676 | } |
---|
677 | return($infocampos); |
---|
678 | } |
---|
679 | |
---|