logoLog da Selva


Mais do que uma trigger

Escrito em Banco de Dados por Rodrigo Fournier em 08 de Outubro de 2008

Voltando a postar, e tentando mais uma vez dar dica pra galera. Esses dias tive que fazer uma tarefa aqui na empresa bem interessante. Precisava acrescentar ao login do sistema que estamos desenvolvendo, uma funcionalidade de bloqueio para quando o usuário errasse a senha 3 vezes. Até ai muito fácil, e não detalharei a maneira como fiz pois existem várias formas, e não é esse o tema que quero tocar nesse post. O fato é que o cliente pediu que se a pessoa errasse 2 vezes a senha e desistisse do acesso, para que as tentativas de acesso fossem novamente zeradas, precisariam passar 10 dias além da última tentativa.

Mais uma vez, isso poderia ser feito de n maneiras, mas falarei a maneira que me foi mais conveniente e que dependeu apenas do banco de dados para ser concretizada.

Aqui na empresa utilizamos oracle, e a ferramenta de acesso aos dados, que EU utilizo para tal, é o TOAD da QUEST SOFTWARE. Para quem não o conhece, posso dizer que é uma ferramenta mais indicada parada DBAs, e que muitos aqui preferem o SQLNavigator produzido pela mesma empresa (acho eu, rsrsrsrs), mas eu me acostumei a mexer no TOAD e adoro trabalhar com ele.

Agora vamos a solução…eu criei uma procedure que pegasse todos os usuários que tivessem 1 ou 2 tentativas de acesso no período maior ou igual a 10 dias e os atualizassem, zerando o número de tentativas e a data da última tentativa. Dai, surgiu a dúvida de como fazer para que essa procedure fosse disparada. Uma trigger, que disparasse ao executar qualquer outra coisa??? Bom talvez fosse uma solução boa, mas eu precisava que isso executasse todos os dias sem precisar meter a mão em nada.

Pesquisando pela web e consultando alguns amigos aqui da empresa, cheguei ao tal JOB. O JOB era exatamente do que eu precisava, um processo que fosse executado o dia que eu mandasse na hora que eu quisesse, e o melhor, o TOAD tem ferramenta visual que cria um JOB sem que você precise meter a mão em código SQL, pois ele já gera todo o código.

Talvez isso já seja velho conhecido de alguns, mas tenho certeza que para alguns, como foi pra mim, isso é algo novo e que possa vir a ajudar em algo.

Como criar um sistema simples de login ? (Aula 02 e 03)

Escrito em Aleatórios, Tecnologia, PHP, Banco de Dados, HTML por Tiago Guedes em 30 de Dezembro de 2007

Olá pessoal, como prometido estou aqui de volta (depois de muiiiiito tempo) para concluir nossas aula sobre o sistema de login php. Para conpensar o tempo que fiquei afastado do Log da Selva vou adiantar, além da aula 02, a aula 03. No mais, é isso pessoal, vamos ao que interessa !

Aula 02 - Formulário e script de login

:: Formulário de login

Antes de passarmos para o php iremos criar aquele famoso formulário de login (login - senha) no html. Ele terá basicamente a mesma estrutura do formulário de registro da primeira aula, porém só precisaremos dos campos “login” e “senha” para verificar se realmente aquele usuário que está tentando logar está cadastrado no nosso banco de dados.

obs.: os comentários no código são iniciados por // ou

Nosso formulário de login ficará assim então:

login.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
<?php // recomendo iniciar sempre a session no começo da página para que não haja problemas com headers depois, mas por enquanto vocês nem precisam prestar atenção nisso, depois que pegaram o script de login vão entender melhor do que se trata isso aqui. 
session_start();
session_cache_expire(30);
session_cache_limiter('private');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>:: Login</title>
</head>
<body>
<h1>Login PHP</h1>
<?php // isso aqui vocês vão entender melhor depois que pegarem o script de login, então aconselho que nem percam tempo olhando isso agora
if ($_SESSION['result'] == 1) { // se a session de resultados tiver o valor 2...
	echo ("Erro: algum campo encontra-se vazio!"); // ele imprime algo negativo.
	}
if ($_SESSION['result'] == 2) { // se a session de resultados tiver o valor 2...
	echo ("Erro: usuário ou senha incorreto!"); // ele imprime algo negativo.
	}
