Fala pessoal! Tudo na paz? Que tal um super tutorial de ano novo?!
Esse é o primeiro artigo do ano, as 00:01 de 1º de Janeiro! Vamos começar o ano bem!
Hoje vamos começar um tutorial que será divido em várias partes… Nele vamos aprender a fazer um sistema de logins decente, usando classes no PHP… Meu objetivo aqui é que você aprenda duas coisas: como fazer um sistema de login desde o começo e aprenda um pouco mais sobre o uso de classes.
O sistema de login usará banco de dados MySQL e terá suporte a encriptação de senha (MD5, SHA1 e etc)… Totalmente customizável e será fácil alterá-lo caso você precise de alguma coisa especial. Também teremos um suporte a opção “lembrar minha senha“, onde o usuário permanecerá logado caso volte no site algum tempo depois, outra funcionalidade customizável e opcional.
Outro detalhe importante sobre o sistema é que ele irá funcionar nas versões 4 e 5 do PHP e do MySQL, então, se a sua hospedagem é uma vergonha, não se preocupe! ![]()
A Tabela de Usuários
Se você já tem uma tabela de usuários pode pular essa parte… Se não, vamos criar a seguinte tabela no banco de dados do seu site:

Tabela de Usuários
Para criar essa tabela, você poderá usar o seguinte código SQL:
CREATE TABLE `usuarios` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `nome` VARCHAR(150) NOT NULL , `usuario` VARCHAR(100) NOT NULL , `senha` VARCHAR(40) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = MyISAM;
A classe Usuario
Vamos ao que interessa!
Antes de tudo, precisamos criar o nosso arquivo, vamos seguir algumas boas páticas de programação e vamos dar o nome de “usuario.class.php“. Criado o arquivo vazio, vamos começar a construir nossa classe:
<?php
class Usuario {
}
?>
Agora vamos começar a inserir algumas propriedades (variáveis) que serão usadas pela classe ao longo do projeto…
/** * Nome do banco de dados onde está a tabela de usuários */ var $bancoDeDados = 'meu_site'; /** * Nome da tabela de usuários */ var $tabelaUsuarios = 'usuarios'; /** * Nomes dos campos onde ficam o usuário e a senha de cada usuário * Formato: tipo => nome_do_campo */ var $campos = array( 'usuario' => 'usuario', 'senha' => 'senha' );
São com essas propriedades da classe que você vai poder customizar a classe para ela funcionar no seu site.. Cada uma esta devidamente comentada e explicada, é só alterar da forma que você necessitar.
Agora vamos definir o primeiro método da nossa classe:
/**
* Usa algum tipo de encriptação para codificar uma senha
*
* Método protegido: Só pode ser acessado por dentro da classe
*
* @param string $senha - A senha que será codificada
* @return string - A senha já codificada
*/
function __codificaSenha($senha) {
// Altere aqui caso você use, por exemplo, o MD5:
// return md5($senha);
return $senha;
}
Esse método cuidará da encriptação da senha (caso ela exista, claro)… Se o seu sistema não usar nenhum tipo de criptografia, pode deixar esse método do jeito que está, mas caso você use, por exemplo, o SHA1, você precisa mudar ali na linha 34 e colocar, por exemplo:
return sha1($senha);
Caso você use outro tipo de encriptação, você vai precisar modificar esse método… O importante é você receber a senha pura/plana como parâmetro ($senha) e retornar a senha encriptada.
Agora vamos criar o segundo método da classe e o último método dessa parte do tutorial:
/**
* Valida se um usuário existe
*
* @param string $usuario - O usuário que será validado
* @param string $senha - A senha que será validada
* @return boolean - Se o usuário existe ou não
*/
function validaUsuario($usuario, $senha) {
$senha = $this->__codificaSenha($senha);
// Procura por usuários com o mesmo usuário e senha
$sql = "SELECT COUNT(*)
FROM `{$this->bancoDeDados}`.`{$this->tabelaUsuarios}`
WHERE
`{$this->campos['usuario']}` = '{$usuario}'
AND
`{$this->campos['senha']}` = '{$senha}'";
$query = mysql_query($sql);
if ($query) {
$total = mysql_result($query, 0);
} else {
// A consulta foi mal sucedida, retorna false
return false;
}
// Se houver apenas um usuário, retorna true
return ($total == 1) ? true : false;
}
Esse método, como o comentário explica, cuidará de validar se um usuário existe, procurando o par $usuario + $senha no banco de dados… Ele só retornará verdadeiro (true) quando apenas um registro for encontrado.
Se você reparar logo ali no começo do método, na linha 45, ele usa o método __codificaSenha() que irá encriptar (ou não) a senha… Simples né? ![]()
Então é isso gente… Por hoje vamos ficar por aqui. Em breve postarei a Parte 2, onde iremos criar os métodos que deixam um usuário logado (usando sessões E cookies)… E antes que alguém reclame, essa classe ainda não está usável… Ela é apenas a 1ª parte de uma classe que vamos fazendo ao longo dessa sequencia de tutoriais.
Pra quem quiser, o download do script completo da Parte 1: PHP ou RAR.
Não deixem de dar uma olhada nas outras partes:
- Criando um sistema de logins com classe no PHP – Parte 2
- Criando um sistema de logins com classe no PHP – Parte 3
Um grande abraço, feliz ano novo e até a próxima!
Você também vai gostar de ler:
- Criando um sistema de logins com classe no PHP – Parte 2
- Criando um sistema de logins com classe no PHP – Parte 3
- Criando um sistema de logins com classe no PHP – Parte 4
- Sistema de logins com classe no PHP – Como usar?
- Como criar um Sistema de Login com Níveis de Permissão
Postado em Artigos, Destaques, MySQL, PHP, Tutoriais
Com as tags Artigo, Banco de Dados, Classe, Classes, Código, Configuração, Cookie, Cookies, Criptografia, Download, Funcionalidade, Login, MySQL, PHP, PHPS, POO, Programação, Projeto, Scripts, Segurança, Senha, Sessões, Sistema, SQL, Tutoriais, Tutorial, Variáveis
Escrito por Thiago Belem
Gostou desse artigo?
Não se esqueça de assinar o RSS e divulgue-o para o mundo:

