Dando continuiade aos tutorias de PHP, vou mostrar agora como criar um sistema de login de usuário, conectando com o banco de dados MySQL, e gravando os dados em Sessões.
Primeiramente, você deverá ter um servidor com suporte PHP instalado em seu computador, ou então alguma hospedagem, para testar a aplicação. Se desejar instalar um servidor e não souber como, leia o tutorial de instalação do EasyPHP que escrevi a alguns meses.
Vamos começar!
Primeiramente, crie o banco de dados. No nosso caso escolhi o nome “tutoriais”, pois irei utilizá-lo em outros artigos.
Depois que o banco estiver criado, o próximo passo é criar a tabela de usuarios.
CREATE TABLE IF NOT EXISTS `usuario` ( `id` int(6) NOT NULL AUTO_INCREMENT, `nome` varchar(255) NOT NULL, `login` varchar(255) NOT NULL, `senha` varchar(255) NOT NULL, PRIMARY KEY (`id`));
Com a tabela criada, vamos agora povoá-la:
INSERT INTO `usuario` (`id`, `nome`, `login`, `senha`) VALUES (1, 'Arthur Sorriso', 'sorriso', '698dc19d489c4e4db73e28a713eab07b');
O campo senha, está encriptado no formato MD5, para uma melhor segurança. Aqui ela significa apenas “teste”.
Agora, o próximo passo é criar o formulário de login.
form_login.php
<strong>Sistema de Login</strong> <form action="autenticar.php" method="post"> Login: <input name="login" type="text" /> Senha: <input name="senha" type="password" /> <input type="submit" value="Acessar" /></form>
Explicando o código:
A primeira linha é apenas um título, para ficar organizado. Nada de mais.
Na segunda começamos a criar o formulário. Utilizamos a tag form. O parâmetro action informa o destino que a página vai quando o botão “Acessar” é presionado. O parâmetro “method” pode ser “get” ou “post”. Para este utilizaremos “post” por ser mais seguro. No “get”, os dados do formulário serão enviados via endereço no browser, o que não queremos.
Na terceira linha criaremos o campo para o usuário digitar o login. Para isso utilizamos a tag “input” com tipo texto.
Na quarta linha criaremos o campo para senha. É análogo ao campo de login, a única diferença é o tipo, que agora passa a ser “password” de forma que quando o usuário digitar algo, isto aparecerar como asterisco(*).
Na quinta linha criaremos o botão para submeter o nosso formulário. Para isso utilizamos a tag “input” com tipo “submit”. E depois fechamos o formulário.
Vamos agora criar a página que fará a conexão com o nosso banco de dados.
connect.php
<?php $host = "localhost"; $user = "root"; $password = ""; $dbname = "tutoriais"; mysql_connect($host, $user, $password) or die("Erro ao tentar se conectar!"); mysql_select_db($dbname)or die("Erro ao selecionar o banco!"); ?>
Explicando o código:
Primeiramente pegamos as variáveis necessárias para a conexão no banco de dados. A primeira é o host para conectar. Na maioria dos casos será localhost mesmo. Depois usuário e senha do banco de dados. E por último o banco de dados que será utilizado. Como falei lá em cima, o banco que utilizarei é o tutoriais.
Depois criaremos a nossa conexão. Para isso utilizaremos a função mysql_connect e passaremos como parâmetros as variáveis de cima. Caso ocorra um erro, será mostrada a mensagem escrita dentro do die().
Por fim fazemos a seleção do banco de dados que iremos utilizar.
Simples.
Agora vamos para a parte mais complicada, mas não difícil, do tutorial. A página que será responsável pela autenticação do usuário, criando assim sua sessão.
autenticar.php
<?php include("connect.php"); //Recebendo os dados do formulário $login = addslashes($_POST["login"]); $senha = md5(addslashes($_POST["senha"])); $sql = "SELECT * FROM usuario WHERE login = '$login' AND senha = '$senha'"; $rs = mysql_query($sql); if(mysql_num_rows($rs) == 1) { $user = mysql_fetch_array($rs); //conferindo o login e senha para segurança if($login == $user['login']){ //se entrou, entao o login é igual if($senha == $user['senha']){ //se entrou, então a senha também é igual $logado = "1"; $id_user = $user['id']; //criando a sessão session_start(); $_SESSION["id_user"] = $id_user; $_SESSION["logado"] = $logado; //depois que criarmos a sessão, //vamos redirecionar para a página privada header("Location: cadastro.php"); } else { echo "A senha não confere!"; } } else { echo "O usuário não confere!"; } }else { echo "Usuário ou senha inválidos. Tente novamente."; } ?>
Explicando o código:
Primeiramente incluimos o arquivo connect.php, a fim de estabelecermos a conexão com o banco de dados.
//Recebendo os dados do formulário $login = addslashes($_POST["login"]); $senha = md5(addslashes($_POST["senha"]));
Depois iremos receber as variáveis passadas pelo formulário. A função addslashes() serve para tratarmos nossas Strings recebidas, afim de evitar qualquer ataque de Sql Injection. Ela funciona da seguinte forma: sempre que encontrar qualquer aspa simples (’) ou dupla (”), ele adiciona uma barra invertida antes dela, ficando por exemplo \’. Uma das formas de invasão de sites mais simples é esta, digitando por exemplo ‘or 1=1 –. Esta é uma forma de se evitar. Continuando, a função md5() serve para encriptar a senha, já que a do banco está encriptada, a que se passa no formulário deverá também o ser, para comparamos.
Na próxima criamos uma variável para receber nossa string sql. Ela seleciona tudo (*) da tabela usuario, onde o login for igual ao da variável e a senha também. Simples.
Na próxima linha executamos o sql.
$sql = "SELECT * FROM usuario WHERE login = '$login' AND senha = '$senha'"; $rs = mysql_query($sql); if(mysql_num_rows($rs) == 1) {
A seguir, testamos se o comando retornou alguma linha na consulta. Se não, o usuário e a senha poderá ter sido escrito errado, ou até mesmo não existir.
Se a consulta estiver correta, entraremos no nosso if.
$user = mysql_fetch_array($rs); //conferindo o login e senha para segurança if($login == $user['login']){ //se entrou, entao o login é igual if($senha == $user['senha']){
A primeira linha dentro do if cria um array na variável $user com os dados coletados no banco de dados.
A seguir, conferimos se o conteúdo da variável é igual ao conteúdo vindo pelo formulário, evitando assim também alguma invasão.
Depois de conferidos o usuário e a senha, iremos ao próximo trecho:
//se entrou, então a senha também é igual $logado = "1"; $id_user = $user['id']; //criando a sessão session_start(); $_SESSION["id_user"] = $id_user; $_SESSION["logado"] = $logado; //depois que criarmos a sessão, vamos redirecionar para a página privada header("Location: cadastro.php");
Primeiramente atribuimos o valor 1 à variável $logado, já que o usuário escreveu tudo corretamente, e depois guardamos o id do usuário no banco na variável $id_user.
Agora podemos criar nossa sessão inicializando ela primeiramente, e depois criando suas variáveis.
A seguir, redirecionamos à página que queremos que os usuários logados acessem.
As próximas linhas são apenas fechamentos dos ifs e tratamentos de erros, com os elses.
Agora iremos para a nossa página privada, que só poderá ter seu conteúdo visto se o usuário estiver logado.
cadastro.php
<?php //Iniciando a sessão session_start(); include("connect.php"); if($_SESSION['logado'] == 1){ $sql = "SELECT * FROM usuario WHERE id = ".$_SESSION['id_user']; $rs = mysql_query($sql); if(mysql_num_rows($rs)) { $user = mysql_fetch_array($rs); echo "<strong> Olá ".$user['nome']."!</strong> "; echo "<a href="logout.php">Sair</a>"; echo "Esta é sua página privada. Nos próximos tutoriais continuaremos com esta página."; } }else { echo "Você não está logado. Tudo está oculto para você!"; } ?>
Explicando o código:
session_start(); include("connect.php"); if($_SESSION['logado'] == 1){
Nas primeiras linhas iniciamos a nossa sessão, e incluímos o arquivo de conexão com o banco. A seguir testamos se usuário está realmente logado, vendo se o conteúdo da variável de sessão $_SESSION['logado'] é igual a 1, conforme definimos no arquivo autenticar.php.
$sql = "SELECT * FROM usuario WHERE id = ".$_SESSION['id_user']; $rs = mysql_query($sql); if(mysql_num_rows($rs)) { $user = mysql_fetch_array($rs); echo "<strong> Olá ".$user['nome']."!</strong> "; echo "<a href="logout.php">Sair</a>"; echo "Esta é sua página privada. Nos próximos tutoriais continuaremos com esta página."; }
Agora escrevemos o nosso conteúdo oculto a não logados. Aqui fiz apenas uma simples consulta para pegar o nome do usuário, e exibí-lo nas boas vindas. Em seguida, apresentei o link para o usuário se deslogar do sistema.
O restante do código é apenas fechamento de if, e um else para os usuários não logados.
Por fim, a página de logout.
logout.php
<?php //Iniciando a sessão session_start(); //destruindo a sessão session_destroy(); Header("Location: form_login.php"); ?>
Nela nós destruimos a sessão, e redirecionamos para a página de login.
No próximo tutorial, irei abordar a parte de inserção no banco de dados. Pretendo fazê-lo como uma continuação deste, modificando nossa página cadastro.php, a fim de cadastrar novos usuários.
Bom por hoje é só. Espero ter sido claro no tutorial.
Se tiverem dúvidas é só perguntar nos comentários.
Arquivos do artigo para download
Abraço.
#1 by Lucas on 19 de junho de 2009
parabéns, amigo. ótimo tutorial! gostaria de enteder assim, abraço
#2 by arthur on 19 de junho de 2009
Fala Lucas,
Muito obrigado.
Basta treino. Comecei fuçando em tutoriais.
Abraço
#3 by Roberto bertola on 22 de junho de 2009
Opa…Primeiramente, parabéns pelo tutorial bem completo!
Aparentemento pois nao manjo muito hehe!
Bem, dei uma boa estudada e achei bem interessante e aí, para simplificar, copiei os codigos e botei o mesmo nome dos arquivos. Criei o DB, tudo certinho…mas, na hora de logar, apenas abre a pagima autenticar.php em branco. mais nada! Qual poderia ser o problema? esta hospedado em um provedor que aceita PHP normalmente, ok? Obrigado!
#4 by Murramed on 22 de junho de 2009
Legal o artigo…
coloca como trabalhar com arquivos de foto e mp3 usando banco de dados + endereços…
no PHP….
#5 by arthur on 22 de junho de 2009
Fala Roberto.
Acho que seu problema deve ser ho header(). Faça o seguinte. Tire a linha que tem ele, e coloque no lugar echo “< META HTTP-EQUIV=Refresh CONTENT=\"1; URL=cadastro.php\">“;. Junte o “<” com o “Meta”. Acho que isso resolverá. Se não funcionar, entre em contato novamete.
Abraço
#6 by arthur on 22 de junho de 2009
Fala Murramed,
Irei sim fazer um tutorial de upload, assim que tiver tempo.
Abraço
#7 by Roberto bertola on 23 de junho de 2009
Opa! obrigado por responder mas..ainda nao deu certo. É isso mesmo o codigo?
echo ““;.
Obrigado arthur!
#8 by Roberto bertola on 23 de junho de 2009
vixi…parece que o comentario nao aceitou eu digitar o codigo! hehe
#9 by arthur on 23 de junho de 2009
Roberto,
Nos comentários, os códigos ficam meio tronxos mesmo, por isso botei separado no outro comentário.
Disponibilizei os arquivos para download no fim do artigo. Baixe-os e veja se o erro ainda aparece.
Abraço
#10 by Jorge Luiz Chaves on 3 de julho de 2009
Oi Roberto, testei o Sistema de Login.
Ainda não encontrei o que dá errado, mas ele não loga de jeito nenhum.
Não dá erro nenhum, abre a página autenticar.php e fica parado.
Se já tiver detectado o erro agradeço uma resposta.
#11 by arthur on 5 de julho de 2009
Olá Jorge,
Tenta substituir o header() pela tag < meta ... > como sugeri anteriormente.
#12 by Augusto on 4 de agosto de 2009
Legal o tutorial!
Dei uma emperequetada no html. rsrsrsrsrs
Trabalhando com sessões
Sistema de Login
Login:
Senha:
#13 by arthur on 4 de agosto de 2009
Que bom que conseguiu Augusto.
Qualquer dúvida, estamos aqui
abraço
#14 by Rogério de Oliveira on 18 de agosto de 2009
Arthur, tudo bom!
Ótimo tutorial, parabéns…
Mas vê se pode me ajudar nesse caso?
Meu site terá um sistema com banco de dados e login e senha só que cada usuário será redirecionado para sua própria área restrita,sem que outros usuários vejam ou acessem a mesma área, tem como me ajudar?
Grato!
Um abraço.
Rogério Oliveira
#15 by Rogério de Oliveira on 18 de agosto de 2009
Ahh!
para complicar mais eu tenho em média cerca de 80 usuários para o sistema que é criado em PHP.
#16 by arthur on 19 de agosto de 2009
Olá Rogério,
Primeiramente, desculpe-me pela demora na resposta. Estive muito ocupado, e o blog ficou um pouco parado.
Enfim, vamos a sua dúvida.
Vou explicar como um exemplo. Um sistema de notícias, em que cada usuário só poderá editar a notícia que ele mesmo escreveu, não podendo fazer isso nas notícias de outros.
Para isso, você deverá ter na tabela de notícias uma coluna chamada ‘id_autor’ por exemplo, onde terá o id do usuário. Na hora que o usuário logar, você deverá fazer uma consulta nas notícias apenas com o id daquele usuário que logou, por exemplo “SELECT * FROM noticias WHERE id_autor = 1″. Nesse caso, pega todas as notícias do usuário de id 1.
Outra coisa que pode ser feita também é com relação a níveis de usuário. Por exemplo, um determinado usuário ser administrador. Nesse caso, você deverá acrescentar uma coluna em usuários de nome nível, e nela atribuir valores, por exemplo 1 administrador, 2 colunista, e por aí vai.
Acho que sua dúvida é esta. Se for outra coisa, ou não estiver sido claro, entre em contato novamente.
Abração
#17 by Rogério Oliveira on 25 de agosto de 2009
Arthur obrigado pela resposta.
Olha eu batalhei para achar uma resposta igual a sua, mas foi mudar um pouco de minha dúvida.
Hoje eu criei um sistema de login e senha do site que é por sessão, só que os dados do usuario logado teriam que ser filtrados em uma tabela dinâmica através do ID do usuário com recordset. A minha dúvida é como criar esse filtro de dados na area restrita do usuario pela variavel de sessão dele com sua ID do banco de dados. assim só ele veria seus dados quando efetuasse login para essa area restrita. Pode me judar nesse caso agora.( Obs: Menos por nivel de acesso, porque são 80 clientes cadastrados no BD).
Um abraço.
Rogério Oliveira.
#18 by Rogério Oliveira on 25 de agosto de 2009
Viu Arthur… continuando.
Daria para me enviar exemplo de como criar a variavel de sessão com ID do usuário? Será para busca na consulta ser mais eficiente para cada cliente e eu aplicar isso no Dreamweaver durante a criação deste sistema de consulta.
De novo um abraço.
Rogério Oliveira.
#19 by arthur on 25 de agosto de 2009
Olá Rogério,
Então, da forma como escrevi o tutorial, o id do usuário é salvo na sessão.
Nas tabelas de conteúdo, como por exemplo notícia, crie uma coluna com id_autor. Esse id_autor vai ser o id do usuário que escrever.
Quando você for filtrar o conteúdo da área restrita, a consulta seria mais ou menos assim “SELECT * FROM tabela WHERE id_autor = “.$_SESSION["id_user"]
Nesse caso, somente o conteúdo do usuário logado será exibido.
Veja se é isto.
abração
#20 by Rogério Oliveira on 26 de agosto de 2009
Arthur.
Então na página de login eu tenho que incluir esse código da sessão do ID?
Então é só eu repetir o mesmo código de sessão que você criou aqui em cima no seu tutorial?
Abraço.
Rogério Oliveira.
#21 by Rodrigo Buss on 14 de setembro de 2009
Gostaria de saber como deixar a variável $_SESSION como um atributo privado de uma classe.
estou comecando a praticar php oo mas isso pra mim é um mistério ainda
#22 by cardozo on 25 de setembro de 2009
ta dando este erro
mudei apenas o nome da tabela de usuario apra cad_usuario
Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /home/cmcarati/public_html/cadastro/autenticar.php:9) in /home/cmcarati/public_html/cadastro/autenticar.php on line 30
Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /home/cmcarati/public_html/cadastro/autenticar.php:9) in /home/cmcarati/public_html/cadastro/autenticar.php on line 30
Warning: Cannot modify header information – headers already sent by (output started at /home/cmcarati/public_html/cadastro/autenticar.php:9) in /home/cmcarati/public_html/cadastro/autenticar.php on line 35
#23 by bruno on 29 de setembro de 2009
Cara crio o codigo e uma sessão quando entro na pagina restrita tem uma parte de busca, exibi a busca mas quando clico para voltar para a pagina restrita de busca que é a pricipal da erro e tenho que logar novamente. alguem pode ajudar?
#24 by Robisley on 5 de outubro de 2009
muito bom o seu post…..
achei ele bem explicativo…
continue assim…
um abraço..
#25 by Jennifer-Tool on 26 de outubro de 2009
Aprendi muito
#26 by william on 5 de novembro de 2009
Arthur,
Parabens! Consegui implementar certinho e me ajudou muito…. achei outros posts mas nenhum direto como este, obg!
#27 by EMERSON on 17 de novembro de 2009
Bom dia !!
sou novato em prgramação PHP e estou tendo uma problema eu não sei se é de configuração, mas sempre que envio uma formulário ele me abre um download do arquivo.
#28 by Bruno on 23 de novembro de 2009
Olá Arthur!Tudo bem?
Eu estou montando agora um site, gostei de suas explicações, e até consegui montar um sistema simples de cadastro. Ouvi falar em um sql, apache, e até baixei um tal “wamp” que parece ter todos eles. Mas como faço para receber os dados das pessoas que se cadastrarem no meu site?Como posso conferir quem se cadastrou, sua senha e etc?Ficarei muito grato se puder me esclarescer este pedaço.
Abraços, e uma ótima semana!
#29 by Gabriel on 1 de dezembro de 2009
Muito bom!
Parabéns pelo tutorial. Está muito bem explicado..
Até quem não entende muito [meu caso] consegue entender hehehe…
Até mais.
#30 by Giuliano Pelaquin on 4 de dezembro de 2009
Arthur, mais claro impossível cara! Muito bom o tutorial. A única coisa que não entendi direito foi com relação a encriptação md5. Se eu cadastro algo que está usando a função md5 vai virar aquele código. Mas e quando eu quiser visualizar a lista por exemplo dos usuários cadastrados? Na senha não vai aparecer aquele código ao invés da senha que o peão digitou?
Mas minha dúvida principal não é essa. Eu queria fazer uma página de validação para eu só dar um include nas outras páginas do administrativo para a pessoa não conseguir acessar só digitando o endereço na url. Se eu só mandar um: session_start();
include(”connect.php”);
if(!isset($_SESSION['logado'] == 1){
Header(”Location: form_login.php”);
}
Isso está certo? E é seguro o suficiente?
Desde já agradeço a atenção!
#31 by sss on 9 de janeiro de 2010
olá arthur
gostei mt do seu tutorial, mas ao efectuar o login aparece: Usuário ou senha inválidos. Tente novamente.
isto se o login e senha estivessem incorrectos compreendia, mas neste caso os dados introduzidos estão 100% correctos e continua a aparecer essa mensagem.
ja tentei substituir como mandas-te o roberto fazer, mas ai é que agrava a situação .
Será que me podes ajudar?
obrigada
#32 by Francisco Leal on 20 de fevereiro de 2010
é dificil, colocar tempo em session como em wordpress, phpbb, whms ?? se puder dar uma ligeira explicada sobre o assunto, ficarei grato! Procuro sobre o assunto e não encontro nada. AH, se tiver algum link com o mesmo, iria ajudar muito para eu ler. Obrigado desde ja, seu tuts é excelente… t+