?>
<form action="logando.php" method="post">
	Login:<br>
    <input name="login" type="text" /><br><!-- input é a tag de formatação de campo, ou seja, com ela você estará criando um campo com nome de login (indicado através do name) e o que for digitado dentro dele será do tipo texto. --> 
	Senha:<br> 
	<input name="senha" type="password" /><br><br><!-- o mesmo serve para o campo senha, a diferença é que o que for digitado nele será do tipo password, ou seja, no lugar de texto aparceção aquelas famosas bolinhas ou asteríscos. -->
	<input name="logar" type="submit" value="logar" /><br> <!-- aqui você cria um botão com a tag input indicando o tipo como submit, sendo assim, o que estiver dentro dos campos do formulário será submetido ao action do formulário (logando.php) através dele. No value você indica o texto que vai aparecer dentro do botão. -->
</form>  
</body>
</html>
<?php unset($_SESSION['result']); // retirando os valores da session  de resultados pra quando o usuário a atualizar a página o erro não continuar sendo impresso.?>

:: Script de login

O script de login consiste basicamente num algorítimo que pesquisa no banco de dados aquelas informações digitadas nos campos do formulário de login, geralmente: login e senha. Se alguma linha de registro no banco de dados for encotrada com o login e a senha requeridos um resultado positivo é exibido ao usuário ou então o mesmo é redirecionado para uma página exclusiva para usuários logados, caso contrário, exibi-se um resultado negativo ao mesmo.

Como foi indicado no formulário, o nosso script de login terá o nome de “logando”, aí vai ele:

logando.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
<?php
 
session_start();  // através dessa função podemos iniciar a manipulação de session que são variáveis globais,ou seja, a session é uma varíavel que pode ser utilizada em blocos de código distintos, por exemplo: aqui eu digo que a session de login é igual a "User", lá na minha página principal eu utilizo a $_session['login'] e ela terá esse valor que eu dei (User).
session_cache_expire(30); // define o limite de tempo do cache em 30 minutos 
session_cache_limiter('private'); // defini o limitador do cache para 'private'.
session_register('result');  // através dessa função registramos a session result que vai armazenar os resultados da nossa pesquisa.
 
//conectando com o banco de dados
$dbhost = "enderecodohost.com"; 
$dbuser = "tivira"; 
$dbsenha = "tivira"; 
$db = "logdaselva";
$conn = @mysql_connect($dbhost, $dbuser, $dbsenha) or die(mysql_error());
@mysql_select_db($db);
 
// agora vamos criar variáveis locais, também chamadas de variáveis de escopo
$login = $_POST['login']; // aqui estamos indicando aque a variável login ($login) recebe o que foi digitado no campo login do formulário através do método post.
$senha = md5($_POST['senha']); // o mesmo para senha, não esquecendo da incriptação md5.
 
if ((!$login) || (!$senha)) { // se não a variável login ou senha não recebeu nada...
	$_SESSION['result'] = 1;	 // ...a session de resultados recebe o valor 1...
	header("location:login.php"); // ...e redireciona o usuário para a página de login novamente, aonde será exibido ao mesmo um resultado negativo.
}else{ //caso contrário..
	$pesquisa = mysql_query("SELECT * FROM registros WHERE login = '$login' AND senha = '$senha'"); // aqui executamos na variável pesquisa ($pesquisa) uma query que seleciona todos os registros do nosso banco aonde o login e a senha são iguais ao que foi digitado pelo usuário.
	if (mysql_num_rows($pesquisa) > 0) { // se o número linhas de registro encontrados na variável for maior que 0, ou seja, se existir registro no banco com esse login e senha..
		session_register('login'); // criamos uma session login
		$_SESSION['login'] = $login; // indicamos seu valor, ela será igual ao valor do campo login digitado no formulário.
		header("location:principal.php"); // redirecionamos o usuário para uma página principal que validará o login do usuário.
	}else{ // caso contrário
		$_SESSION['result'] = 2; // indicamos o valor "2" para a variável de resultado..
		header("location:login.php"); // e redirecionamos o usuário para a página de login.
		} // fecha else
	} // fecha else
 
?>

Aula 03 - Validando o login

Validar um login consiste básicamente em perguntar na página principal se uma determinada session (a responsável pelo login) está setada, ou seja, se ela possui algum valor.

