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:

image

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>

La parte del controlador “users.php”



//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 */;

 
0