Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Weverton Luiz Sales

Log no PHP

Recommended Posts

Boa tarde amigos,

 

Sou novo por aqui, porém trabalho com PHP a um ano e meio e agora eis que estou com uma pequena dúvida! Vamos lá...

Necessito criar um log de ação para um de meus aplicativos, que seja mais ou menos assim:

 

Nome do usuário que realizou alteração;

Id do campo alterado;

Valor anterior;

Valor atual;

 

Todas estas informações serão provindas do BD Mysql...

Agora, terei de verificar o valor anterior e o proximo para ver se houve alteração ou consigo fazer isso com alguma função do Mysql?

 

Ajuda galera!

Um grande abraço a todos... :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Marcos_imasters!

 

Este sistema de logs seria para que haja rastreabilidade no sistema como um todo... Ele será utilizado por um número relativamente grande de usuários, e a empresa me solicitou este recurso... Entende?!

 

Forte abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o jeito mais fácil acho que é usando file_put_contents()

 

http://br.php.net/file_put_contents

 

usando a flas FILE_APPEND no terceiro parâmetro, é feito append no arquivo, sem sobrescrever o conteúdo anterior de le

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Beraldo!

 

Estou querendo guardar o log no próprio BD... Porém, não sei se existe uma forma mais rápida de descobrir qual o campo foi alterando pelo usuário... Caso contrário, terei de efetuar um SELECT antes do comando UPDATE para descobrir qual o campo alterado entende?!

 

Abraço! :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

ah, saquei. pensei que era log em arquivo texto

 

se você fizer um update, não terá como identificar, mais tarde, o que foi mudado. Então o ideal é fazer o log quando for fazer o update. Nesse momento você pode fazer um select para pegar o valor corrente, além de já ter o novo valor do campo.

 

se eu entendi certo, creio que o ideal sera uma função para executar as queries que também faça o log.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, se você estiver usando um ORM, fica mais fácil.

 

Eu uso o Lumine em praticamente todos os meus projetos.

Nele, posso colocar um evento pre-update e lá faço o log.

 

Vou postar somente a função que faz o log.

 

tabela de log e uma outra para poder testar (grupo)

 

 

-- MySQL dump 10.13  Distrib 5.5.15, for Win32 (x86)
--
-- Host: localhost    Database: teste2
-- ------------------------------------------------------
-- Server version	5.5.15

/*!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 utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `log_alteracoes`
--

DROP TABLE IF EXISTS `log_alteracoes`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `log_alteracoes` (
 `codlog` int(11) NOT NULL AUTO_INCREMENT,
 `tabela` varchar(100) DEFAULT NULL,
 `codchave` int(11) DEFAULT NULL,
 `campo` varchar(100) DEFAULT NULL,
 `valor_anterior` text,
 `valor_novo` text,
 `data_alteracao` datetime DEFAULT NULL,
 PRIMARY KEY (`codlog`),
 KEY `tabela` (`tabela`,`campo`,`codchave`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `log_alteracoes`
--

LOCK TABLES `log_alteracoes` WRITE;
/*!40000 ALTER TABLE `log_alteracoes` DISABLE KEYS */;
INSERT INTO `log_alteracoes` VALUES (1,'grupo',1,'nome','teste 1337618109','teste 1337618142','2012-05-21 13:35:42'),(2,'grupo',1,'nome','teste 1337618142','teste 1337618143','2012-05-21 13:35:43'),(3,'grupo',1,'nome','teste 1337618143','teste 1337618151','2012-05-21 13:35:51'),(4,'grupo',1,'nome','teste 1337618151','teste 1337618438','2012-05-21 13:40:38');
/*!40000 ALTER TABLE `log_alteracoes` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `grupo`
--

DROP TABLE IF EXISTS `grupo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `grupo` (
 `codgrupo` int(11) NOT NULL AUTO_INCREMENT,
 `nome` varchar(50) DEFAULT NULL,
 PRIMARY KEY (`codgrupo`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `grupo`
--

LOCK TABLES `grupo` WRITE;
/*!40000 ALTER TABLE `grupo` DISABLE KEYS */;
INSERT INTO `grupo` VALUES (1,'teste 1337618438');
/*!40000 ALTER TABLE `grupo` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!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 */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2012-05-21 13:41:14

 

 

 

Codigo para gerar o log (usando o ORM Lumine)

 

 

 

<?php

// inclui os arquivos necessarios
include 'lumine-conf.php';
include 'lumine-1.6/Lumine.php';

// inicia a configuração
$conf = new Lumine_Configuration($lumineConfig);
spl_autoload_register(array('Lumine','import'));

