Sistema de Login com Orientação a Objetos.
Olá pessoal.
Sexta feira... sem muita coisa pra fazer, resolvi criar um sistema de login com PHP Orientado a Objetos.
A maioria dos sistema que eu trabalho não são orientado a objetos, porém, sempre que posso eu estudo OO. seja lendo tutoriais, seja brincando com o Code Igniter ( framework ).
Hoje resolvi testar os meus conhecimentos e ver como ficaria um sistema de login orientado a objetos.
Vejam como ficou, deixei comentado pra não ficar reescrevendo as coisas por aqui.
Vejam.
****
tabela.sql
create table sistema.usuarios(
id int(2) not null AUTO_INCREMENT,
nome varchar(40) not null,
login varchar(20) not null,
senha varchar(32) not null,
primary key (id)
);
insert into usuarios(id, nome, login, senha)
values ( null, 'Diego Felix', 'diego', '7c67e713a4b4139702de1a4fac672344');
--senha = minhasenha
usuario.class.php
<?php
/*
|-------------------------------------------------------------------
| CLASSE USUARIO
|-------------------------------------------------------------------
| por : Diego Felix
| em : 07/08/2009
| versão : 1.1
| descricao : Uma classe de login com criptografia md5 e
| orientada a objetos.
|
*/
class Usuario
{
// dados do usuario, caso queiram adicionar mais funcoes como insercao, edicao e etc.
var $usuario;
var $senha;
// dados do servidor mysql
var $host = 'localhost';
var $user = 'root';
var $pw = '';
var $db = 'sistema';
function logar($login, $senha)
{
// conecta ao banco de dados
$this->conecta_bd();
$this->usuario = $login;
$this->senha = md5($senha);
/**
* Ao invés de procurar o usuário e senha, eu busco apenas a senha, e comparo com o login.
* Caso eu ache uma senha para determinado login, eu vou verificar quantos registros
* foram encontrados.
*/
$select = "select senha from usuarios where login = '$login'";
$query = mysql_query($select);
$linhas = mysql_num_rows($query);
$resultado = mysql_fetch_array($query);
/**
* Aqui alem de comparar a senha digitada com a senha que foi encontrada no banco.
* eu vejo tambem se foi encontrado apenas um registro.
* isso significa que se o usuário digitar 'or 1 = '1-- no campo senha,
* ele vai comparar: se senhadobanco == "'or 1 = '1--".
* se ele digitou o sql injection tambem no campo usuario, o bd retornara mais de
* um resultado, portanto tambem nao ira passar na validacao.
* a nao ser é claro que seu banco so tenha apenas um usuario =P
*/
if(($this->senha == $resultado['senha']) and ($linhas == 1)):
// se estiver tudo correto.
return true;
else:
// senao, retorna false.
return false;
endif;
}
function conecta_bd()
{
$conexao = mysql_connect($this->host, $this->user, $this->pw);
mysql_select_db($this->db, $conexao);
}
}
?>index.php
<html>
<head>
<title>Teste utilizando PHP Orientado a Objetos</title>
<style type="text/css">
body { font:13px/20px normal Trebuchet MS, Tahoma, Verdana, sans-serif; }
#login form fieldset input{
display:block;
margin-left:10px;
margin-bottom:5px;
padding:5px;
}
#login form fieldset label{
clear:left;
display:block;
float:left;
margin-top:3px;
width:70px;
}
/* --- ***** --- */
</style>
</head>
<body>
<div id="geral">
<div id="login">
<form action="logar.php" method="post">
<fieldset>
<legend>Formulário de Login</legend>
<label for="login">Login :</label>
<input type="text" name="login" />
<label for="senha">Senha :</label>
<input type="password" name="senha" />
<input type="submit" value="Logar" />
</fieldset>
</form>
</div>
</div>
</body>
</html>
logar.php
<?php
require 'usuario.class.php';
$usuario = new Usuario();
$login = $_POST['login'];
$senha = $_POST['senha'];
if(!$usuario->logar($login, $senha)):
echo "Erro ao se logar";
else:
echo "Usuário logado com sucesso!";
endif;
?>A princípio está assim, funcionando legal..
Uma característica que eu gostei nessa classe é que com ela fica mais complicado utilizar SQL Injection da forma que eu fiz.
Depois de terminada eu pensei também em criar uma class genérica para trabalhar com banco de dados, assim os códigos ficam mais reutilizáveis ainda.
Abraços.
Discussão (15)
Carregando comentários...