Olá thiago,
Meu nome é Osvaldo, moro em São Paulo (terra da garoa!! hehehe), atuo como técnico em eletrônica e informática (tenho que apresentar, né!..rsrs)
Já tem uns dois anos que instalei o WAMP no computador (tem até phpmyadmin e joomla…..bom né!).
Estava tentando resolver um problema de conflito do css3 com o (temível e chato) IE8 (border-radius), quando achei seu blog que ensina a usar o conhecidissimo jquery (que eu desconhecia até então), enfim, usando sua dica e o plugin de outro tópico ( http://blog.thiagobelem.net/jquery/cantos-arred... ) resolvi o problema que só a droga do IE apresenta, o firefox aqui vai normal em tudo!
Aproveitando o passeio pelo site, notei que tem um conteúdo riquíssimo em php e mysql, a qual já estou fazendo uso (vou perder esta chance), vou começar com este tópico aqui, estou fazendo a migração do código direto no editor php e ajustando as querys para o mysql (já montei a tela de login com outro tópico : http://blog.thiagobelem.net/mysql/criando-um-si... ) depois eu te conto o que aconteceu.
Desculpe por abordar vários assuntos num único tema, se eu fosse escrever em todos eles seria cansativo e demorado (aproveitando o lema do jquery “write less, do more”…..hahahahaha)
Quero agradecer muito pelo conteúdo apresentado em seu blog, é bem proveitoso, PARABÉNS!
Abraços e muito sucesso…… bye t+
mas como conecta com o banco usando estas classes???
Bom dia thiago, este código é muito bom mesmo, mas não estou conseguindo conectar com o servidor local o apache.Eu uso o” mysql_connec(“localhost, “root”, “”); , mas não estou conseguindo.
Eu sou novo na área e será que você teria como me ensinar está parte??
Ola thiago,
gostei muito do seu tutorial…
Mais nao consegui executar o sistema…
Fica dando usuario invalido.
Mas, eu copiei seus script inteiro e so mudei o nome da tabela e do banco.
Isso me trouxe duas duvidas….
Onde eu determino aonde esta o meu banco de dados ?
Onde eu coloco o user e a senha do root?
@Henrique
O script não foi feito para ser copiado, colado e usado… Esse é um tutorial de mais de três partes feito para ser seguido passo-a-passo.
É você quem deve fazer a conexão ao banco de dados, o script não se conecta ao banco de dados, ele apenas acessa o banco de dados usando uma conexão pré-estabelecida por você.
Parabéns pelo blog. Ja assinei os feeds….
bo, eu só simplificaria a última linha:
return ($total == 1) ? true : false;
para
return (bool) $total;
Parabens pelo tuto! ^^
Oi thiago, td bom!
Estou tentando usar essa classe no site que estou fazendo e estou com uma dúvida, lembrando que sou iniciante e estou aprendendo PHP e MySQL.
No banco de dados vc usa varchar 40 para senha, como eu poderia fazer pra colocar uma validação de senha, tipo, tem que ter no mínimo… do jeito que vc fez qual seria o tamanho máximo permitido e o que será permitido no campo senha, letras, caracteres e numeros??
Você poderia explicar isso, obrigado!
@Ricardo
Vamos lá… Primeiro que o sistema é um sistema de login e não um sistema de cadastro de usuários… Ele vai usar os dados que já estiverem na tabela e não inserir dados nela.
Coloquei VARCHAR(40) pois 40 caracteres é o que a encriptação SHA1 ocupa, então, se o seu sistema usar MD5 ou SHA1 a senha já vai caber naquele campo perfeitamente… Mas como o sistema vem, por padrão, usando senha em texto plano (sem nenhuma modificação) você pode armazenar o que quiser no campo de senha… até _-+-_=__-+-_=_ vai ser uma senha válida.
A validação do que pode ser uma senha, do seu tamanho mínimo e máximo e da exigência de tipos de caracteres deve ser do seu sistema.
Ok. Entendi. Agora mais uma dúvida, eu poderia utilizar pra fazer o cadastro de usuários essa mesma tabela que você utilizou pra fazer esse sistema de login ou eu teria que fazer uma outra??
Você teria como postar um script de cadastro de usuários?
Obrigado!
@Ricardo
Você pode usar a mesma tabela sim… “Cadastar um usuário” nada mais é do que inserir um registro na tabela de usuarios.
Então eu só preciso fazer um formulário de cadastro de usuário pra salvar no banco de dados e um outro de login pro usuário logar, dai sim vou poder usar a classe que vc ensinou, correto?
Vc tem algum script de cadastro de usuários pra passar pra gente?
Se eu usar essa classe com mysqli terá alguma diferença significativa?
Vou ter que muda o código?
òtimo artigo parabéns
@Rodolfo
Não há diferença se você quiser usar ela com MySQLi… vai funcionar da mesma forma. Você só vai precisar mudar a classe onde ela faz todas as consultas ao MySQL.
Bom dia,
Por que você colocou os atributos banco de dados e tabela na classe de usuários?
Um abraço.
@Wilson
A classe foi projetada para ser o mais customizada o possível… Se a pessoa que for usar a classe tiver um banco de dados com um nome diferente, ou uma tabela de usuários chamada “user” é só mudar ali e tudo fica certo.
Thiago parabéns pelo artigo! Estou com uma dúvida sobre a consulta:
$sql = "SELECT COUNT(*) FROM `{$this->bancoDeDados}`.`{$this->tabelaUsuarios}` WHERE `{$this->campos['usuario']}` = '{$usuario}' AND `{$this->campos['senha']}` = '{$senha}'";O que de fato ela irá retornar? Estou confuso por causa dessa declaração count(*)
Nessa linha você esta pegando o id do resultado?
$total = mysql_result($query, 0);Se puder responder essas dúvidas ficarei muito agradecido…
@Luiz
O COUNT(*) traz o total de resultados encontrados (filtrados) pela cláusula WHERE… Nesse caso eu estou buscando o total de usuários que contenham aquele usuário e senha…
Já o mysql_result() pega o resultado de uma consulta da mesma forma que o mysql_fetch_assoc(), a diferença é que o mysql_result() é usado quando temos 1 resultado só… Dê uma olhada na Parte 3, lá eu faço uma correção nessa parte do código e explico um pouco melhor.
Abraços e obrigado pela participação
Gostei da classe, acho que na liha
$total = mysql_result($query, 0);
Você quis dizer:
$total = mysql_result($query, 1);
Da forma que esta no código o método validaUsuario sempre vai retornar false.
Eu percebi essa falha na 1ª aula quando usei mysql_result($query, 1), mas se você olhar na documentação, o número de registros (segundo parâmetro) começa em 0… Vou procurar outra forma de fazer isso quando lançar a parte 3.
Abraços e obrigado pela participação!
Opa… Blz Thiago,
Parabéns pelo blog, gostei de você começar a abordar classes, pois é muito dificil achar bons materiais de classes e objetos… estarei aguardando a continuação.
Valew por compartilhar seus conhecimentos.
Muito bom thiago, conseguiu melhorar ainda mais o sistema de login que voce ensinou aqui. Excelente cara, esperando a segunda parte. Valew.
Olá. Achei o teu blogue à pouco tempo. Bastante construtivo e com tutoriais porreiros.
Só um detalhe neste, por boa prática, no php.net recomenda-se a que não se use nomes de funções começadas por __ (dois underscores). Apesar de o nome aqui ser em português, para quem costuma programar em inglês pode originar conflito com funções especiais da linguagem.
Um bom ano novo!
Daniel Bento
@Daniel Bento
Na verdade o uso de dois underscores no começo do nome de um método transforma ele em privado, isso vem da época do PHP4 onde não existia a visibilidade de propriedades ou metodos, por isso, ao invés de criar um “private function meuMetodo()” você cria um “function __meuMetodo()”, assim o método será privado tanto para quem usa PHP4 ou PHP5+.
Feliz ano novo…!
Otimo blog cara…
Feliz Ano Novo, sera que fui o primeiro a ler? bom tutorial, vou ficar aguardando a segunda parte, abraços e fica com Deus