Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Felipessz

Passando dados do usuario na $_Session com banco de dados

Recommended Posts

Olá galera tudo bom? Sou um apaixonado iniciante por essa linda linguagem que é o PHP.

Criei um sistema de login na qual possuo a seguinte estrutura de Banco de dados:

Tabela: Usuário

TABLE usuario(
    id int PRIMARY key AUTO_INCREMENT NOT NULL,
    nome varchar (100) NOT NULL,
    email varchar (50) NOT NULL,
    email_Confirmacao varchar (50) NOT NULL,
    data_Nascimento DATETIME NOT NULL,
	senha varchar (50) NOT NULL   
);
    

Possuo um script_login.php na qual faz toda a analise para ver se o usuário é válido e está logado a partir das caixa de textos da Form contida no arquivo login.php, daí executo o comando SQL PDO e mando-o para a tela de Idex (esta sendo efetuado normalmente a consulta) e caso haja erro exiba uma mensagem de erro (por enquanto):

<?php 
//Iniciando a Sessão
session_start();

//Conexao com o banco de dados
include_once "conexao.php";
$pdo=conectar();

//Recebe os dados
$login=$_POST["txinput1"];
$senha=$_POST["txinput2"];

//Inserção Segura - PREPARA O CADASTRO

//Comando SQL de verificação de autenticação
$validar=$pdo->prepare("SELECT * FROM usuario WHERE login='$login' AND senha='$senha'");

//coloca \ antes das aspas para evitar SQL Injection
if(get_magic_quotes_gpc() == 0){
    $login = addslashes($login);
    $senha = addslashes($senha);
}

//criptografamos a senha
$senha = md5($senha);

//executamos uma consulta no banco de dados
$validar->execute(array($login,$senha));

//Retorna o numeros de linha retornadas pela consulta
if($validar->rowCount()){

	//Armazeno duas informações na sessão do usuário: se ele está logado, e o login de acesso.
	$_SESSION["login"];
	$_SESSION["email"];	
	$_SESSION["nome"];
	header("Location:http://127.0.0.1/englishcourse/http/index.php");
	echo "Deu certo";
}else{
	echo "Deu erro";
}

?>

Por exemplo, no meu index estou conseguindo pegar apenas o "nome de usuário" do banco de dados e exibir normalmente, porém quando tento puxar as demais informações o campo fica em branco:

index.php

<?php
//Iniciando a sessão
session_start();

if((!isset ($_SESSION['login']) == true) and (!isset ($_SESSION['senha']) == true))
{
    unset($_SESSION['login']);
    unset($_SESSION['senha']);
    header('Location:http://127.0.0.1/englishcourse/http/login.php');
    }
$login = $_SESSION['login'];
$email = $_SESSION['email'];
​?>
<html>
<!DOCTYPE html> <html class="no-js" lang="pt-BR"> <head> </head> <body id="top"> <div class="row colorts3">
​ <div class="col-md-6 col-md-offset-3 txt-center colorts"> <?php echo "<h3>".$login."</h3>"; ?> </div>
​ </div>

<div class="row colorts2">
<div class="col-md-6 col-md-offset-3 txt-center colorts4">
<?php echo "<h5>". "Olá". $email ."</h5>"; //Não está exibindo nada, fica em branco
?>
</div> </div>
</body>
</html>


Obs: Editei meu código do index.php e seu HTML pois possuo um framework meu nele e ficaria bem grande a linha de código, deixei apenas as linha relevantes.

Por favor me dem uma ajuda.

Grato desde já e fiquem com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mostra a consulta do banco que você faz para pegar o resultado. você tá pegando o resultado como array?

Oi, então to usando o

$validar->execute(array($login,$senha));

Que na verdade é:

$validar=$pdo->prepare("SELECT * FROM usuario WHERE login='$login' AND senha='$senha'");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa. Então, faltou só um pouquinho de atenção. Neste trecho:

if($validar->rowCount()){

    //Armazeno duas informações na sessão do usuário: se ele está logado, e o login de acesso.
    $_SESSION["login"];
    $_SESSION["email"];    
    $_SESSION["nome"];
    header("Location:http://127.0.0.1/englishcourse/http/index.php");
    echo "Deu certo";
}else{
    echo "Deu erro";
}

