Michael Mafort

Author Archive

Facilidades para sua vida – Parte 6 – Acesso restrito para imagens

by on jan.29, 2009, under Facilidades para sua vida, Linux, PHP

Bom, hoje no grupo de php surgiu uma dúvida de como fazer um bloqueio de acesso a imagens caso o usuário não tenha permissão (não esteja logado), então sugeri que fosse feito utilizando regras do htaccess, vejamos como ficou.

Vamos seguir o exemplo da seguinte estrutura:

htdocs
- scripts
- img
- etc…

Dentro do diretório img que temos as imagens restritas, vamos criar um arquivo .htaccess.
Lembrando que antes de usar os arquivos .htacess o seu apache deve estar configurado para leitura destes arquivos e o módulo rewrite habilitado.

Para isto basta verificar se seu httpd.conf está com estas configurações:

1
2
3
4
5
6
7
LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c
 
<directory>
    Options Indexes FollowSymLinks
    AllowOverride All
</directory>

Se não tiver basta descomentar as linhas do LoadModule e AddModule, e adicionar dentro do seu directory root as duas linhas, Options e AllowOverride.

Agora vamos criar nosso arquivo .htaccess:

1
2
3
4
5
6
7
8
9
10
11
<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine on
 
    #Verificamos se a imagem é .jpg ou .gif
    RewriteCond %{REQUEST_FILENAME} (.jpg|.gif)$
 
    #Redirecionamos a requisição para o arquivo index.php
    #passando como parametro get o nome da imagem  $1
    RewriteRule ^(.*)$ index.php?image=$1 [NC,L]
</IfModule>

Criamos também o arquivo index.php dentro do diretório img, vamos ao exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
//Inicia a sessão
@session_start();
//Setamos a sessão para o teste com o valor 1
//Para testar se não o usuário não está logado, exclua a linha abaixo
$_SESSION['uid'] = 1;//logado
 
/*
Verifica se existe a sessão, deve ser feito de acordo com sua necessidade
Este é apenas um exemplo didático
*/
if( isset($_SESSION['uid']) ){
    //Define o header para o mime type do arquivo requisitado image/jpg ou image/gif
    header("Content-Type: ".mime_content_type($_GET['image']) );
 
    //Lê o arquivo e joga na saída
    readfile($_GET['image']);
}else{
    //Define o Contenty-type como image/gif
    header("Content-Type: image/gif" );
 
    //Lê o arquivo e joga na saída
    readfile('deny.gif');
}
 
?>

Crie um arquivo chamado deny.gif no seu diretório img para ser exibido caso o usuário não tenha permissão para visualizar as imagens.

Pronto, o acesso as suas imagens já estará bloqueado para usuários que não estejam logados.

Abraço!

Leave a Comment more...

Facilidades para sua vida – Parte 5 – Criando backups no mysql

by on jan.28, 2009, under Facilidades para sua vida, Linux, Mysql

Para criar backups no mysql é muito simples, basta ter o mysqldump instalado em sua máquina, para isto verifique se no diretório onde estão os binários do seu mysql se ele está lá se estiver basta acessar pelo prompt/shell. No windows você pode adicionar o caminho dos arquivos binários ao path do sistema, para que seja acessivel em qualquer lugar, ou então você entra no diretório pelo prompt.

Ex.: cd c:\mysql\bin

Adicionando a váriaveis de ambiente a path do windows (no linux por padrão já deverá estar configurado):

Clique em propriedades do sistema, na aba avançado clique em variáveis de ambiente, em variáveis do sistema clique em path e em editar, adicione ao final do path o caminho para os binários do mysql, no exemplo c:\mysql\bin, lembrando de mantê-lo separado do anterior por um ponto e virgula “;”.

Agora vamos ao backup:

Dump de um banco específico:

1
mysqldump -h endereco_do_host -u usuario_mysql --password senha_do_usuario --database nome_do_banco &gt; nome_do_arquivo_saida.sql

Dump de todos os bancos:

1
mysqldump -h endereco_do_host -u usuario_mysql --password senha_do_usuario --all-databases &gt; nome_do_arquivo_saida.sql

Explicando:

-h: host do seu mysql. Ex.: mysql.exemplo.com.br, localhost ou o ip do seu banco
-u: usuário do seu mysql.
–password: senha do seu mysql.
–database: nome do banco de dados a ser exportado.
–all-databases: para exportar todos os bancos que o usuário tem permissão.
>: Significa que a saida irá para um arquivo a ser informado a seguir, no nosso exemplo nome_do_arquivo_saida.sql

