Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Estou estudando PHP e encontrei na net um tutorial para fazer um sistema de login com classe. Não sei onde errei no código, mas não estou conseguindo fazer login no sistema. Sempre que tento dá erro de "Usuário inválido".
Alguém pode me ajudar? Segue códigos da tabela, da página de login, da classe, do config para conexão ao banco e da função para validação do login:
Tabela:
/*
Navicat MySQL Data Transfer
Source Server : localhos
Source Server Version : 50516
Source Host : localhost:3306
Source Database : e_glauks
Target Server Type : MYSQL
Target Server Version : 50516
File Encoding : 65001
Date: 2013-01-19 17:33:33
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for tb_usuarios
-- ----------------------------
DROP TABLE IF EXISTS `tb_usuarios`;
CREATE TABLE `tb_usuarios` (
`id_usuario` int(11) NOT NULL AUTO_INCREMENT,
`usuario` varchar(255) NOT NULL,
`nome` varchar(255) NOT NULL,
`senha` varchar(11) NOT NULL,
`data_nascimento` date DEFAULT NULL,
`data_cadastro` datetime DEFAULT NULL,
`telefone` varchar(255) DEFAULT NULL,
`celular` varchar(255) DEFAULT NULL,
`perfil_usuario` int(11) NOT NULL,
`escola` varchar(255) DEFAULT NULL,
`graduacao` int(11) DEFAULT NULL,
PRIMARY KEY (`id_usuario`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tb_usuarios
-- ----------------------------
INSERT INTO tb_usuarios VALUES ('15', 'laertvalois@hotmail.com', 'Laert Valois Rios Carneiro', '1234', null, null, null, null, '2', null, null);
Página de Login:
<?php
include_once('includes/config.php');
include_once('includes/classes/usuarios.class.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--Script para o ajax carregar páginas em DIVs-->
<script type="text/javascript" src="media/js/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#menuinicio a").click(function( e ){
e.preventDefault();
var href = $( this ).attr('href');
$("#areadetexto").load( href +" #areadetexto");
});
});
</script>
<title>Documento sem título</title>
<link rel="stylesheet" href="media/css/index.css" type="text/css" />
</head>
<body onload="document.form_acesso.acesso_usuario.focus();">
<div id="container" class="container">
<div id="header" class="header">
<div id="titulo" class="tituloinicio">
<img align="middle" src="media/images/logoheader.png" height="66px" vspace="14px" alt="e-glauks a ferramenta do conhecimento" /></div><!--Fecha a div do título-->
<div id="menuinicio" class="menuinicio">
<span><a href="index.php" target="_parent" class="headerlink">Home</a> | Sobre o e-professor | Como funciona | <a href="pages/cadastra.php" target="_self">Cadastre-se</a> | Contato</span>
</div><!--Fecha a div de menu início-->
</div><!--Fecha a div header-->
<div id="acesso" class="acesso">
<form id="form_acesso" name="form_acesso" method="post" action="includes/functions/valida_login.php">
<fieldset class="fieldsetmenu">
<label for="acesso_usuario">E-mail</label>
<input type="text" id="usuario" name="usuario" />
<label for="acesso_senha">Senha</label>
<input type="password" id="senha" name="senha" />
<input type="submit" value="Entrar" class="acessosubmit" id="entrar" name="entrar" />
<label>Esqueci minha senha.</label><br />
<input align="left" type="checkbox" name="lembrar" id="lembrar" />
<label for="lembrar">Mantenha-me conectado</label>
</fieldset>
</form>
</div><!-- Fecha a div acesso-->
<div id="principal" class="principal">
<div id="areadetexto" class="areadetexto"><span><p>Aqui vai um texto explicativo!</p></span>
</div><!--Fecha div areadetexto-->
<div id="rightarea" class="rightarea"><h1>Anúncios</h1>
<div id="painel" class="painel">
<span>Aqui estarão notícias e anúncios</span><br />
<span><a href="pages/admin/admin.php" class="painellink">Administração</a></span><br />
</div><!--Fecha a div painel-->
</div><!--Fecha div rightarea-->
</div><!-- Fecha a div principal-->
<div id="footer" class="footer">
<span>Desenvolvido por Laert Valois Rios Carneiro</span>
</div><!--Fecha a div footer-->
</div><!--Fecha a div container-->
</body>
</html>
Classe:
<?php
/**
* Classe para controle de login e permissões de usuário
*
* (PHP 4, PHP 5)
*
* @author Laert Valois <laertvalois@hotmail.com>
* @link http://www.entendaweb.com/
*
* @version v1.0
* @todo Criar a funcionalidade "Esqueci minha senha"
*
*/
class Usuario{
/**
* Nome do banco de dados onde está a tabela de usuários
*
* @var string
* @since ver1.0
*/
var $BancoDeDados = 'e_glauks';
/**
* Nome da tabela de usuários
*
* @var string
* @since ver1.0
*/
var $TabelaUsuarios = 'tb_usuarios';
/**
* Nome dos campos onde ficam o usuário e a senha de cada usuário
*
* Formato: tipo => nome do campo na tabela
*
* O usuário cadastrado na tabela é o "e-mail", que será necessário, também, para o "Esqueci minha senha"
*
* @var array
* @since ver1.0
*/
var $Campos = array(
'usuario' => 'usuario',
'senha' => 'senha');
/**
* Nomes dos campos que serão pegos da tabela de usuários e salvos na sessão,
* caso o valor seja false nenhum dado será consultado
*
* @var mixed
* @since ver1.0
*/
var $dados = array('id_usuario', 'usuario', 'nome' );
/**
* Inicia se sessão se necessário?
*
* @var boolean
* @since ver1.0
*/
var $IniciaSessao = true;
/**
* Prefixo das chaves usadas na sessão
*
* @var string
* @since ver1.0
*/
var $PrefixoChaves = 'usuario_';
/**
* Usa um cookie para melhorar a segurança?
*
* @var boolean
* @since ver1.0
*/
var $Cookie = true;
/**
* O usuário e senha são case-sensitive?
*
* Em valores case-sensitive "casa" é diferente de "CaSa" e de "CASA"
*
* @var boolean
* @since ver1.0
*/
var $CaseSensitive = true;
/**
* Filtra os dados antes de consultá-los usando mysql_real_scape_string()?
*
* @var boolean
* @since ver1.0
*/
var $FiltraDados = true;
/**
* Quantidade em dias que o sistema lembrará os dados ("Lembrar minha senha")
*
* Usado apenas quando o terceiro parametro do método Usuario::UsuarioLogado() for true
* Os dados salvos serão encriptados usando base64
*
* @var integer
* @since ver1.0
*/
var $LembrarTempo = 7;
/**
* Diretório ao qual o cookie vai pertencer
* Atenção: Não edite se você não souber o que está fazendo!
*
* @var string
* @since ver1.0
*/
var $CookiePath = '/';
/**
* Armazena as mensagens de erro
*
* @var string
* @since ver1.0
*/
var $Erro = '';
/**
* Codifica a senha do usuário
*
* Modifique esse método caso você use alguma senha encriptada
*
* @access public
* @since ver1.0
*
* @param string $senha - A senha que será codificada
* @return string - A senha já codificada
*/
function CodificaSenha($senha){
//Altere aqui caso você use, por exemplo, md5
//return md5($senha);
return ($senha);/**
* Verifica se um usuário existe no sistema
*
* @access public
* @since ver1.0
* @uses Usuario::CodificaSenha()
*
* @param string $usuario - O usuário que será validado
* @param string $senha - A senha que será validada
* $return boolean - Se o usuário existe
*/
function ValidaUsuario($usuario, $senha){
$senha = $this->CodificaSenha($senha);
//Filtra os dados?
if ($this->FiltraDados){
$usuario = mysql_escape_string($usuario);
$senha = mysql_escape_string($senha);//Os dados são case-sensitive?
$binary = ($this->CaseSensitive) ? 'BYNARY' : '';
//Procura por usuários com o mesmo usuário e senha
$sql = "SELECT COUNT(*) AS total
FROM `{$this->BancoDeDados}`.`{$this->TabelaUsuarios}`{$this->Campos['usuario']} = '{$usuario}'{$binary} `{$this->Campos['senha']}` = '{$senha}'";
$query = mysql_query($sql);
if ($query){//Limpa a consulta da memória
mysql_free_result($query);
}else{
//A consulta foi mal sucedida retorna false
return false;
}//Fecha o else de if ($query)
//Se houver apenas um usuário retorna true
return ($total == 1) ? true : false;
}//Fecha a função ValidaUsuario
/**
* Tenta logar um usuário no sistema salvando seus dados na sessão e cookies
*
* @access public
* @since ver1.0
* @uses Usuario::ValidaUsuario()
* @uses Usuario::LembrarDados()
*
* @param string $usuario - O usuário que será logado
* @param string $senha - A senha do usuário
* @param boolean $lembrar - Salvar os dados em cookies? ("Lembrar minha senha")
* @return boolean - Retorna se o usuário foi logado
*/
function LogaUsuario($usuario, $senha, $lembrar = false){
//Verifica se é um usuário válido
if ($this->ValidaUsuario($usuario, $senha)){
//Inicia a sessão?
if ($this->IniciaSessao AND !isset($_SESSION)){
session_start();//Filtra os dados?
if ($this->FiltraDados){
$usuario = mysql_real_escape_string($usuario);
$senha = mysql_real_escape_string($senha);//Traz dados da tebela
if ($this->dados != false){
//Adiciona o campo de usuários na lista de dados
if(!in_array($this->Campos['usuario'], $this->dados)){
$this->dados[] = 'usuario';//Monta o formato SQL na lista de campos
$dados = join(', ', array_unique($this->dados));
//Os dados são case-sensitive?
$binary = ($this->CaseSensitive) ? 'BINARY' : '';
//Consulta os dados
$sql = "SELECT {$dados}
FROM `{$this->BancoDedados}`.`{$this->TabelaUsuarios}`
WHERE {$binary} `{$this->Campos['usuario']}` = '{$usuario}'";
$query = mysql_query($sql);
//Se a consulta falhou
if (!query){
//A consulta foi mal sucedida, retorne false
$this->Erro = 'A consulta de dados é inválida.';
return false;//Passa os dados para a sessão
foreach($dados AS $chave=>$valor){
$_SESSION[$this->PrefixoChaves . $chave] = $valor;//Usuário logado com sucesso
$_SESSION[$this->PrefixoChaves . 'logado'] = true;
//Defina um cookie para maior segurança?
if ($this->Cookie){
//Monta um cookie com informações gerais sobre o usuário: usuário, ip e navegador
$valor = join('#', array($usuario, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']));
//Encripta o valor do cookie
$valor = sha1($valor);
//Cria o cookie
setcookie($this->PrefixoChaves . 'token', $valor, 0, $this->CookiePath);
}//Fecha a condição que definie um cookie
//Salva os dados do usuário em cookies? ("Lembrar minha senha")
if ($lembrar) $this->LembrarDados($usuario, $senha);
//Fim da verificação retorna true
return true;
}else{
$this->Erro = 'Usuário inválido';
return false;/**
* Verifica se há um usuário logado no sistema
*
* @access public
* @since ver1.0
* @uses Usuario::VerificaDadosLembrados()
*
* @param boolean $cookies - Verifica também os cookies?
* @return boolean - Se há um usuário logado
*/
function UsuarioLogado($cookies = true){
//Inicia a sessão?
if ($this->IniciaSessao AND !isset($_SESSION)){
session_start();//Verifica se não existe o valor na sessão
if(!isset($_SESSION[$this->PrefixoChaves . 'logado']) OR !$_SESSION[$this->PrefixoChaves . 'logado']){
//Não existe, dados na sessão
//Verifica os dados salvos nos cookies?
if ($cookies){
//Se os dados forem válidos o usuário é logado automaticamente
return $this->VerificaDadosLembrados();//Não há usuário logado;
$this->Erro = 'Não há usuário logado';
return false;//Faz a verificação do cookie?
if($this->Cookie){
//Verifica se o cookie não existe
if (!isset($_COOKIE[$this->PrefixoChaves . 'token'])){
$this->Erro = 'Não há usuário logado';
return false;//Encripta o valor do cookie
$valor = sha1($valor);
//Verifica o valor do cookie
if ($_COOKIE[$this->PrefixoChaves . 'token'] !== $valor){
$this->Erro = 'Não há usuário logado';
return false;//A sessão e o cookie foram verificados, há um usuário logado
return true;
}//Fecha a função UsuarioLogado
/**
* Faz logout do usuário logado
*
* @access public
* @since ver1.0
* @uses Usuario::LimpaDadosLembrados()
* @uses Usuario::UsuarioLogado()
*
* @param boolean $cookies - Limpa também os cookies de "Lembrar minha senha"?
* @return boolean
*/
function LogOut($cookies = true){
//Inicia a sessão?
if($this->IniciaSessao AND !isset($_SESSION)){
session_start();//Tamanho do prefixo
$tamanho = strlen($this->PrefixoChaves);
//Destrói todos os valores da sessão relativos ao sistema de login
foreach($_SESSION AS $chave=>$valor){
//Remove apenas valores cujas chaves comecem com o prefixo correto
if (substr($chave, 0, $tamanho) == $this->PrefixoChaves){
unset($_SESSION[$chave]);//Destrói a sessão se ela estiver vazia
if (count($_SESSION) == 0){
session_destroy();
//Remove o cookie da sessão se ele existir
if (isset($_COOKIE['PHPSESSID'])){
setcookie('PHPSESSID', false, (time() - 3600));
unset ($_COOKIE['PHPSESSID']);//Remove o cookie com as informações do visitante
if ($this->Cookie AND isset($_COOKIE[$this->PrefixoChaves . 'token'])){
setcookie($this->PrefixoChaves . 'token', false, (time() - 3600), $this->CookiePath);
unset($_COOKIE[$this->PrefixoChaves . 'token']);//Limpa também os cookies de "Lembrar minha senha"?
if ($cookies) $this->LimpaDadosLembrados();
//Retorna se não há um usuário logado (sem verificar os cookies)
return !$this->UsuarioLogado(false);
}//Fecha a função LogOut
/**
* Salva os dados do usuário em cookies ("Lembrar minha senha")
*
* @access public
* @since ver1.0
*
* @param string $usuario - O usuário que será lembrado
* @param string $senha - A senha do usuário
* @return void
*/
function LembrarDados($usuario, $senha){
//Calcula o timestamp final para os cookies expirarem
$tempo = strtotime("+{$this->LembrarTempo} day", time());
//Encripta os dados do usuário usando base64
//O rand (1, 9) cria um dígito no início da stringque impede a descriptografia
$usuario = rand(1, 9) . base64_encode($usuario);
$senha = rand(1, 9) . base64_encode($senha);
//Cria um cookie com o usuário
setcookie($this->PrefixoChaves . 'lu', $usuario, $tempo, $this->CookiePath);
//Cria um cookie com a senha
setcookie($this->PrefixoChaves . 'ls', $senha, $tempo, $this->CookiePath);
}//Fecha a função lembrar dados
/**
* Verifica os dados dos cookies (caso eles existam)
*
* @access public
* @since ver1.0
* @uses Usuario::LogaUsuario()
*
* @return boolean - Os dados são válidos?
*/
function VerificaDadosLembrados(){
//Os cookies de "Lembrar minha senha" existem?
if (isset($_COOKIE[$this->PrefixoChaves . 'lu']) AND isset($_COOKIE[$this->PrefixoChaves . 'ls'])){
//Pega os valores salvos nos cookies removendo o digito de desencriptando
$usuario = base64_decode(substr($_COOKIE[$this->PrefixoChaves . 'lu'], 1));
$senha = base64_decode(substr($_COOKIE[$this->PrefixoChaves . 'ls'], 1));
//Tenta logar o usuário com os dados encontrados nos cookies
return $this->LogaUsuario($usuario, $senha, true);
}
//Não há nenhum cookie, dados inválidos
return false;
}//Fecha função VerificaDadosLembrados
/**
* Limpa os dados lembrados dos cookies ("Lembrar minha senha")
*
* @access public
* @since ver1.0
*
* @return void
*/
function LimpaDadosLembrados(){
//Deleta o cookie com o usuário
if (isset($_COOKIE[$this->PrefixoChaves . 'lu'])){
setcookie($this->PrefixoChaves . 'lu', false, (time() - 3600), $this->CookiePath);
unset($_COOKIE[$this->PrefixoChaves . 'lu']);if (isset($_COOKIE[$this->PrefixoChaves . 'ls'])){
sertcookie($this->PrefixoChaves . 'ls', false, (time() - 3600), $this->CookiePath);
unset($_COOKIE[$this->PrefixoChaves . 'ls']);Valida login:
<?php
//Inclui o arquivo com a classe de login e conexão com o banco de dados
include_once('../config.php');
include_once('../classes/usuarios.class.php');//Pega os dados vindos do formulário
$usuario = $_POST['usuario'];
$senha = $_POST['senha'];//Tenta logar o usuário com os dados
if ($userclass->LogaUsuario($usuario, $senha, $lembrar)){
//Usário logado com sucesso, redireciona ele para a página restrita
header("Location: pagina_restrita.php");
exit;echo "<strong>Erro: </strong>" . $userclass->Erro;Carregando comentários...