/**
* Metodo para gerar o log de alterações
* É executado  ANTES do update
*
* @param Lumine_Event $event Evento disparado pelo Lumine
* @return void
*/
function log_alteracoes(Lumine_Event $event){
// pegamos a classe do objeto que disparou o evento
$class = get_class($event->obj);
// criamos uma nova instancia
$log = new $class();

// pegamos as chaves primarias
$pks = $log->metadata()->getPrimaryKeys();

// alterações encontradas
$alteracoes = array();

// se tiver somente uma chave primaria
if(count($pks) == 1){
	// pegamos as informações da chave
	$pk = $pks[0];

	// recuperamos os valores atuais que estão no banco de dados 
	$log->get($event->obj->$pk['name']);

	// para cada campo do resultado encontrado
	foreach($log->toArray() as $key => $value){
		// se não for igual ao que o usuario está mandando agora
		if($value != $event->obj->$key){
			// colocamos no array de alterações
			$alteracoes[$key]['old'] = $value;
			$alteracoes[$key]['new'] = $event->obj->$key;
		}
	}
}

// e para cada alteração, gravamos o registro
foreach($alteracoes as $key => $values){
	$logger = new LogAlteracoes();
	$logger->codchave = $log->$pk['name'];
	$logger->dataAlteracao = time();
	$logger->tabela = $log->metadata()->getTablename();
	$logger->campo = $key;
	$logger->valorAnterior = $values['old'];
	$logger->valorNovo = $values['new'];
	$logger->save();
	$logger->destroy();
}
}

// para o Lumine mostrar as consultas que estão sendo realizadas
Lumine_Log::setLevel(3);

//////////////// Testando a bagaça toda =D ///////////////
$grupo = new Grupo();
// adicionamos um listener para ser executado ANTES do update
$grupo->addEventListener(Lumine_Event::PRE_UPDATE, 'log_alteracoes');
// pega o grupo de codigo 1
$grupo->get(1);
// altera o nome para qualquer coisa
$grupo->nome = 'teste ' . time();
// faz o update
$grupo->save();

 

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal peço desculpas pela demora em postar o resultado, mas vamos aos fatos!

 

Utilizando o conselho de nosso amigo Prog, pesquisei a respeito das Trigger's e percebi que realmente ela seria a solução para os meus problemas: [Vamos lá]

 

1) Como utilizo o phpmyadmin, é necessário primeiramente alterar o Delimitador, para isso utilizamos:

 

DELIMITER |

 

2) Posteriormente devemos criar a trigger propriamente dita:

 

 CREATE TRIGGER log_update_tb_registros AFTER UPDATE ON `lasl`.`tb_registros` 
    FOR EACH ROW 
      BEGIN

 

Aqui, estamos criando um gatilho que será ativado todas as vezes que o evento de UPDATE acontecer na tabela "tb_registros".

 

3) Agora preciso identificar qual o campo que foi alterado pelo nosso tão querido usuário. Para isso:

 

IF(old.cod_categoria <> new.cod_categoria) THEN				

  INSERT INTO `lasl`.`tb_log` (`cod_log`, `cod_registro`, `campo`, `valor_antes`, `valor_depois`,       `matricula_usuario`)VALUES(NULL, new.cod_registro, 'cod_categoria', old.cod_categoria, new.cod_categoria , new.ultima_alteracao);

END IF; 

 

Utilizando Old e New, podemos verificar e descobrir qual o campo que realmente sofreu alguma alteração, somente então inserimos um novo registro na tb_log...

 

4) Bom, finalmente eis que o nosso código fica assim:

 

DELIMITER |

CREATE TRIGGER log_update_tb_registros AFTER UPDATE ON `lasl`.`tb_registros` 
 FOR EACH ROW 
   BEGIN 
-- Código da categoria
       IF(old.cod_categoria <> new.cod_categoria) THEN				

		INSERT INTO `lasl`.`tb_log` (`cod_log`, `cod_registro`, `campo`, `valor_antes`,  `valor_depois`, `matricula_usuario`)
		VALUES
		(NULL, new.cod_registro, 'cod_categoria', old.cod_categoria, new.cod_categoria , new.ultima_alteracao);

     END IF; 

	-- Código da instalação
    IF(old.cod_ua_us <> new.cod_ua_us) THEN 

		INSERT INTO `lasl`.`tb_log` (`cod_log`, `cod_registro`, `campo`, `valor_antes`,                 `valor_depois`, `matricula_usuario`)
		VALUES
		(NULL, new.cod_registro, 'cod_ua_us', old.cod_ua_us, new.cod_ua_us, new.ultima_alteracao);

    END IF; 

END| 

DELIMITER ;	

 

O problema foi resolvido no meu caso, agradeço a ajuda de todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.