Hoje vou ensinar a criar um sistema de login simples usando PHP e MySQL.
É recomendável que você já tenha um conhecimento prévio de HTML e, se possível, PHP e MySQL para tornar as coisas mais fáceis.
Nosso sistema será bem simples: um arquivo chamado seguranca.php, que deverá ser incluído no topo do seu site (em todas as páginas) e que faz a conexão com o banco de dados e que possui algumas funções usadas para redirecionar o visitante para o formulário de login (login.php) caso ele não esteja logado.
Vamos ao trabalho:
O que iremos definir primeiro é a tabela usada para armazenar os usuários do sistema:
DROP TABLE IF EXISTS `usuarios`; CREATE TABLE IF NOT EXISTS `usuarios` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `nome` varchar(100) NOT NULL, `usuario` varchar(50) NOT NULL, `senha` varchar(50) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `usuario` (`usuario`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Execute esse bloco SQL no seu banco de dados para criar a tabela usada pelo sistema.
Depois disso, vamos ao formulário de login que você colocará dentro de um arquivo chamado login.php:
<form method="post" action="valida.php"> <label>Usuário</label> <input type="text" name="usuario" maxlength="50" /> <label>Senha</label> <input type="password" name="senha" maxlength="50" /> <input type="submit" value="Entrar" /> </form>
Esse formulário, com apenas dois campos, manda pra página valida.php, que é um pequeno PHP que receberá os dados enviados pelo formulário, fará a validação deles e mandará o visitante ou pra página interna (index.php) ou de volta pra página de login (login.php).
Esse é o codigo fonte do arquivo valida.php:
// Inclui o arquivo com o sistema de segurança
include("seguranca.php");
// Verifica se um formulário foi enviado
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Salva duas variáveis com o que foi digitado no formulário
// Detalhe: faz uma verificação com isset() pra saber se o campo foi preenchido
$usuario = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';
$senha = (isset($_POST['senha'])) ? $_POST['senha'] : '';
// Utiliza uma função criada no seguranca.php pra validar os dados digitados
if (validaUsuario($usuario, $senha) == true) {
// O usuário e a senha digitados foram validados, manda pra página interna
header("Location: index.php");
} else {
// O usuário e/ou a senha são inválidos, manda de volta pro form de login
// Para alterar o endereço da página de login, verifique o arquivo seguranca.php
expulsaVisitante();
}
}
A estrutura do seu site, até esse ponto, deve estar dessa forma:
../pasta_do_seu_site/index.php » Página intera a ser protegida
../pasta_do_seu_site/login.php » Página com o formulário de login
../pasta_do_seu_site/valida.php » Página que faz a validação dos dados do formulário
Agora vamos criar o arquivo seguranca.php na mesma pasta dos demais arquivos:
/**
* Sistema de segurança com acesso restrito
*
* Usado para restringir o acesso de certas páginas do seu site
*
* @author Thiago Belem <contato@thiagobelem.net>
* @link http://thiagobelem.net/
*
* @version 1.0
* @package SistemaSeguranca
*/
// Configurações do Script
// ==============================
$_SG['conectaServidor'] = true; // Abre uma conexão com o servidor MySQL?
$_SG['abreSessao'] = true; // Inicia a sessão com um session_start()?
$_SG['caseSensitive'] = false; // Usar case-sensitive? Onde 'thiago' é diferente de 'THIAGO'
$_SG['validaSempre'] = true; // Deseja validar o usuário e a senha a cada carregamento de página?
// Evita que, ao mudar os dados do usuário no banco de dado o mesmo contiue logado.
$_SG['servidor'] = 'localhost'; // Servidor MySQL
$_SG['usuario'] = 'root'; // Usuário MySQL
$_SG['senha'] = ''; // Senha MySQL
$_SG['banco'] = 'test'; // Banco de dados MySQL
$_SG['paginaLogin'] = 'login.php'; // Página de login
$_SG['tabela'] = 'usuarios'; // Nome da tabela onde os usuários são salvos
// ==============================
// ======================================
// ~ Não edite a partir deste ponto ~
// ======================================
// Verifica se precisa fazer a conexão com o MySQL
if ($_SG['conectaServidor'] == true) {
$_SG['link'] = mysql_connect($_SG['servidor'], $_SG['usuario'], $_SG['senha']) or die("MySQL: Não foi possível conectar-se ao servidor [".$_SG['servidor']."].");
mysql_select_db($_SG['banco'], $_SG['link']) or die("MySQL: Não foi possível conectar-se ao banco de dados [".$_SG['banco']."].");
}
// Verifica se precisa iniciar a sessão
if ($_SG['abreSessao'] == true) {
session_start();
}
/**
* Função que valida um usuário e senha
*
* @param string $usuario - O usuário a ser validado
* @param string $senha - A senha a ser validada
*
* @return bool - Se o usuário foi validado ou não (true/false)
*/
function validaUsuario($usuario, $senha) {
global $_SG;
$cS = ($_SG['caseSensitive']) ? 'BINARY' : '';
// Usa a função addslashes para escapar as aspas
$nusuario = addslashes($usuario);
$nsenha = addslashes($senha);
// Monta uma consulta SQL (query) para procurar um usuário
$sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS." `usuario` = '".$nusuario."' AND ".$cS." `senha` = '".$nsenha."' LIMIT 1";
$query = mysql_query($sql);
$resultado = mysql_fetch_assoc($query);
// Verifica se encontrou algum registro
if (empty($resultado)) {
// Nenhum registro foi encontrado => o usuário é inválido
return false;
} else {
// O registro foi encontrado => o usuário é valido
// Definimos dois valores na sessão com os dados do usuário
$_SESSION['usuarioID'] = $resultado['id']; // Pega o valor da coluna 'id do registro encontrado no MySQL
$_SESSION['usuarioNome'] = $resultado['nome']; // Pega o valor da coluna 'nome' do registro encontrado no MySQL
// Verifica a opção se sempre validar o login
if ($_SG['validaSempre'] == true) {
// Definimos dois valores na sessão com os dados do login
$_SESSION['usuarioLogin'] = $usuario;
$_SESSION['usuarioSenha'] = $senha;
}
return true;
}
}
/**
* Função que protege uma página
*/
function protegePagina() {
global $_SG;
if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
// Não há usuário logado, manda pra página de login
expulsaVisitante();
} else if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
// Há usuário logado, verifica se precisa validar o login novamente
if ($_SG['validaSempre'] == true) {
// Verifica se os dados salvos na sessão batem com os dados do banco de dados
if (!validaUsuario($_SESSION['usuarioLogin'], $_SESSION['usuarioSenha'])) {
// Os dados não batem, manda pra tela de login
expulsaVisitante();
}
}
}
}
/**
* Função para expulsar um visitante
*/
function expulsaVisitante() {
global $_SG;
// Remove as variáveis da sessão (caso elas existam)
unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'], $_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);
// Manda pra tela de login
header("Location: ".$_SG['paginaLogin']);
}
Não vou poder explicar todas as funções do arquivo pq é muita coisa.. Mas todas elas estão devidamente comentadas e documentadas… É só olhar.
Com esse arquivos nós já nos conectamos automaticamente ao servidor MySQL, então se você usar outra forma pra fazer a conexão, vá na parte de configurações do seguranca.php e defina a variável $_SG['conectaServidor'] pra falso (false). O mesmo acontece pra sessão com a variável $_SG['abreSessao'].
Agora é só incluir essas linhas no topo de cada arquivo que deverá ter o acesso restrito:
include("seguranca.php"); // Inclui o arquivo com o sistema de segurança
protegePagina(); // Chama a função que protege a página
Quando vocês quiserem exibir o nome do usuário logado, é só fazer isso:
echo "Olá, " . $_SESSION['usuarioNome'];
Veja mais sobre escrever e pegar valores da sessão (coisa que acontece muito nesse sistema de login) no tópico Aprendendo a usar sessões no PHP.
Viram como é fácil?
Pra quem quiser um tutorial mais explicado e detalhado recomendo: Como criar um Sistema de Login com Níveis de Permissão (passo-a-passo).
Nota: Alguns de vocês devem ter notado que durante essa semana, no post Criando Sistemas Seguros, falei sobre não usar nomes óbvios para tabelas de usuários. Mas esse exemplo é apenas explicativo, você pode mudar o nome da tabela de usuários se preferir e depois é só alterar a variável no bloco de configurações dentro do seguranca.php.
–
Veja aqui como criar um sistema de login usando classes (Orientação a Objetos) e que funciona no PHP 4 e PHP 5.
Você também vai gostar de ler:
- Como criar um Sistema de Login com Níveis de Permissão
- Criando um sistema de logins com classe no PHP – Parte 1
- Sistema de busca em PHP e MySQL com paginação
- Criando um sistema de logins com classe no PHP – Parte 2
- Criando um sistema de logins com classe no PHP – Parte 3
Postado em MySQL, PHP, Tutoriais
Com as tags Banco de Dados, Carregamento, Case-sensitive, Classe, Classes, Conexão, DIE, empty, Formulário, Funções, Header, HTML, Login, Max, MySQL, Orientação a Objetos, Password, PHP, PHP 5, Root, Script, Scripts, Segurança, Senha, Servidor, Sessão, Session, Sessões, Sistema, Sistemas, SQL, Submit, Tutorial, Validação, Variáveis
Escrito por Thiago Belem
Gostou desse artigo?
Não se esqueça de assinar o RSS e divulgue-o para o mundo:

Eu coloquei o seu código no meu site pra o login e senha, mas toda vez que eu vou acessar aparece :
Fatal error: Call to undefined function mysql_connect() in C:\xampp\htdocs\Siscome-site\seguranca.php on line 55
O q eu faço?
@Marcela
Significa que você não tem a função mysql_connect no seu PHP.. O que é muito… estranho. Reinstale o PHP, e use uma versão atual.
Cara, caiu como uma luva para mim!!!
Muito obrigado!
Abração
Thiago, já resolvido, grato.
Thiago, quando “embuto” o php numa página html, mesmo salvando-a como php, dá aquele erro, apesar de o “valida.php” estar ok (sem espaços). O que fazer ? Pode ser erro no servidor ?
Grato desde já.
Parabens pelo post. Execelente dica.
Utilizei no site que eu estou desenvolvendo e necessitava de uma intranet.
Seu site sera um dos meus pontos de apoio a partir de agora!
obrigado
Muito bom este tutorial Thiago, sou designer e a cada dia mais aprendo com seus tutoriais, parabéns mesmo.
Ótimo tutorial e completamente sem erros. Parabéns!
Thiago, era isso mesmo… O valor da experiência…
Thiago, tudo bem ?
Estou aprendendo php e e apanhando…
Publiquei o sistema e está dando os seguintes erros:
Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /home/copiador/public_html/valida.php:2) in /home/copiador/public_html/seguranca.php on line 35
Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /home/copiador/public_html/valida.php:2) in /home/copiador/public_html/seguranca.php on line 35
Warning: Cannot modify header information – headers already sent by (output started at /home/copiador/public_html/valida.php:2) in /home/copiador/public_html/valida.php on line 16
O que posso fazer pra consertar ?
Desde já, grato pela atenção.
@Claudio
Veja o início do arquivo valida.php, ele não pode conter nenhuma linha em branco ou espaço antes do <?php ou <?… Veja se isso resolve.
Ola, parabens pelo blog thiago
esse tutorial é para os usuarios acessarem o mesmo conteudo certo
gostaria de ver como funcionaria com sei la…3 tipos de planos…conteudos diferentes…onde o usuario so podera acessar certos arquivos de acordo com seu plano
Ótimo tutorial, seria interessante incluir o “logout”.
Abraço…Se cuida!!!
@gsguma
Na maioria dos sistemas o logout acontece quando ficamos X minutos inativos… Mas você pode fazer o cURL acessar a url de logout e você fez o logout.
Olá thiago, como vai? sou iniciante em PHP e estava procurando orientações na net para pode fazer meu projeto final (PHP + mysql) e achei interessante seu site e gostaria de algumas dicas sua para poder iniciar o projeto corretamente! Por favor, se for possível mande-me um email com algumas dicas…..
Olá Thiago…
Acompanho seu blog diariamente … muito conteudo bom….
gostaria de lhe pedir se tens como fazer um login com php e mysql com
limite de tentativas pra ter um exemplo de como fazer isso…
desde ja agradeço…
GOSTEI MUITO DESTE SISTEMA DE LOGIN, JÁ TESTEI E ESTÁ FUNCIONANDO PERFEITAMENTE BEM. ESTOU CRIANDO PÁGINAS PARA USUÁRIO EM MEU SITE E ESTAVA PRECISANDO ENTENDER O SISTEMA DE LOGIN, POIS O DE CADASTRO JÁ ESTÁ PRONTO E FUNCIONANDO.
abraços
Obrigado pela resposta… O cliente quer q o site dele seja acessado so por lojistas..por isso pediu login e senha…Qto aos exemplos é so copiar e colar la no dream? eu ja estou acostumado e domino ele..rs..Eu preciso ter php instalado aqui no meu micro e sql tb? isso q n sei..e como fari apra testar se esta funcionando sem estar hospedado.
Obrig novamente
PS: É que n sei nada mesmo de php..ja li muito e n entendi ainda…rs danado
@Geraldo
Recomendo que você estude mais sobre PHP antes (sem MySQL ainda), depois aprenda um pouco sobre PHP + MySQL.. Esse tutorial não é para usuários avançados mas também não vai ser compreendido por que não entende nada… É preciso já ter uma base antes de conseguir usar/fazer um sistema de login.
Abraços!
Nao domino nada de php…ta difiicl, e de todos os codigos que vi este foi o mais esclarecido..mai slimpo..dissecado..mas mesmo assim to perdido e preciso fazer um site que exige login e senha(ja fiz um monte , este é o primeiro que me pedem com isso) domino muito bem html, css, mas de php…nada. É so copiar e ta tudo blz? o que preciso ter no meu micro alem do dream? Obrigado..
@Geraldo
Fala Geraldo… Obrigado pelos elogios! Bom… Eu costumo recomendar o não uso do Dreamweaver por que ele cria um código muito sujo… Procure editores onde você trabalha diretamente com o código por exemplo o Notepad++ ou o NetBeans… Sobre o tutorial, ele foi um exemplo… copiando ele deve funcionar, mas óbviamente você vai precisar ajustar as suas necessidades.
Este tuto ficou mto bom cara!!! parabéns….
Assim como me ajudou mto acredito que ajudará mtas pessoas que estão começando com php..
Continue com esta inciativa sempre!!
Parabéns!!!
Ótimo, tudo muito bem explicado…
Eu só gostaria de saber como faço para saber se alguém tentou fazer login no sistema e deu errado…
Agradeço pela paciência =]
Abraços!
Bom thiago, sou iniciante em programação PHP e estou montando uma WEB em LAMP e este tutorial me ajudou muito para criação como na segurança. Muito show seu artigo…..
Ja li quase todos seus tutoriais thiago.
São muito bem escritos.
Parabéns.