Você precisa fazer o retorno dos dados... é preciso atribuir os valores que a query vai te retornar para às variáveis de sessão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa. Então, faltou só um pouquinho de atenção. Neste trecho:

if($validar->rowCount()){

    //Armazeno duas informações na sessão do usuário: se ele está logado, e o login de acesso.
    $_SESSION["login"];
    $_SESSION["email"];    
    $_SESSION["nome"];
    header("Location:http://127.0.0.1/englishcourse/http/index.php");
    echo "Deu certo";
}else{
    echo "Deu erro";
}

Você precisa fazer o retorno dos dados... é preciso atribuir os valores que a query vai te retornar para às variáveis de sessão.

Oi muito obrigado, poderia ser mais especifico por gentileza como ficaria por favor. Por exemplo se eu colocasse um fetch ali ja resolveria rs?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro tem um grande erro no código:

// Isto não existe!
$validar=$pdo->prepare("SELECT * FROM usuario WHERE login='$login' AND senha='$senha'");
$validar->execute(array($login,$senha));

O correto é o seguinte:

$validar = $pdo->prepare("SELECT * FROM usuario WHERE login = :login AND senha = :senha");
// Dê uma pesquisada a respeito de prepared statments (bindValue/bindParam)
$validar->bindValue(':login', $login, PDO::PARAM_STR);
$validar->bindValue(':senha', $senha, PDO::PARAM_STR);
$consulta = $validar->execute();

if($consulta){
   // Se retornar true, então existe registro
   $dados = $consulta->fetch(PDO::FETCH_OBJ);
   $_SESSION['nome'] = $dados->nome; // ->nome corresponde à coluna do banco de dados
}else{
   echo 'Usuário ou senha incorretos.';
}

Tá bem explicado, acho que tu consegue entender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basta utilizar o exemplo do colega. Faltou atenção minha também ao lhe alertar que sua query também está incorreta. Se for na forma com que você estava tentando fazer o correto seria o seguinte:

  //Inserção Segura - PREPARA O CADASTRO

//Comando SQL de verificação de autenticação
$validar=$pdo->prepare("SELECT * FROM usuario WHERE login=? AND senha=?");

//coloca \ antes das aspas para evitar SQL Injection
if(get_magic_quotes_gpc() == 0){
    $login = addslashes($login);
    $senha = addslashes($senha);
}

//executamos uma consulta no banco de dados
$validar->execute(array($login,md5($senha)));

Note que eu passei o MD5 da senha direto no execute.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro tem um grande erro no código:

// Isto não existe!
$validar=$pdo->prepare("SELECT * FROM usuario WHERE login='$login' AND senha='$senha'");
$validar->execute(array($login,$senha));

O correto é o seguinte:

$validar = $pdo->prepare("SELECT * FROM usuario WHERE login = :login AND senha = :senha");
// Dê uma pesquisada a respeito de prepared statments (bindValue/bindParam)
$validar->bindValue(':login', $login, PDO::PARAM_STR);
$validar->bindValue(':senha', $senha, PDO::PARAM_STR);
$consulta = $validar->execute();

if($consulta){
   // Se retornar true, então existe registro
   $dados = $consulta->fetch(PDO::FETCH_OBJ);
   $_SESSION['nome'] = $dados->nome; // ->nome corresponde à coluna do banco de dados
}else{
   echo 'Usuário ou senha incorretos.';
}

Tá bem explicado, acho que tu consegue entender.

Deixei meu login_script.php assim:

<?php
//Iniciando a Sessão
session_start();
//Conexao com o banco de dados
include_once "conexao.php";
$pdo=conectar();
//Recebe os dados
$login=$_POST["txinput1"];
$senha=$_POST["txinput2"];
//coloca \ antes das aspas para evitar SQL Injection
if(get_magic_quotes_gpc() == 0){
    $login = addslashes($login);
    $senha = addslashes($senha);
}
//Comando SQL de verificação de autenticação
$validar = $pdo->prepare("SELECT * FROM usuario WHERE login = :login AND senha = :senha");
$validar->bindValue(':login', $login, PDO::PARAM_STR);
$validar->bindValue(':senha', $senha, PDO::PARAM_STR);
$consulta = $validar->execute();
if($consulta){
   // Se retornar true, então existe registro
Linha 27 -   $dados = $consulta->fetch(PDO::FETCH_OBJ);
   $_SESSION['nome'] = $dados->nome; // ->nome corresponde à coluna do banco de dados
header("Location:http://127.0.0.1/englishcourse/http/index.php"); 
}else{
   echo 'Usuário ou senha incorretos.';
}
?>
e está dando esse erro:

Fatal error: Call to a member function fetch() on boolean in C:\Program Files (x86)\EasyPHP-Devserver-16.1\eds-www\englishcourse\http\script\login_script.php on line 27

No caso parece que esta resultando em False :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

<?php
$validar = $pdo->prepare("SELECT * FROM usuario WHERE login = :login AND senha = :senha");
$validar->bindValue(':login', $login, PDO::PARAM_STR);
$validar->bindValue(':senha', $senha, PDO::PARAM_STR);
if($validar->execute()){
   // Se retornar true cai aqui e quer dizer que existe registro
   $dados = $validar->fetch(PDO::FETCH_OBJ);
   $_SESSION['nome'] = $dados->nome; // ->nome corresponde à coluna do banco de dados
header("Location:http://127.0.0.1/englishcourse/http/index.php"); 
}else{
   echo 'Usuário ou senha incorretos.';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

<?php
$validar = $pdo->prepare("SELECT * FROM usuario WHERE login = :login AND senha = :senha");
$validar->bindValue(':login', $login, PDO::PARAM_STR);
$validar->bindValue(':senha', $senha, PDO::PARAM_STR);
if($validar->execute()){
   // Se retornar true cai aqui e quer dizer que existe registro
   $dados = $validar->fetch(PDO::FETCH_OBJ);
   $_SESSION['nome'] = $dados->nome; // ->nome corresponde à coluna do banco de dados
header("Location:http://127.0.0.1/englishcourse/http/index.php"); 
}else{
   echo 'Usuário ou senha incorretos.';
}

Muito obrigado primeiramente pela paciência rs, mas ainda não estou conseguindo puxar os dados. Deixei assim, como exemplo optei deixar o $_SESSION["login"]=$login e $_SESSION["email"]=$email só para testar e somente o login estou conseguindo exibir nas paginas:

<?php 
//Iniciando a Sessão
session_start();

//Conexao com o banco de dados
include_once "conexao.php";
$pdo=conectar();

//Recebe os dados
$login=$_POST["txinput1"];
$senha=$_POST["txinput2"];
//Inserção Segura - PREPARA O CADASTRO

//Comando SQL de verificação de autenticação
$validar=$pdo->prepare("SELECT * FROM usuario WHERE login=':login' AND senha=':senha'");
$validar->bindValue(':login', $login, PDO::PARAM_STR);
$validar->bindValue(':senha', $senha, PDO::PARAM_STR);

if($validar->execute()){
	$dados = $validar->fetch(PDO::FETCH_OBJ);
   $_SESSION['nome'] = $dados->nome; 
	//Armazeno duas informações na sessão do usuário: se ele está logado, e o login de acesso.
	$_SESSION["login"]=$login;
	$_SESSION["email"]=$email;
	$_SESSION["nome"]=$nome;
	header("Location:http://127.0.0.1/englishcourse/http/index.php");
	echo "Deu certo";
}else{
	echo"Deu erro";
}
?>

Agora por exemplo, em cada pagina caso eu queira exibir os dados de $_SESSION['nome'] = $dados->nome como devo chamar no inicio do código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo eu recomendo você primeiro dar uma estudada e entender o conceito de um sistema de login, pois você está pecando em algo muito básico mesmo. Recomendo a leitura:

http://blog.ultimatephp.com.br/sistema-de-login-php/

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.