Haciendo una bitácora para una aplicación Web con CodeIgniter
Se preguntarán para que sirve una bitácora en en una Aplicación Web. Bueno les diré, es muy útil, ya que va guardando los movimientos de los usuarios y en caso de reclamo por parte de los usuarios de que el sistema que hemos desarrollado no funciona por que han perdido datos pero en realidad ellos los borraron por razones privadas, nosotros podremos defendernos con esta bitácora de movimientos que dirá a que hora se realizo cierta acción y quien la realizo ejemplo:
Como pueden ver se puede visualizar la acción realizada, el usuario al que se le hizo el cambio luego al usuario que realizo
el cambio, la fecha y hora en que se realizo la acción y valor anterior y el valor nuevo
A continuación les mostrare parte del código
Vista de la bitácora “bitacora.php”
<?php function estado($edo){ if($edo==1){ return "Administrador"; } else { return "Usuario"; } } $eliminar = base_url()."imagenes/eliminar.fw.png"; $actualizar = base_url()."imagenes/modificar.png"; function estadoImg($edo){ $palomita = base_url()."imagenes/v.fw.png"; $x = base_url()."imagenes/eliminar.png"; if($edo==1){ return "<img src=".$palomita.">"; } else{ return "<img src=".$x.">"; } } ?> <script type="text/javascript"> <!-- function confirmacion(id) { var answer = confirm("Esta seguro que desea eliminar") if (answer){ alert("Ha confirmado eliminar") location.href="deleteUserId/"+id } else{ alert("Cancelado") } } function actualizar(id) { location.href="updateUserId/"+id } //--> </script> <body> <h1> <?php echo $_SESSION['nombre'];?> </h1> <h3>Bitacora</h3> <div id="container"> <div id="body" align="center"> <table border="0" align="center"> <tr> <form id="b" name="b" action="<?=base_url()?>index.php/welcome/buscarBitacora" method="POST"> <td><label for="buscar">Buscar</label> </td> <td><input type= "text" id="buscar" name="buscar" ></td> <td><input type="submit" id="arre" name="arre" value="buscar"</td></tr> </form> </tr> </table> <table border="0" align="center" id="tabla"> <tr bgcolor="#7362ec" align="center"> <td><b>Acción</b></td> <td><b>Usuario administrado</b></td> <td><b>Usuario administrador </b></td> <td><b>Fecha</b></td> <td><b>Valor Anterior</b></td> <td><b>Valor nuevo</b></td> </tr> <?php $colorfila=0; if($users!=false){ foreach($users->result() as $row){ if ($colorfila==0){ $color= "#b5b5b5"; $colorfila=1; }else{ $color="#f7f7f7"; $colorfila=0; } echo "<tr bgcolor='".$color."' align='center' ";?> onmouseover="this.style.backgroundColor='#E13300'" onmouseout="this.style.backgroundColor='<?php echo $color;?>'"><?php echo "<td> ".$row->accion."</td>"; echo "<td>".$row->UsuarioAdministrado. "</td>"; echo "<td > ".$row->usuarioAdministrador."</td>"; echo "<td>".$row->fecha."</td>"; echo "<td>".$row->valor_anterior."</td>"; echo "<td>".$row->valor_nuevo."</td>"; echo "</tr>"; } } ?> </table> </div> </div> </body>
//FUNCION GUARDAR BITACORA public function guardarBitacora($id,$accion){ if(isset($_SESSION['usuario'])){ $datoAnterior=""; $datoNuevo=""; //Obteniendo los datos que se van a modificar $nom_usu = $this->input->post('nom_usu'); $clave=sha1($this->input->post('psw')); $login = $this->input->post('login'); $status = $this->input->post('status'); $acceso = $this->input->post('acceso'); $local = $this->input->post('local'); $ld_nacional = $this->input->post('ld_nacional'); $cel_ld = $this->input->post('cel_ld'); $cel_local = $this->input->post('cel_local'); $internacional = $this->input->post('internacional'); $br="<br />"; //Obterner los datos de la la base de datos $datosDB=$this->usersModel->datosUsuario($id); //Comparando login if($login==@$datosDB->login){ $datoAnterior.=""; } else{ $datoAnterior.="login:".$datosDB->login; $datoNuevo.="login:".$login; } //Comparando nombre de usuario if($nom_usu==$datosDB->nom_usu){ $datoAnterior.= ""; } else{ $datoAnterior.=$br."nom_usu:".$datosDB->nom_usu; $datoNuevo.=$br."login:".$nom_usu; } //Comparando nombre de password if($clave==$datosDB->psw){ $datoAnterior.= ""; } else{ $datoAnterior.=$br."psw:***"; $datoNuevo.=$br."login:???"; } //Comparando status if($status==$datosDB->status){ $datoAnterior.=""; } else{ $datoAnterior.=$br."status:".$datosDB->status; $datoNuevo.=$br."status:".$status; } //Comparando acceso if($acceso==$datosDB->acceso){ $datoAnterior.=""; } else{ $datoAnterior.=$br."acceso:".$datosDB->acceso; $datoNuevo.=$br."acceso:".$acceso; } //Comparando llamadas locales if($local==$datosDB->local){ $datoAnterior.=""; } else{ $datoAnterior.=$br."local:".$datosDB->local; $datoNuevo.=$br."local:".$local; } //Comparando llamadas nacionales if($ld_nacional==$datosDB->ld_nacional){ $datoAnterior.=""; } else{ $datoAnterior.=$br."ld_nacional:".$datosDB->ld_nacional; $datoNuevo.=$br."ld_nacional:".$ld_nacional; } //Comparando llamadas cel_ld if($cel_ld==$datosDB->cel_ld){ $datoAnterior.=""; } else{ $datoAnterior.=$br."cel_ld:".$datosDB->cel_ld; $datoNuevo.=$br."cel_ld:".$cel_ld; } //Comparando llamadas cel_local if($cel_local==$datosDB->cel_local){ $datoAnterior.=""; } else{ $datoAnterior.=$br."cel_local:".$datosDB->cel_local; $datoNuevo.=$br."cel_local:".$cel_local; } if($internacional==$datosDB->internacional){ $datoAnterior.=""; } else{ $datoAnterior.=$br."Internacional:".$datosDB->internacional; $datoNuevo.=$br."internacional:".$internacional; } $dataBit = array( "accion" => $accion, "usuarioAdministrador" => $_SESSION["login"], "usuarioAdministrado" => $login, "valor_anterior" => $datoAnterior, "valor_nuevo" => $datoNuevo ); $this->usersModel->insertBitacora($dataBit); } }
Ahora la parte del modelo “usersmodels”
public function getBitacora(){ $data=$this->db->get('vistabitacora'); if($data->num_rows() >0){ return $data; }else{ return false; } } public function insertBitacora($data){ $this->db->insert('bitacora',$data); } function buscarBitacora($dato){ $this->db->select('accion'); $this->db->select('usuarioAdministrador'); $this->db->select('UsuarioAdministrado'); $this->db->select('valor_anterior'); $this->db->select('valor_nuevo'); $this->db->select('fecha'); $this->db->like('usuarioAdministrador',$dato); $this->db->or_like('accion',$dato); $this->db->or_like('usuarioAdministrado',$dato); $this->db->or_like('valor_anterior',$dato); $this->db->or_like('valor_nuevo',$dato); $this->db->or_like('fecha',$dato); $consul=$this->db->get('bitacora'); if($consul->num_rows() >0){ return $consul; }else{ return false; } }
Archivo SQL
# SQL Manager 2010 for MySQL 4.5.1.3
# ---------------------------------------
# Host : localhost
# Port : 3306
# Database : asteriskcdrdb
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES latin1 */;
SET FOREIGN_KEY_CHECKS=0;
CREATE DATABASE `asteriskcdrdb`
CHARACTER SET 'latin1'
COLLATE 'latin1_swedish_ci';
USE `asteriskcdrdb`;
#
# Structure for the `bitacora` table :
#
CREATE TABLE `bitacora` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`accion` varchar(20) DEFAULT NULL,
`usuarioAdministrador` varchar(20) DEFAULT NULL,
`usuarioAdministrado` varchar(20) CHARACTER SET latin1 COLLATE latin1_spanish_ci NOT NULL,
`valor_anterior` varchar(200) DEFAULT NULL,
`valor_nuevo` varchar(200) DEFAULT NULL,
`fecha` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=latin1 COMMENT='id-int(11)\naccion-varchar(20)\nusuario-varchar(20)\nfecha-date\nhora-time\nvalor_anterior-varchar(20)\nvalor_nuevo-varchar(20)';
#
# Structure for the `cdr` table :
#
CREATE TABLE `cdr` (
`calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL DEFAULT '',
`src` varchar(80) NOT NULL DEFAULT '',
`dst` varchar(80) NOT NULL DEFAULT '',
`dcontext` varchar(80) NOT NULL DEFAULT '',
`channel` varchar(80) NOT NULL DEFAULT '',
`dstchannel` varchar(80) NOT NULL DEFAULT '',
`lastapp` varchar(80) NOT NULL DEFAULT '',
`lastdata` varchar(80) NOT NULL DEFAULT '',
`duration` int(11) NOT NULL DEFAULT '0',
`billsec` int(11) NOT NULL DEFAULT '0',
`disposition` varchar(45) NOT NULL DEFAULT '',
`amaflags` int(11) NOT NULL DEFAULT '0',
`accountcode` varchar(20) NOT NULL DEFAULT '',
`uniqueid` varchar(32) NOT NULL DEFAULT '',
`userfield` varchar(255) NOT NULL DEFAULT '',
KEY `IDX_UNIQUEID` (`uniqueid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
#
# Structure for the `user_control` table :
#
CREATE TABLE `user_control` (
`id_usu` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`status` int(1) unsigned NOT NULL DEFAULT '1',
`nom_usu` varchar(25) NOT NULL,
`login` varchar(4) NOT NULL DEFAULT '0000',
`psw` varchar(40) CHARACTER SET latin1 COLLATE latin1_spanish_ci NOT NULL,
`local` tinyint(4) NOT NULL DEFAULT '0',
`ld_nacional` tinyint(4) NOT NULL DEFAULT '0',
`cel_local` tinyint(4) NOT NULL DEFAULT '0',
`cel_ld` tinyint(4) NOT NULL DEFAULT '0',
`internacional` tinyint(4) NOT NULL DEFAULT '0',
`acceso` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_usu`),
UNIQUE KEY `login` (`login`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8;
#
# Structure for the `usuarios` table :
#
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
#
# Data for the `bitacora` table (LIMIT 0,500)
#
INSERT INTO `bitacora` (`id`, `accion`, `usuarioAdministrador`, `usuarioAdministrado`, `valor_anterior`, `valor_nuevo`, `fecha`) VALUES
(1,'CerrarSesion','45','',NULL,NULL,'2012-11-02 19:06:35'),
(2,'Acceso','00','',NULL,NULL,'2012-11-02 19:09:07'),
(3,'Actualización','00','00','<br />acceso:1','<br />acceso:0','2012-11-02 19:09:41'),
(4,'CerrarSesion','00','',NULL,NULL,'2012-11-02 19:09:45'),
(5,'Acceso','00','',NULL,NULL,'2012-11-02 19:09:52'),
(6,'CerrarSesion','00','',NULL,NULL,'2012-11-02 19:12:31'),
(7,'Acceso','00','',NULL,NULL,'2012-11-02 19:12:40'),
(8,'CerrarSesion','00','',NULL,NULL,'2012-11-02 19:13:27'),
(9,'Acceso','00','',NULL,NULL,'2012-11-02 19:13:34'),
(10,'Acceso','05','',NULL,NULL,'2012-11-05 09:33:09'),
(11,'CerrarSesion','05','',NULL,NULL,'2012-11-05 09:37:14'),
(12,'Acceso','05','',NULL,NULL,'2012-11-05 09:38:30'),
(13,'Actualización','05','0','login:05<br />nom_usu:Julio Cesar<br />status:1<br />acceso:1<br />local:1','login:<br />login:<br />status:<br />acceso:<br />local:','2012-11-06 16:51:42'),
(14,'Cambio de contraseña','05','',NULL,NULL,'2012-11-06 16:55:18'),
(15,'CerrarSesion','05','',NULL,NULL,'2012-11-06 16:55:24'),
(16,'Acceso','00','',NULL,NULL,'2012-11-06 16:58:49'),
(17,'Actualización','00','05','','','2012-11-06 16:59:29'),
(18,'Actualización','00','05','<br />psw:***<br />local:0','<br />login:???<br />local:1','2012-11-06 17:01:56'),
(19,'Actualización','00','05','<br />local:0','<br />local:1','2012-11-06 17:03:18'),
(20,'CerrarSesion','00','',NULL,NULL,'2012-11-06 17:03:29'),
(21,'Acceso','05','',NULL,NULL,'2012-11-06 17:03:34'),
(22,'Cambio de contraseña','05','',NULL,NULL,'2012-11-06 17:03:49'),
(23,'CerrarSesion','05','',NULL,NULL,'2012-11-06 17:03:54'),
(24,'Acceso','05','',NULL,NULL,'2012-11-06 17:04:01'),
(25,'Acceso','05','',NULL,NULL,'2012-11-07 07:00:08'),
(26,'Registro','05','10','login:<br />nom_usu:<br />psw:***<br />status:<br />acceso:<br />local:','login:10<br />login:Chicho<br />login:???<br />status:1<br />acceso:0<br />local:1','2012-11-07 07:01:00'),
(27,'Registro','05','0','<br />psw:***','<br />login:???','2012-11-07 07:03:42'),
(28,'Cambio de contraseña','05','',NULL,NULL,'2012-11-07 07:05:35'),
(29,'Cambio de contraseña','05','43',NULL,NULL,'2012-11-07 07:08:16'),
(30,'CerrarSesion','05','',NULL,NULL,'2012-11-07 07:13:31'),
(31,'Acceso','05','',NULL,NULL,'2012-11-07 07:17:14'),
(32,'Eliminacion','05','40','id_usu:40<br />nom_usu:Felipe<br />acceso:1<br />status:1<br />local:0<br />ld_nacional:0<br />cel_local:0<br />cel_ld:0<br />intenacional:0',NULL,'2012-11-07 07:17:59'),
(33,'Actualización','05','01','login:05<br />psw:***<br />acceso:1<br />local:0','login:01<br />login:???<br />acceso:0<br />local:1','2012-11-07 07:23:14'),
(34,'Actualización','05','11','login:01<br />local:0','login:11<br />local:1','2012-11-07 07:23:57'),
(35,'Actualización','05','01','<br />psw:***<br />local:0','<br />login:???<br />local:1','2012-11-07 07:26:04'),
(36,'Registro','05','21',NULL,NULL,'2012-11-07 07:41:53'),
(37,'CerrarSesion','05','',NULL,NULL,'2012-11-07 07:42:07'),
(38,'Acceso','21','',NULL,NULL,'2012-11-07 07:42:16'),
(39,'Cambio de contraseña','21','',NULL,NULL,'2012-11-07 07:42:36'),
(40,'CerrarSesion','21','',NULL,NULL,'2012-11-07 07:42:48'),
(41,'Acceso','21','',NULL,NULL,'2012-11-07 07:42:56'),
(42,'CerrarSesion','21','',NULL,NULL,'2012-11-07 07:43:35'),
(43,'Acceso','10','',NULL,NULL,'2012-11-10 17:13:47'),
(44,'CerrarSesion','10','',NULL,NULL,'2012-11-10 17:13:55'),
(45,'Acceso','06','',NULL,NULL,'2012-11-10 17:15:15'),
(46,'CerrarSesion','06','',NULL,NULL,'2012-11-10 17:16:21'),
(47,'Acceso','06','',NULL,NULL,'2012-11-10 17:16:32');
COMMIT;
#
# Data for the `cdr` table (LIMIT 0,500)
#
INSERT INTO `cdr` (`calldate`, `clid`, `src`, `dst`, `dcontext`, `channel`, `dstchannel`, `lastapp`, `lastdata`, `duration`, `billsec`, `disposition`, `amaflags`, `accountcode`, `uniqueid`, `userfield`) VALUES
('2012-09-03 19:52:50','\"Julian Garibaldi\" <100>','100','100','from-internal','SIP/100-00000000','SIP/100-00000001','Dial','SIP/100,\"\",tr',10,5,'ANSWERED',3,'','1346723570.0',''),
('2012-09-04 13:28:33','\"Julian Garibaldi\" <100>','100','100','from-internal','SIP/100-00000001','SIP/100-00000002','Congestion','10',5,0,'FAILED',3,'','1346786913.1',''),
('2012-09-04 13:29:08','\"Julian Garibaldi\" <100>','100','100','from-internal','SIP/100-00000004','SIP/100-00000005','Dial','SIP/100,\"\",tr',24,22,'ANSWERED',3,'','1346786948.4',''),
('2012-09-04 13:33:52','\"Julian Garibaldi\" <100>','100','100','from-internal','SIP/100-00000006','SIP/100-00000007','Congestion','10',5,0,'FAILED',3,'','1346787232.6',''),
('2012-09-04 13:35:36','\"Julian Garibaldi\" <100>','100','100','from-internal','SIP/100-0000000d','SIP/100-0000000e','Dial','SIP/100,\"\",tr',16,8,'ANSWERED',3,'','1346787336.13',''),
('2012-09-04 14:13:33','\"Recepcion\" <300>','300','300','personalizado','SIP/300-0000000f','SIP/300-00000010','Hangup','',30,0,'NO ANSWER',3,'','1346789613.15',''),
('2012-09-04 14:14:08','\"Recepcion\" <300>','300','300','personalizado','SIP/300-00000011','SIP/300-00000012','Dial','SIP/300,30,Tt',28,25,'ANSWERED',3,'','1346789648.17',''),
('2012-09-04 14:18:24','\"Recepcion\" <300>','300','300','personalizado','SIP/300-00000013','SIP/300-00000014','Dial','SIP/300,30,Tt',4,0,'NO ANSWER',3,'','1346789904.19','');
COMMIT;
#
# Data for the `user_control` table (LIMIT 0,500)
#
INSERT INTO `user_control` (`id_usu`, `status`, `nom_usu`, `login`, `psw`, `local`, `ld_nacional`, `cel_local`, `cel_ld`, `internacional`, `acceso`) VALUES
(36,0,'kakaroto','45','da39a3ee5e6b4b0d3255bfef95601890afd80709',0,0,1,1,0,0),
(38,1,'Julio Cesar','01','7c4a8d09ca3762af61e59520943dc26494f8941b',0,0,0,0,0,0),
(39,1,'Julian Garibaldi','06','4f62e47bd66b5ab1a8fa1e9508d53ae78e7dcfac',0,1,1,1,1,1),
(41,1,'Chicho','10','4f62e47bd66b5ab1a8fa1e9508d53ae78e7dcfac',1,0,0,0,0,0),
(42,0,'0','0','da39a3ee5e6b4b0d3255bfef95601890afd80709',0,0,0,0,0,0),
(43,1,'diane','11','4f62e47bd66b5ab1a8fa1e9508d53ae78e7dcfac',1,0,0,0,0,0),
(45,1,'Mijail','43','4f62e47bd66b5ab1a8fa1e9508d53ae78e7dcfac',1,0,0,0,0,0),
(46,1,'xyz','21','dd5fef9c1c1da1394d6d34b248c51be2ad740840',1,0,0,0,0,0);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Comentarios
Publicar un comentario