É isso ai pessoal.

Abraço!

1 Comment more...

Facilidades para sua vida – Parte 4 – Expressões Regulares

by on jan.26, 2009, under Facilidades para sua vida, PHP

Em javascript, php, java, action script 3 entre outras linguagens de programação temos suporte às expressões regulares, que auxiliam no serviço de tratamento de strings de várias formas, dentre elas:
- Validação de datas, emails, ip, url;
- Procura por termos expecificos;
- Procura por textos no inicio ou fim da string;
- Substituição de termos.

“Bem resumido, uma expressão regular é um método formal de se especificar um padrão de texto.

Mais detalhadamente, é uma composição de símbolos, caracteres com funções especiais, que, agrupados entre si e com caracteres literais, formam uma seqüência, uma expressão. Essa expressão é interpretada como uma regra, que indicará sucesso se uma entrada de dados qualquer casar com essa regra, ou seja, obedecer exatamente a todas as suas condições.” [http://guia-er.sourceforge.net/apresentando.html#1_3]

Nesta parte vamos aprender um pouco sobre o funcionamento e ver alguns exemplos de uso em javascript e php.

Caracteres e seus significados:

. (ponto) – Significa que pode ter entrada de qualquer caracter. A expressão /./ tanto em php quanto em javascript significa que pode-se dar entrada de quantos caracteres quiser em qualquer combinação.
Ex.:

1
2
3
4
5
6
7
8
9
10
11
//Verifica se a string não está vazia
 
function javascriptER(){
 
    //Declara a expressão regular
 
    var ER = /./;    //Testa a string asd com a ER. Neste teste o retorno será true se passar "" vazio o retorno será false.
 
    return ER.test("asd");
 
}
1
2
3
4
5
6
7
8
9
function phpER(){
 
    //Declara a expressão regular
 
    $ER = '/./';    //Testa a string asd com a ER. Neste teste o retorno será true se passar "" vazio o retorno será false.
 
    return preg_match($ER, "string");
 
}

Criando listas: Listas são agrupamentos de informações em ER para dizer alguma determinada regra.
Ex.: [0-9] nesta lista se tiver algum numero de 0-9 (o hifen serve como escala de até de 0 até 9 de A até Z…) ele retornará true, para verificar se tem apenas número use /^[0-9]{1,}$/ onde ^ diz que inicia a ER e $ diz quando termina, {1,} significa que o valor será procurado de 1 até N vezes na string, assim a string com “00099878″ retornará true e a string com “03090338.0494″ retornará false. Para validar um número com duas casas decimais, separado por ponto usaria /^[0-9]{1,}[\.][0-9]{0,2}$/ o \. significa que o caracter “.” está sendo escapado, pois ele representa qualquer caracter, sendo escapado representará apenas ele mesmo.

Agora já vimos que ^ significa que deverá ser procurado no inicio, $ no final {2,3} quantidade de vezes que a regra da lista pode ser repetida, \ é o caracter de escape.

Agora vem outro significado para o caracter ^ (circunflexo), ele também representa o valor negativo, rejeitado, oposto, not. Ex.: [^0-9] ele irá procurar todos os caracteres que não sejam de 0 a 9. Se quiser criar uma regra com o circunflexo pode-se utilizá-lo no final da instrução, assim: [0-9^] retorna verdadeiro para caracteres de 0 a 9 e ^ 00099^09 é um valor válido para esta ER.

Bom como tem gente na internet que já explicou muito melhor do que eu poderia explicar o que são ERs, vou mandar para vocês o link de um pequeno tutorial de como usar Expressões Regulares.

http://guia-er.sourceforge.net/

Outra dica é o Add-on do Firefox para testar as suas Expressões regulares:

Regular Expression Tester

Firebug (utilizando o console para executar scripts javascript em modo interativo)

Abraço,

Leave a Comment more...

Facilidades para sua vida – Parte 3 – Utilizando frameworks

by on jan.25, 2009, under CakePHP, Facilidades para sua vida, PHP

Framework segundo a wikipédia, é “um conjunto de classes que colaboram para realizar uma responsabilidade para um domínio de um subsistema da aplicação.”

Resumindo os frameworks vieram para facilitar nossas vidas, agilizando (e muito) o processo de desenvolvimento e criando padrões que tornam a programação unificada e de fácil manutenção por qualquer um, desde que o padrão adotado pelo framework seja entendido e aplicado pelo desenvolvedor.

Alguns exemplos de frameworks:

Javascript (Biblioteca de funções javascript, como efeitos, animações, controle DOM, ajax…):

Jquery – Na minha opinião a mais produtiva e fácil aprendizado, compatibilidade com a maioria dos browsers em uso e vários plugins que podem ser acrescidos para facilitar ainda mais.
Prototype – Fácil uso de ajax e controle DOM.
ExtJS – Com uma biblioteca gráfica para customização muito boa.
Dojo, – Rápida e com vários addons.

PHP:

CakePHP - Agilidade no desenvolvimento, padrões de Design Pattern, MVC,  ORM  (Mapeamento Objeto Relacional), Scaffold (Desenvolvimento de Criação, Edição, Visualização e Exclusão de dados em uma linha de código), acesso a components entre outras milhares de funcionalidades que facilitam nossas vidas. Baseado no Rails do Ruby on Rails, é um framework php completo.
CodeIgniter - MVC, curva de aprendizagem baixa, fácil intendimento, processamento veloz das informações documentação completa.
ZendFramework - O mais robusto e com certeza o que será em breve o melhor framework, pois é desenvolvido pela mesma empresa que mantem hoje o php.

Bom acredito que com estes frameworks já possa ter um desempenho melhor e uma programação mais limpa daqui pra frente.

Abraço.

1 Comment more...

Facilidades para sua vida – Parte 2 – Um pouco de MySql

by on jan.23, 2009, under Facilidades para sua vida, Mysql

Nesta nossa série, chegou a vez de conhecermos um pouco mais de algumas instruções sql que podem facilitar e muito o nosso trabalho.

Vamos lá:

Selecionando informações no banco de dados:

SELECT * FROM minha_tabela #(òóh my God! isso não)
SELECT campo1, campo2, campo3 FROM minha_tabela #(assim ta bunito)

Utilizando * você estará selecionando todos os campos de sua tabela, e na maioria das vezes você não irá utilizar todos os campos, então a melhor coisa a se fazer é buscar apenas o que vai usar, economia de processamento e melhora de desempenho.

Inserindo dados:

1
2
3
4
5
6
INSERT INTO minha_tabela (campo1, campo2, campo3, campo4) VALUES ( 'valor 1', 'valor2', 'valor3', 'valor4')
#ou a partir do mysql 4.1 pode se usar o SET ficando assim:
INSERT INTO minha_tabela SET campo1 = 'valor 1', campo2 = 'valor2', campo3 = 'valor3', campo4 = 'valor4'
#ou inserir dados numa tabela a partir de outra (no mesmo banco)
INSERT INTO tabela1(campo1, campo2) (SELECT descricao AS campo1, valor AS campo2 FROM tabela2);
#neste caso os campos 1 e 2 da tabela 1 serão preenchidos pelos valores de descricao e valor da tabela 2, notem que é importante colocar um AS para criar um alias para os campos terem os mesmos nomes.

Atualizando dados:

1
2
3
4
5
6
7
8
#neste exemplo iremos atualizar os campos campo1 e campo2 da tabela1 o WHERE é para criar uma condição aos registros que serão atualizados, sem ele todos os registros da tabela serão atualizados, portanto o WHERE  é muito importante, a não ser claro que deseja afetar todos os registros com sua atualização.
UPDATE tabela1 SET campo1 = 'novo_valor', campo2 = 'novo_valor campo 2' WHERE campo_id = 1;
 
#vamos atualizar os dados da tabela substituindo informações dos proprios campos usanto a função replace(), neste exemplo ele irá buscar pela palavra "valor antigo" e substituir todas as ocorrencias por "valor novo" no campo1 da tabela1.
UPDATE tabela1 SET campo1 = replace( campo1, 'valor antigo', 'valor novo');
 
#atualizando dados mesclando duas tabelas, vale a pena lembrar que o where neste caso também na maioria dos casos ser usado.
UPDATE tabela1, tabela2 SET tabela1.campo1 = tabela2.campo3 WHERE tabela2.campo1 = tabela1.campo2;

Excluindo dados:

1
2
3
4
#esta é uma decisão muito cuidadosa, então vale sempre lembrar de usar o where e o limit na maioria dos casos, para não deixar que se cometa nenhum erro.
DELETE FROM tabela WHERE campo_id = 1 LIMIT 1;
#usar o "DELETE FROM tabela" sem where e limit provocará a exclusão de todos os registros da tabela, e se é isso que você deseja é mais prático usar o truncate que além de excluir os registros exclui os dados referentes ao auto increment, usa-se:
TRUNCATE TABLE tabela;

Excluindo tabelas:

1
2
#acho que nem precisa de muitas explicações:
DROP TABLE tabela1;

Importando dados para o mysql:

1
2
#se vc tem um arquivo de dump do mysql, para importá-lo basta usar o comando source. Se já tem um database criado e no dump não tem o create database use "USE meu_banco;" e depois o source.
SOURCE meu_arquivo.sql;

Shows, vamos exibir algumas informações importantes e úteis.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#exibindo todas as tabelas que se tem no database selecionado
SHOW TABLES
 
#exibindo todos os databases que se tem permissão com o usuário logado
SHOW DATABASES
 
#exibe o código de criação da tabela
SHOW CREATE TABLE tabela_nome;
 
#exibe o código de criação do banco de dados
SHOW CREATE DATABASE database_nome;
 
#exibe informações referente as tabelas do banco de dados, como collation, auto increment, registros, engine etc
SHOW TABLE STATUS FROM database_nome;
 
#exibe os campos, tipo dos campos, se é null, se é chave primaria, valor default de uma tabela. Muito útil para criar formulários com validação baseado na configuração do banco de dados, sabendo os dados que serão aceitos pela SGBD.
DESCRIBE tabela_nome;

Bom no próximo episódio tem mais…

Abraço,

Leave a Comment more...

Série facilidades para sua vida – Parte 1: Criando views

by on jan.21, 2009, under Facilidades para sua vida, Linux, Mysql, PHP

Este é o primeiro post de uma série que poderá lhe ajudar na hora de fazer algo de uma forma mais prática, rápida e elegante. Neste primeiro post vamos tratar das queries gigantes que as vezes encontramos em alguns códigos por ai.Vejamos um exemplo:
Temos as tabelas: usuarios, produtos, vendas, venda_produtos e venda_status.

Onde os campos das tabelas sejam:

usuarios -> id, nome, telefone, endereco
produtos -> id, descricao, valor
vendas -> id, usuario_id, data, venda_status_id
venda_produtos -> id, venda_id, produto_id
venda_status -> id, descricao

Criando as tabelas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
CREATE DATABASE teste_view;
 
USE teste_view;
 
CREATE TABLE usuarios(
 
    id int(11) not null auto_increment primary key,
 
    nome varchar(60) not null,
 
    telefone varchar(15),
 
    endereco varchar(200)
 
);
 
CREATE TABLE produtos(
 
    id int(11) not null auto_increment primary key,
 
    descricao varchar(120) not null,
 
    valor decimal(4,2)
 
);
 
CREATE TABLE vendas(
 
    id int(11) not null auto_increment primary key,
 
    usuario_id int(11) not null,
 
    data datetime,
 
    venda_status_id int(11),
 
    index usuario_id(usuario_id),
 
    index venda_status_id( venda_status_id )
 
);
 
CREATE TABLE venda_produtos(
 
    id int(11) not null auto_increment primary key,
 
    venda_id int(11) not null,
 
    produto_id int(11) not null,
 
    index venda_id( venda_id ),
 
    index produto_id( produto_id )
 
);
 
CREATE TABLE venda_status(
 
    id int(11) not null auto_increment primary key,
 
    descricao varchar(60) not null,
 
    index descricao( descricao )
 
);

Insira dados nas tabelas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#Adicionando usuarios
 
INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'José pereira', '31 3333-3333', 'rua dos subidos, 123' );
 
INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'Maria pereira da silva', '31 4444-4444', 'rua das marias, 12' );
 
INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'Willy Nelson', '31 5555-5555', 'rua dos cantores, 120' );#Adicionando produtos
 
INSERT INTO produtos ( descricao, valor ) VALUES ('CAMERA DIGITAL',199.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('FILMADORA',999.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('GELADEIRA',899.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('FOGÃO',399.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('CHURRASQUEIRA',99.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('NOTEBOOK',1999.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('MONITOR LCD 15',399.50);
 
#Adicionando status de vendas
 
INSERT INTO venda_status (descricao) VALUES ('Em processamento');
 
INSERT INTO venda_status (descricao) VALUES ('Aguardando pagamento');
 
INSERT INTO venda_status (descricao) VALUES ('Aprovada');
 
INSERT INTO venda_status (descricao) VALUES ('Cancelada');
 
#Adicionando vendas
 
INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (1, '2009-01-20 10:20:00', 1);
 
INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (2, '2009-01-22 10:22:00', 2);
 
INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (1, '2009-01-22 10:44:00', 4);
 
#Adicionando produtos as vendas
 
#Nessa compra joão comprou uma camera digital e uma filmadora
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (1,1);
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (1,2);
 
#Nessa foram comprados por maria um fogão e uma geladeira
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (2,4);
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (2,3);
 
#Nessa o joão comprou um notebook
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (3,6);

Agora suponhamos que vc queira agrupar estas informações num único select, então teremos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT produtos.descricao AS produto_descricao, produtos.valor AS produto_valor,
 
usuarios.nome AS usuario_nome, usuarios.telefone AS usuario_telefone, usuarios.endereco AS usuario_endereco,
 
venda_status.descricao AS venda_status,
 
vendas.id AS venda_id,
 
vendas.data AS venda_data
 
FROM vendas
 
INNER JOIN venda_produtos ON ( vendas.id = venda_produtos.venda_id )
 
INNER JOIN produtos ON ( produtos.id = venda_produtos.produto_id )
 
INNER JOIN usuarios ON ( usuarios.id = vendas.usuario_id )
 
INNER JOIN venda_status ON ( venda_status.id = vendas.venda_status_id )

Agora suponhamos que vc use este select em 3 lugares diferentes, então vc vai ter que passar esta query em 3 locais distintos, podendo gerar uma confusão na hora da manutenção, então para isto existem as views. Elas simulam uma tabela, agem como uma tabela, mas só estão disponíveis para exibir os dados, não podendo sofrer exclusão ou alteração de registros, muito útil ela nestes casos que acabamos ficando com uma query gigante para simplificar nossas vidas.

então para criar a view basta vc adicionar antes da query CREATE VIEW nome_da_view AS ( aqui entra a query ).

Ex.:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE VIEW view_vendas AS ( SELECT produtos.descricao AS produto_descricao, produtos.valor AS produto_valor,
 
usuarios.nome AS usuario_nome, usuarios.telefone AS usuario_telefone, usuarios.endereco AS usuario_endereco,
 
venda_status.descricao AS venda_status,
 
vendas.id AS venda_id,
 
vendas.data AS venda_data
 
FROM vendas
 
INNER JOIN venda_produtos ON ( vendas.id = venda_produtos.venda_id )
 
INNER JOIN produtos ON ( produtos.id = venda_produtos.produto_id )
 
INNER JOIN usuarios ON ( usuarios.id = vendas.usuario_id )
 
INNER JOIN venda_status ON ( venda_status.id = vendas.venda_status_id ) );

Bom agora vc já tem a sua view, para buscar os dados a partir dela faça um select normal. Ex.:

1
2
3
4
5
6
7
SELECT sum(produto_valor) FROM view_vendas;
 
#ou com um where agora
 
SELECT sum(produto_valor) FROM view_vendas WHERE venda_id = 1;#para visualizar todas as suas views basta dar um SHOW TABLES, que ela estará la como uma tabela.
 
#para certificar que é uma view e não uma tabela mesmo vc pode confirmar usando SHOW CREATE TABLE nome_da_view;

Bom por hoje é só.

Espero que isto possa facilitar um pouco a sua vida.

Abraços,

Leave a Comment more...

O mascote do PHP

by on jan.20, 2009, under Geral

Acho que ele está querendo dar um output na impressora :D

elePHPant

Abraços,

2 Comments more...

Usando um svn client

by on jan.19, 2009, under Geral, Linux

Bom este artigo vem tratar de como você obter versões de trabalho de projetos controlados pelo subversion, que é um controlador de versão muito eficiente.

Exemplo de necessidade de baixar um código com pelo svn client: Você está acompanhando um projeto e sempre baixa quando sai uma nova versão com novas features e novidades ao monte, só que em vez de ficar esperando para sair sempre uma nova versão vc pode baixar todos os dias uma nova versão que a equipe de desenvolvimento está mexendo e mandou para o repositório. Pois as equipes de desenvolvimento sempre mandam as atualizações no final do dia (depende da filosofia de cada um, mas pratica comum seria esta) e só disponibilizam para download uma versão consolidada com várias features aplicadas, mas com o svn cliente se o projeto estiver no subversion vc pode estar atualizado na ultima versão.

Alguns disponibilizam um zip ou um diretório via ftp nomeado nightly  que seria uma forma de se não utilizar um controle de versão aberto para que vc possa baixar.

Vamos ao que interessa:

Para usuários windows:

Baixe o tortoise svn (svn client muito simples e prático), http://tortoisesvn.net/downloads
Instale-o com as configurações padrões, next, next, finish (rs)
Depois de instalado, vamos baixar um repositório de teste (fazer um checkout)
Vamos baixar o projeto do CakePHP (framework php muito bom :D )
Va em algum lugar que deseje baixar o arquivo, ex: área de trabalho e clique com o botão direito do mouse sobre a área e clique em SVN Checkout. Em URL of repository entre com a url https://svn.cakephp.org/repo/branches/1.2.x.x deixe como o default e clique em ok.

Para usuários linux (ubuntu):

sudo apt-get install subversion
Para baixar os pacotes svn vá ao diretório que deseja baixar usando o console e digite:
svn co https://svn.cakephp.org/repo/branches/1.2.x.x
pronto já estará baixando sua revisão de trabalho.

Até a próxima pessoal!

4 Comments more...

CakePHP LogsBehavior

by on jan.18, 2009, under CakePHP

Bom seguindo uma necessidade de registrar log de tudo que é feito em uma aplicação eu desenvolvi um behavior para ser usado no cakephp, muito simples e prático. Ele registra alterações nas tabelas como insert, update e delete.

Update -> Grava o registro antigo e o novo.
Insert -> Grava o novo registro.
Delete -> Grava o registro antigo.

Em todos os logs são gravados o id do usuário logado que fez a alteração, a data da alteração, o nome do model que foi alterado e a ação que foi efetuada (add, edit ou delete)

A unica parte  que deverá ser editada de acordo com seu sistema de autenticação é o relacionamento com o model que está utilizando na autenticação.

Vamos ao que interessa então:

Criando a tabela no banco de dados, estou utilizando o mysql.

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `logs` (
 
          `id` int(10) unsigned NOT NULL auto_increment,
          #este é o meu id do usuario logado, meu model de autenticação chama-se authuser
          `authuser_id` int(10) unsigned NOT NULL,
          `model` varchar(60) default NULL,
          `action` varchar(20) default NULL,
          `old_data` text,
          `new_data` text,
          `created` datetime default NULL,
          PRIMARY KEY  (`id`),
          KEY `logs_FKIndex1` (`authuser_id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Crie o log model models/log.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Log extends AppModel {
 
	var $name = 'Log';
 
	//The Associations below have been created with all possible keys, those that are not needed can be removed
	var $belongsTo = array(
	      'Authuser' => array('className' => 'Authuser',
			'foreignKey' => 'authuser_id',
			'conditions' => '',
			'fields' => '',
			'order' => ''
		)
	);
 
}

Criando agora o behavior log: models/behaviors/logs.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/**
 * Behavior for log actions of tables.
 *
 * Behavior to simplify logs
 *
 * PHP versions 5
 *
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @filesource
 * @copyright	Copyright 2005-2008.
 * @link		http://www.michaelmafort.com.br
 * @since		12-07-2009
 * @license		http://www.opensource.org/licenses/mit-license.php The MIT License
 */
 
/**
 * Behavior to register log to all actions in your table model
 *
 */
 
App::import('Model','Log');
App::import('Component', 'Session');
 
class LogsBehavior extends ModelBehavior {
 
/**
 * Current model
 *
 * @var Object
 */
private $Model;
 
/**
 * Session component object
 *
 * @var Object
 */
private $Session;
 
/**
 * Old data
 * last data from model before modified
 *
 * @var array
 */
private $_oldData;
 
/**
 * New data
 * new value from model after modified
 *
 * @var array
 */
private $_newData;
 
/**
 * Model log
 *
 * @var Object
 */
private $Log;
 
/**
 * Action
 * type of action called
 *
 * @var string
 */
private $_action;
 
/**
 * Deleted id
 * id from data to delete
 *
 * @var int
 */
private $_deletedId;
 
/**
 * Setup method
 *
 * Configure this behavior
 *
 * @param ObjectModel $model
 * @param array $config
 */
public function setup(&amp;$model, $config = null){
	$this->Model = $model;
	$this->Session = new SessionComponent();
	$this->Log = new Log();
}
 
/**
 * Before save
 *
 * @param ObjectModel $model
 * @return boolean true
 */
public function beforeSave(&amp;$model){
	if( is_numeric($this->Model->id) ){
		$this->_action = 'edit';
		$newData = $this->Model->find('first', array('conditions'=> array( "{$this->Model->name}.id" => $this->Model->data[$this->Model->name]['id'] ) ) );
 
		foreach( $newData[$this->Model->name] as $input => $value ){
			$this->_oldData .= "$input :: $value";
		}
 
	}
	else
		$this->_action = 'add';
 
	return true;
}
 
/**
 * After save
 *
 * @param objectModel $model
 * @param string $created
 * @return boolean true
 */
public function afterSave(&amp;$model, $created){
	$newData = $this->Model->read(null, $this->Model->id);
	foreach( $newData[$this->Model->name] as $input => $value ){
		$this->_newData .= "$input :: $valuen";
	}
	$this->write();
	return true;
}
 
/**
 * Before delete
 *
 * @param objectModel $model
 * @param boolean $cascade
 * @return boolean true
 */
public function beforeDelete(&amp;$model, $cascade=true){
 
	$this->_action = 'delete';
	$this->_deletedId = $this->Model->data[$this->Model->name]['id'];
	$newData = $this->Model->read(null, $this->_deletedId );
 
	foreach( $newData[$this->Model->name] as $input => $value ){
		$this->_oldData .= "$input :: $valuen";
	}
 
	return true;
}
 
/**
 * After delete action
 *
 * @param ObjectModel $model
 * @return boolean true
 */
public function afterDelete(&amp;$model){
	$this->write();
	return true;
}
 
/**
 * Write log
 *
 * @return void
 */
public function write(){
	if( $this->Model->name == 'Log' )
		return true;
 
	$this->Log->id = null;
	$this->Log->save(array(
		'Log'=>array(
			'authuser_id' => $this->Session->read('Authuser.id'),
			'model' => $this->Model->name,
			'action' => $this->_action,
			'old_data' => $this->_oldData,
			'new_data' => $this->_newData
			)
		));
	}
 
}
?>

Na linha 183 edite o valor de session read para o valor do id do seu usuário logado.

Para funcionar com php 4, retire os public’s e private’s  do código, em functions deixe vazio nas variáveis substitua por var.

Agora para salvar os logs basta inserir em seu model que deseja salvar os logs a variável:

public $actsAs = array(‘Logs’);

Por hoje é só…

Abraços,

10 Comments more...

Programas do linux no windows

by on dez.27, 2008, under Linux

Bom vou compartilhar com vocês alguns programas nativos do linux que foram compilados para serem executados no windows, e já de antemão vou dizendo que muitos desses programas são uma “mão na roda”.

A2Ps -> Formata arquivos para Postscript [download link]
Arc -> Cria e extrai arquivos .arc [download link]
Bzip2 -> Melhor compressor de arquivos [download link]
Enscript -> Converte textos para Postscript [download link]
FFMPEG -> Conversor de arquivos de midia (áudio e vídeo) mesmo usado pelo youtube. [download link]
FileUtils -> GNU utilidades para arquivos [download link]
Gzip -> Compressor de arquivos [download link]
Tar -> Agrupa arquivos num único arquivo [downlad link]
Wget -> Baixe arquivos http por este simples e eficiente programa [download link]

Outros programas podem ser vistos em: http://gnuwin32.sourceforge.net/packages.html

Para instalar os programas basta o NNF (next, next e finish)
Depois de instalados recomendo adicionar o diretório que foi instalado no path do windows.
Painel de controle->Propriedades do sistema->Avançado->Variáveis de ambiente->
em Variáveis do sistema na variável path adicionar ; (ponto e virgula que separa os valores) e o caminho até o diretório bin do gnuwin32. Ex.: C:\Arquivos de programas\GnuWin32\bin.

Assim todos os programas poderão ser executados no seu prompt em qualquer diretório que esteja.

Para ver como usa os programas basta dar no prompt o nome do programa –help.
Ex.: bzip2 –help vai te mostrar as opções e modo de uso do programa de compreensão de arquivos.

Abraços a todos.

2 Comments more...

Procurando por algo?

Digita ai pra ver se encontramos:

Não achou o que procurava? Envie um comentário para o autor informando o que deseja!

Meus amigos!

Links recomendados