principal.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php 
session_start(); // iniciando a session
session_cache_expire(30);
session_cache_limiter('private');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Principal</title>
</head>
<body>
<?php 
if (isset($_SESSION['login'])) { // se a ssssion login estiver setada..
	echo ("Bem vindo ".$_SESSION['login']."!"); // ele imprime um "bem vindo" com o nome do usuário.
}else{ // caso contrário..
	header("location:login.php"); // ele manda o usuário de volta pra página de login.
}
?>
</body>
</html>

Aqui vou encerrando nossas aulas à respeito do sistema de login, espero ter ajudado e esclarecido alguma coisa à vocês. Prometo que logo voltarei com novidades, grande abraço !
Dúvidas ?
Erros ?
Postem sem medo, obrigado! =)

Como criar um sistema simples de login ? (Aula 01)

Escrito em Aleatórios, Dicas, PHP, Banco de Dados, HTML por Tiago Guedes em 25 de Setembro de 2007

Olá pessoal, meu nome é Tiago (mas conhecido por ai como Tivira), estou estreiando hoje com meu primeiro post no Log da Selva (olha o nervosismo). Preparei 3 aulas de PHP básico aonde ensinarei passa-á-passo como montar um sistema de login simples e eficiente. Feitas as declarações iniciais, vamos ao que interessa !

Aula 01 - Formulário, tabela e script de registro

Antes de começarmos os códigos, gostaria de explicar num bom português no que se consiste um sistema de login:

1. Registro de dados do usuário em um banco de dados.
2. Verificar se o dados do usário como “login” e “senha” existem no banco de dados.
3. Após uma consulta no banco de dados o usuário recebe uma determinada resposta caso tenham sido encontrados os dados necessários, caso contrário, recebe outro tipo de resposta .
Entendido ? Vamos em frente então…

obs.: os comentários no código são iniciados por // ou <!–

:: 1º Passo - Formulário de Registro

Primeiramente vamos criar um formlário HTML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<title>:: Registro</title>
</head>
<body>
<form action="registra.php" method="POST"> 
<!-----------------------------------
aqui abrimos nosso formulário, o action faz acionar o script registra.php quando o usário clicar em
 um botão do tipo submit, e o method determina o método que será utilizado para armazenar 
os dados do formulário nas variáveis do script PHP.
------------------------------------->
<strong>:: Registro</strong>
<br />Login:
<br /><input name="login" type="text" id="login" /> <!--campo login, do tipo text.-->
<br />Senha:
<br /><input name="senha" type="password" id="senha" /> <!--campo senha, do tipo password.-->
<br />Comfirma senha:
<br /><input name="comfsenha" type="password" id="comfsenha" /> <!--campo de comfirmação. de senha, do tipo password--> 
<br /><input name="Enviar" type="submit" id="Enviar" value="Enviar" /> <!--botão do tipo submit (submete os dados do formulário ao que estiver no action).--> 
</form>
</body>
</html>

:: 2º Passo - Tabela de Registros

Agora criaremos uma tabela em um banco de dados Mysql.

1
2
3
4
5
 CREATE TABLE `logdaselva`.`registros` ( //criar tabela registros no banco de dados logdaselva
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , //criar o campo id, DO tipo inteiro (registra apenas números inteiros), não nulo, com incrementação aotumática (se o primeiro registro for de id = 1, o segundo usuários registrado terá automaticamente id = 2), o campo  id funciona como chave primária (isso significa que esse campo não pode ser nulo e não pode ter registros repetidos) 
`login` VARCHAR( 20 ) NOT NULL , //cria o campo login, tipo cadeia de caracteres, tamanho 20, não nulo
`senha` VARCHAR( 100 ) NOT NULL //cria o campo senha, tipo cadeia de caracteres, tamanho 100, não nulo
);

:: 3º Passo - Script PHP de Registro

Enfim chegamos na parte mais interessante dessa primeira aula, através do script que criaremos aqui os dados digitados pelo usuário no formulário serão alocados em uma matriz no banco de dados SQL.
Antes de tudo, para que o nosso script de registro se “comunique” com o tabela que criamos no banco de dados SQL, é necessário que se crie um script que faça a conexão com o mesmo (chamaremos ele de conecta.php) e depois incluiremos esse script em todos os script posteriores que façam comunicação com nosso banco.
Abra um editor PHP ou até mesmo o bloco de notas e salve o arquivo com o nome conecta.php.

