{"id":2786,"date":"2014-07-31T02:52:16","date_gmt":"2014-07-31T02:52:16","guid":{"rendered":"http:\/\/www.deuzebranaweb.com.br\/?p=2786"},"modified":"2014-07-31T02:52:16","modified_gmt":"2014-07-31T02:52:16","slug":"criando-um-sistema-de-login-com-php-e-mysql","status":"publish","type":"post","link":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/2014\/07\/31\/criando-um-sistema-de-login-com-php-e-mysql\/","title":{"rendered":"Criando um sistema de login com PHP e MySQL"},"content":{"rendered":"<p>Hoje vou ensinar a criar um sistema de login simples usando PHP e MySQL.<\/p>\n<p>\u00c9 recomend\u00e1vel que voc\u00ea j\u00e1 tenha um conhecimento pr\u00e9vio de HTML e, se poss\u00edvel, PHP e MySQL para tornar as coisas mais f\u00e1ceis.<\/p>\n<p>Nosso sistema ser\u00e1 bem simples: um arquivo chamado seguranca.php, que dever\u00e1 ser inclu\u00eddo no topo do seu site (em todas as p\u00e1ginas) e que faz a conex\u00e3o com o banco de dados e que possui algumas fun\u00e7\u00f5es usadas para redirecionar o visitante para o formul\u00e1rio de login (login.php) caso ele n\u00e3o esteja logado.<\/p>\n<p>Vamos ao trabalho:<\/p>\n<p>O que iremos definir primeiro \u00e9 a tabela usada para armazenar os usu\u00e1rios do sistema:<\/p>\n<p>1<br \/>\nDROP TABLE IF EXISTS `usuarios`;<br \/>\n2<br \/>\nCREATE TABLE IF NOT EXISTS `usuarios` (<br \/>\n3<br \/>\n`id` int(10) unsigned NOT NULL AUTO_INCREMENT,<br \/>\n4<br \/>\n`nome` varchar(100) NOT NULL,<br \/>\n5<br \/>\n`usuario` varchar(50) NOT NULL,<br \/>\n6<br \/>\n`senha` varchar(50) NOT NULL,<br \/>\n7<br \/>\nPRIMARY KEY (`id`),<br \/>\n8<br \/>\nUNIQUE KEY `usuario` (`usuario`)<br \/>\n9<br \/>\n) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;<br \/>\nExecute esse bloco SQL no seu banco de dados para criar a tabela usada pelo sistema.<\/p>\n<p>Depois disso, vamos ao formul\u00e1rio de login que voc\u00ea colocar\u00e1 dentro de um arquivo chamado login.php:<\/p>\n<p>1<\/p>\n<form method=\"post\" action=\"\/valida.php\">\n2<br \/>\n<label>Usu\u00e1rio<\/label><br \/>\n3<br \/>\n<input type=\"text\" name=\"usuario\" maxlength=\"50\" \/><br \/>\n4<\/p>\n<p>5<br \/>\n<label>Senha<\/label><br \/>\n6<br \/>\n<input type=\"password\" name=\"senha\" maxlength=\"50\" \/><br \/>\n7<\/p>\n<p>8<br \/>\n<input type=\"submit\" value=\"Entrar\" \/><br \/>\n9<br \/>\n<\/form>\n<p>Esse formul\u00e1rio, com apenas dois campos, manda pra p\u00e1gina valida.php, que \u00e9 um pequeno PHP que receber\u00e1 os dados enviados pelo formul\u00e1rio, far\u00e1 a valida\u00e7\u00e3o deles e mandar\u00e1 o visitante ou pra p\u00e1gina interna (index.php) ou de volta pra p\u00e1gina de login (login.php).<\/p>\n<p>Esse \u00e9 o codigo fonte do arquivo valida.php:<\/p>\n<p>01<br \/>\n\/\/ Inclui o arquivo com o sistema de seguran\u00e7a<br \/>\n02<br \/>\ninclude(&#8220;seguranca.php&#8221;);<br \/>\n03<\/p>\n<p>04<br \/>\n\/\/ Verifica se um formul\u00e1rio foi enviado<br \/>\n05<br \/>\nif ($_SERVER[&#8216;REQUEST_METHOD&#8217;] == &#8216;POST&#8217;) {<br \/>\n06<br \/>\n\/\/ Salva duas vari\u00e1veis com o que foi digitado no formul\u00e1rio<br \/>\n07<br \/>\n\/\/ Detalhe: faz uma verifica\u00e7\u00e3o com isset() pra saber se o campo foi preenchido<br \/>\n08<br \/>\n$usuario = (isset($_POST[&#8216;usuario&#8217;])) ? $_POST[&#8216;usuario&#8217;] : &#8221;;<br \/>\n09<br \/>\n$senha = (isset($_POST[&#8216;senha&#8217;])) ? $_POST[&#8216;senha&#8217;] : &#8221;;<br \/>\n10<\/p>\n<p>11<br \/>\n\/\/ Utiliza uma fun\u00e7\u00e3o criada no seguranca.php pra validar os dados digitados<br \/>\n12<br \/>\nif (validaUsuario($usuario, $senha) == true) {<br \/>\n13<br \/>\n\/\/ O usu\u00e1rio e a senha digitados foram validados, manda pra p\u00e1gina interna<br \/>\n14<br \/>\nheader(&#8220;Location: index.php&#8221;);<br \/>\n15<br \/>\n} else {<br \/>\n16<br \/>\n\/\/ O usu\u00e1rio e\/ou a senha s\u00e3o inv\u00e1lidos, manda de volta pro form de login<br \/>\n17<br \/>\n\/\/ Para alterar o endere\u00e7o da p\u00e1gina de login, verifique o arquivo seguranca.php<br \/>\n18<br \/>\nexpulsaVisitante();<br \/>\n19<br \/>\n}<br \/>\n20<br \/>\n}<br \/>\nA estrutura do seu site, at\u00e9 esse ponto, deve estar dessa forma:<\/p>\n<p>..\/pasta_do_seu_site\/index.php \u00bb P\u00e1gina intera a ser protegida<br \/>\n..\/pasta_do_seu_site\/login.php \u00bb P\u00e1gina com o formul\u00e1rio de login<br \/>\n..\/pasta_do_seu_site\/valida.php \u00bb P\u00e1gina que faz a valida\u00e7\u00e3o dos dados do formul\u00e1rio<\/p>\n<p>Agora vamos criar o arquivo seguranca.php na mesma pasta dos demais arquivos:<\/p>\n<p>001<br \/>\n\/**<br \/>\n002<br \/>\n* Sistema de seguran\u00e7a com acesso restrito<br \/>\n003<br \/>\n*<br \/>\n004<br \/>\n* Usado para restringir o acesso de certas p\u00e1ginas do seu site<br \/>\n005<br \/>\n*<br \/>\n006<br \/>\n* @author Thiago Belem <contato @thiagobelem.net><br \/>\n007<br \/>\n* @link http:\/\/thiagobelem.net\/<br \/>\n008<br \/>\n*<br \/>\n009<br \/>\n* @version 1.0<br \/>\n010<br \/>\n* @package SistemaSeguranca<br \/>\n011<br \/>\n*\/<br \/>\n012<\/p>\n<p>013<br \/>\n\/\/  Configura\u00e7\u00f5es do Script<br \/>\n014<br \/>\n\/\/ ==============================<br \/>\n015<br \/>\n$_SG[&#8216;conectaServidor&#8217;] = true;    \/\/ Abre uma conex\u00e3o com o servidor MySQL?<br \/>\n016<br \/>\n$_SG[&#8216;abreSessao&#8217;] = true;         \/\/ Inicia a sess\u00e3o com um session_start()?<br \/>\n017<\/p>\n<p>018<br \/>\n$_SG[&#8216;caseSensitive&#8217;] = false;     \/\/ Usar case-sensitive? Onde &#8216;thiago&#8217; \u00e9 diferente de &#8216;THIAGO&#8217;<br \/>\n019<\/p>\n<p>020<br \/>\n$_SG[&#8216;validaSempre&#8217;] = true;       \/\/ Deseja validar o usu\u00e1rio e a senha a cada carregamento de p\u00e1gina?<br \/>\n021<br \/>\n\/\/ Evita que, ao mudar os dados do usu\u00e1rio no banco de dado o mesmo contiue logado.<br \/>\n022<\/p>\n<p>023<br \/>\n$_SG[&#8216;servidor&#8217;] = &#8216;localhost&#8217;;    \/\/ Servidor MySQL<br \/>\n024<br \/>\n$_SG[&#8216;usuario&#8217;] = &#8216;root&#8217;;          \/\/ Usu\u00e1rio MySQL<br \/>\n025<br \/>\n$_SG[&#8216;senha&#8217;] = &#8221;;                \/\/ Senha MySQL<br \/>\n026<br \/>\n$_SG[&#8216;banco&#8217;] = &#8216;test&#8217;;            \/\/ Banco de dados MySQL<br \/>\n027<\/p>\n<p>028<br \/>\n$_SG[&#8216;paginaLogin&#8217;] = &#8216;login.php&#8217;; \/\/ P\u00e1gina de login<br \/>\n029<\/p>\n<p>030<br \/>\n$_SG[&#8216;tabela&#8217;] = &#8216;usuarios&#8217;;       \/\/ Nome da tabela onde os usu\u00e1rios s\u00e3o salvos<br \/>\n031<br \/>\n\/\/ ==============================<br \/>\n032<\/p>\n<p>033<br \/>\n\/\/ ======================================<br \/>\n034<br \/>\n\/\/   ~ N\u00e3o edite a partir deste ponto ~<br \/>\n035<br \/>\n\/\/ ======================================<br \/>\n036<\/p>\n<p>037<br \/>\n\/\/ Verifica se precisa fazer a conex\u00e3o com o MySQL<br \/>\n038<br \/>\nif ($_SG[&#8216;conectaServidor&#8217;] == true) {<br \/>\n039<br \/>\n$_SG[&#8216;link&#8217;] = mysql_connect($_SG[&#8216;servidor&#8217;], $_SG[&#8216;usuario&#8217;], $_SG[&#8216;senha&#8217;]) or die(&#8220;MySQL: N\u00e3o foi poss\u00edvel conectar-se ao servidor [&#8220;.$_SG[&#8216;servidor&#8217;].&#8221;].&#8221;);<br \/>\n040<br \/>\nmysql_select_db($_SG[&#8216;banco&#8217;], $_SG[&#8216;link&#8217;]) or die(&#8220;MySQL: N\u00e3o foi poss\u00edvel conectar-se ao banco de dados [&#8220;.$_SG[&#8216;banco&#8217;].&#8221;].&#8221;);<br \/>\n041<br \/>\n}<br \/>\n042<\/p>\n<p>043<br \/>\n\/\/ Verifica se precisa iniciar a sess\u00e3o<br \/>\n044<br \/>\nif ($_SG[&#8216;abreSessao&#8217;] == true) {<br \/>\n045<br \/>\nsession_start();<br \/>\n046<br \/>\n}<br \/>\n047<\/p>\n<p>048<br \/>\n\/**<br \/>\n049<br \/>\n* Fun\u00e7\u00e3o que valida um usu\u00e1rio e senha<br \/>\n050<br \/>\n*<br \/>\n051<br \/>\n* @param string $usuario &#8211; O usu\u00e1rio a ser validado<br \/>\n052<br \/>\n* @param string $senha &#8211; A senha a ser validada<br \/>\n053<br \/>\n*<br \/>\n054<br \/>\n* @return bool &#8211; Se o usu\u00e1rio foi validado ou n\u00e3o (true\/false)<br \/>\n055<br \/>\n*\/<br \/>\n056<br \/>\nfunction validaUsuario($usuario, $senha) {<br \/>\n057<br \/>\nglobal $_SG;<br \/>\n058<\/p>\n<p>059<br \/>\n$cS = ($_SG[&#8216;caseSensitive&#8217;]) ? &#8216;BINARY&#8217; : &#8221;;<br \/>\n060<\/p>\n<p>061<br \/>\n\/\/ Usa a fun\u00e7\u00e3o addslashes para escapar as aspas<br \/>\n062<br \/>\n$nusuario = addslashes($usuario);<br \/>\n063<br \/>\n$nsenha = addslashes($senha);<br \/>\n064<\/p>\n<p>065<br \/>\n\/\/ Monta uma consulta SQL (query) para procurar um usu\u00e1rio<br \/>\n066<br \/>\n$sql = &#8220;SELECT `id`, `nome` FROM `&#8221;.$_SG[&#8216;tabela&#8217;].&#8221;` WHERE &#8220;.$cS.&#8221; `usuario` = &#8216;&#8221;.$nusuario.&#8221;&#8216; AND &#8220;.$cS.&#8221; `senha` = &#8216;&#8221;.$nsenha.&#8221;&#8216; LIMIT 1&#8243;;<br \/>\n067<br \/>\n$query = mysql_query($sql);<br \/>\n068<br \/>\n$resultado = mysql_fetch_assoc($query);<br \/>\n069<\/p>\n<p>070<br \/>\n\/\/ Verifica se encontrou algum registro<br \/>\n071<br \/>\nif (empty($resultado)) {<br \/>\n072<br \/>\n\/\/ Nenhum registro foi encontrado => o usu\u00e1rio \u00e9 inv\u00e1lido<br \/>\n073<br \/>\nreturn false;<br \/>\n074<\/p>\n<p>075<br \/>\n} else {<br \/>\n076<br \/>\n\/\/ O registro foi encontrado => o usu\u00e1rio \u00e9 valido<br \/>\n077<\/p>\n<p>078<br \/>\n\/\/ Definimos dois valores na sess\u00e3o com os dados do usu\u00e1rio<br \/>\n079<br \/>\n$_SESSION[&#8216;usuarioID&#8217;] = $resultado[&#8216;id&#8217;]; \/\/ Pega o valor da coluna &#8216;id do registro encontrado no MySQL<br \/>\n080<br \/>\n$_SESSION[&#8216;usuarioNome&#8217;] = $resultado[&#8216;nome&#8217;]; \/\/ Pega o valor da coluna &#8216;nome&#8217; do registro encontrado no MySQL<br \/>\n081<\/p>\n<p>082<br \/>\n\/\/ Verifica a op\u00e7\u00e3o se sempre validar o login<br \/>\n083<br \/>\nif ($_SG[&#8216;validaSempre&#8217;] == true) {<br \/>\n084<br \/>\n\/\/ Definimos dois valores na sess\u00e3o com os dados do login<br \/>\n085<br \/>\n$_SESSION[&#8216;usuarioLogin&#8217;] = $usuario;<br \/>\n086<br \/>\n$_SESSION[&#8216;usuarioSenha&#8217;] = $senha;<br \/>\n087<br \/>\n}<br \/>\n088<\/p>\n<p>089<br \/>\nreturn true;<br \/>\n090<br \/>\n}<br \/>\n091<br \/>\n}<br \/>\n092<\/p>\n<p>093<br \/>\n\/**<br \/>\n094<br \/>\n* Fun\u00e7\u00e3o que protege uma p\u00e1gina<br \/>\n095<br \/>\n*\/<br \/>\n096<br \/>\nfunction protegePagina() {<br \/>\n097<br \/>\nglobal $_SG;<br \/>\n098<\/p>\n<p>099<br \/>\nif (!isset($_SESSION[&#8216;usuarioID&#8217;]) OR !isset($_SESSION[&#8216;usuarioNome&#8217;])) {<br \/>\n100<br \/>\n\/\/ N\u00e3o h\u00e1 usu\u00e1rio logado, manda pra p\u00e1gina de login<br \/>\n101<br \/>\nexpulsaVisitante();<br \/>\n102<br \/>\n} else if (!isset($_SESSION[&#8216;usuarioID&#8217;]) OR !isset($_SESSION[&#8216;usuarioNome&#8217;])) {<br \/>\n103<br \/>\n\/\/ H\u00e1 usu\u00e1rio logado, verifica se precisa validar o login novamente<br \/>\n104<br \/>\nif ($_SG[&#8216;validaSempre&#8217;] == true) {<br \/>\n105<br \/>\n\/\/ Verifica se os dados salvos na sess\u00e3o batem com os dados do banco de dados<br \/>\n106<br \/>\nif (!validaUsuario($_SESSION[&#8216;usuarioLogin&#8217;], $_SESSION[&#8216;usuarioSenha&#8217;])) {<br \/>\n107<br \/>\n\/\/ Os dados n\u00e3o batem, manda pra tela de login<br \/>\n108<br \/>\nexpulsaVisitante();<br \/>\n109<br \/>\n}<br \/>\n110<br \/>\n}<br \/>\n111<br \/>\n}<br \/>\n112<br \/>\n}<br \/>\n113<\/p>\n<p>114<br \/>\n\/**<br \/>\n115<br \/>\n* Fun\u00e7\u00e3o para expulsar um visitante<br \/>\n116<br \/>\n*\/<br \/>\n117<br \/>\nfunction expulsaVisitante() {<br \/>\n118<br \/>\nglobal $_SG;<br \/>\n119<\/p>\n<p>120<br \/>\n\/\/ Remove as vari\u00e1veis da sess\u00e3o (caso elas existam)<br \/>\n121<br \/>\nunset($_SESSION[&#8216;usuarioID&#8217;], $_SESSION[&#8216;usuarioNome&#8217;], $_SESSION[&#8216;usuarioLogin&#8217;], $_SESSION[&#8216;usuarioSenha&#8217;]);<br \/>\n122<\/p>\n<p>123<br \/>\n\/\/ Manda pra tela de login<br \/>\n124<br \/>\nheader(&#8220;Location: &#8220;.$_SG[&#8216;paginaLogin&#8217;]);<br \/>\n125<br \/>\n}<br \/>\nN\u00e3o vou poder explicar todas as fun\u00e7\u00f5es do arquivo pq \u00e9 muita coisa.. Mas todas elas est\u00e3o devidamente comentadas e documentadas\u2026 \u00c9 s\u00f3 olhar.<\/p>\n<p>Com esse arquivos n\u00f3s j\u00e1 nos conectamos automaticamente ao servidor MySQL, ent\u00e3o se voc\u00ea usar outra forma pra fazer a conex\u00e3o, v\u00e1 na parte de configura\u00e7\u00f5es do seguranca.php e defina a vari\u00e1vel $_SG[&#8216;conectaServidor&#8217;] pra falso (false). O mesmo acontece pra sess\u00e3o com a vari\u00e1vel $_SG[&#8216;abreSessao&#8217;].<\/p>\n<p>Agora \u00e9 s\u00f3 incluir essas linhas no topo de cada arquivo que dever\u00e1 ter o acesso restrito:<\/p>\n<p>1<br \/>\ninclude(&#8220;seguranca.php&#8221;); \/\/ Inclui o arquivo com o sistema de seguran\u00e7a<br \/>\n2<br \/>\nprotegePagina(); \/\/ Chama a fun\u00e7\u00e3o que protege a p\u00e1gina<br \/>\nQuando voc\u00eas quiserem exibir o nome do usu\u00e1rio logado, \u00e9 s\u00f3 fazer isso:<\/p>\n<p>1<br \/>\necho &#8220;Ol\u00e1, &#8221; . $_SESSION[&#8216;usuarioNome&#8217;];<br \/>\nVeja mais sobre escrever e pegar valores da sess\u00e3o (coisa que acontece muito nesse sistema de login) no t\u00f3pico Aprendendo a usar sess\u00f5es no PHP.<\/p>\n<p>Viram como \u00e9 f\u00e1cil?<\/p>\n<p>Pra quem quiser um tutorial mais explicado e detalhado recomendo: Como criar um Sistema de Login com N\u00edveis de Permiss\u00e3o (passo-a-passo).<\/p>\n<p>Nota: Alguns de voc\u00eas devem ter notado que durante essa semana, no post Criando Sistemas Seguros, falei sobre n\u00e3o usar nomes \u00f3bvios para tabelas de usu\u00e1rios. Mas esse exemplo \u00e9 apenas explicativo, voc\u00ea pode mudar o nome da tabela de usu\u00e1rios se preferir e depois \u00e9 s\u00f3 alterar a vari\u00e1vel no bloco de configura\u00e7\u00f5es dentro do seguranca.php.<br \/>\n\u2013<\/p>\n<p>Veja aqui como criar um sistema de login usando classes (Orienta\u00e7\u00e3o a Objetos) e que funciona no PHP 4 e PHP 5.<\/contato><\/p>\n<p>http:\/\/blog.thiagobelem.net\/criando-um-sistema-de-login-com-php-e-mysql\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje vou ensinar a criar um sistema de login simples usando PHP e MySQL. \u00c9 recomend\u00e1vel que voc\u00ea j\u00e1 tenha um conhecimento pr\u00e9vio de HTML e, se poss\u00edvel, PHP e MySQL para tornar as coisas mais f\u00e1ceis. Nosso sistema ser\u00e1 bem simples: um arquivo chamado&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_angie_page":false,"page_builder":"","footnotes":""},"categories":[6],"tags":[],"class_list":["post-2786","post","type-post","status-publish","format-standard","hentry","category-php"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=2786"}],"version-history":[{"count":0,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2786\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=2786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=2786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=2786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}