conecta.php

1
2
3
4
5
6
7
8
9
10
11
<?php //tag utilizada para abrir o PHP no código fonte.
//aqui vamos armazenar, em variáveis locais, os valores necessários para fazer a conexão com o banco de dados.
$dbhost = "enderecodohost.com"; //aqui armazenamos o endereço do host na variável $dbhost.
$dbuser = "tivira"; //idem para o nome do usuário root do banco.
$dbsenha = "tivira"; //idem para senha do  usuário root.
$db = "logdaselva"; //idem para o nome do database.
//note que variáveis em PHP são sempre iniciadas por $ e que você não precisa declarar o tipo da variável (inteira, ponto flutuante, cadeia de carcteres, etc) o PHP reconhece o tipo automáticamente.
$conecta = @mysql_connect($dbhost, $dbuser, $dbsenha) or die(mysql_error()); //aqui chamamos a função myqsl_connect(), responsável por fazer a conexão com o banco de dados. Nela aplicamos as varáveis com as informações necessárias para a conexão.
//note que aplicamos or die() que por sua vez chama a função mysql_error(), utilizamos isso para imprimir alguma advertência em caso de erro na função mysql_connect().
@mysql_select_db($db); //aqui chamamos uma função que faz a seleção do database que iremos utilizar, no nosso caso: logdaselva.
?> //através dessa tag fechamos o código PHP no arquivo fonte.

Criada a conexão com o database, podemos passar para a última etapa da nossa primeira aula. Abra um novo arquivo fonte no editor PHP, agora criaremos um scrip simples de registro com o nome de registra.php.

registra.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
<?php
include("conecta.php"); //aqui incluímos o script que faz a conexão com banco de dados.
 
$login = $_POST['login']; //nessa linha eu digo que a váriavel login é igual aos dados que foram obtidos do campo login, do nosso formulário de registro, através do método POST.
$senha = md5($_POST['senha']); //idem para senha, porém note que eu utilizo uma função md5() nos dados obtidos do campo senha, essa função retorna uma incriptação da senha digitada.
$comfsenha = md5($_POST['comfsenha']); //idem para comfsenha.
 
if ($senha == $comfsenha) { //aqui eu uso um operador condicional para verificar se a senha digita é igual a comfirmação de senha.
 
$confere = mysql_num_rows(mysql_query("SELECT * FROM registros WHERE login = '$login' ")); //se a condição acima for verdadeira ele executa essa linha que confere se o login digitado já existe no banco de dados. A função mysql_num_rows() retorna o número de linhas encontradas na função mysql_query(). Essa função funciona para queries de pesquisa como SELECT.
 
if ($confere == 0){ //se o valor retornado pela função mysl_num_rows() for = 0, significa que não há nenhum outro registro com esse login no banco de dados.
 
$registra = mysql_query("INSERT INTO `registros` (`login`, `senha`) VALUES ('$login', '$senha') ")or die(mysql_error()); //se a condição acima for verdadeira ele executa essa linha que insere na tabela registros, nos campos login e senha, os valores das variáveis $login e $senha. Caso ocorra algum erro ele imprime uma advertência.
 
if (@mysql_affected_rows($registra) != -1) { //para queries como INSERT, utilizamos a função mysl_affected_rows() para saber quantas linhas foram afetadas. Essa função retorna o número de linhas afetadas ou -1 caso não haja nenhuma linha afetada.
echo ("Usuário registrado com sucesso!"); //se o número de linhas afetadas for diferente de -1, ou seja, se o usuário foi cadastrado ele imprime essa frase que está entre aspas duplas.
}else{
echo("Usuário não pode ser registrado!"); //caso contrário imprime essa....
}
}else{
echo("Já existe outro usuário com o mesmo login!"); //imprime isso caso exista outro usuário com o mesmo login...
}
}else{
echo("Não foi possível comfirmar a senha!"); //e essa caso a senha seja diferente da comfirmação de senha...
 
}
?>

Nessa aula de hoje foram passados conhecimentos básicos e necessários para se criar sistema de registro em PHP, espero ter sido bem claro e didático, vocês viram que não disperdicei comentários nos códigos né ?
E então….dúvidas ?? erros ?
Bem por hoje é só, vejo vocês na Aula 02 !