Ir para conteúdo
Gabrielvt14

[Resolvido] Ajuda com sistema de login usando PDO statement - Array retornando vazio

Recommended Posts

Olá pessoal, estou com problemas para criar um simples sistema de login usando PDO statement.

É um sistema de login bem simples, não utilizei nem criptografia nas senhas.

Quando executo o código, trago as informações do banco em forma de array utilizando fetchAll(PDO::FETCH_ASSOC);

Mas o array retorna vazio, e os dados inseridos no formulário existem no banco de dados.

 

Arquivo login.php:

<?php

	require_once 'Banco.php';

	$email = isset($_POST['email']) ? $_POST['email']: '';
	$senha = isset($_POST['senha']) ? $_POST['senha']: '';

	$pdo = conecta();

	$sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";

	$stmt = $pdo->prepare($sql);
	
	$stmt->bindValue(':email', $email);
	$stmt->bindValue(':senha', $senha);

	$stmt->execute();

	$array = $stmt->fetchAll(PDO::FETCH_ASSOC);

	if(count($array) <= 0){
		echo 'Acesso liberado';
		var_dump($array);
	}else{
		echo 'Usuario ou senha incorretos';
	}

Desde já agradeço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use rowCount para verificar quantas linhas está retornando do BD... Também verifique se não está retornando algum erro na query com errorInfo.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

12 minutos atrás, ESerra disse:

Use rowCount para verificar quantas linhas está retornando do BD... Também verifique se não está retornando algum erro na query com errorInfo.

 

Fiz as alterações ditas, mas continua retornando array vazio. O código ficou da seguinte forma:

 

<?php

	require_once 'Banco.php';

	$email = isset($_POST['email']) ? $_POST['email']: '';
	$senha = isset($_POST['senha']) ? $_POST['senha']: '';

	$pdo = conecta();

	$sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";

	$stmt = $pdo->prepare($sql);
	
	$stmt->bindValue(':email', $email);
	$stmt->bindValue(':senha', $senha);

	$stmt->execute();

	$array = $stmt->fetchAll(PDO::FETCH_ASSOC);

	if($stmt->rowCount($array) <= 0){
		echo 'Acesso liberado';
		var_dump($array);
	}else{
		echo 'Usuario ou senha incorretos';
	}

	echo '<pre>';
	$err = $stmt->errorInfo();
	print_r($err);

errorInfo() me retornou o seguinte:

Array
(
    [0] => 00000
    [1] => 
    [2] => 
)

 

Talvez eu tenha usado o errorInfo() de maneira errada, porque nunca o tinha utilizado, se errei, peço que me corrija.

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 minutos atrás, ESerra disse:

$stmt->rowCount()

o errorInfo é aquilo ali mesmo.

 

Arrumei de 

$stmt->rowCount($array)

para

$stmt->rowCount()

e me retornou a query

object(PDOStatement)[2]
  public 'queryString'    (length=62)

Era isso mesmo que tinha que retornar?

"

Compartilhar este post


Link para o post
Compartilhar em outros sites

rowCount deve retornar o número de linhas que a query tem.

 

<?php

	require_once 'Banco.php';

	$email = isset($_POST['email']) ? $_POST['email']: '';
	$senha = isset($_POST['senha']) ? $_POST['senha']: '';

	$pdo = conecta();

	$sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";

	$stmt = $pdo->prepare($sql);
	
	$stmt->bindValue(':email', $email);
	$stmt->bindValue(':senha', $senha);

	$stmt->execute();

	echo 'qtd de linhas '.$stmt->rowCount();

	if($stmt->rowCount() > 0){
		echo 'Acesso liberado';
      $array = $stmt->fetchAll(PDO::FETCH_ASSOC);
		var_dump($array);
	}else{
		echo 'Usuario ou senha incorretos';
	}

	echo '<pre>';
	$err = $stmt->errorInfo();
	print_r($err);
  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 minutos atrás, ESerra disse:

rowCount deve retornar o número de linhas que a query tem.

 


<?php

	require_once 'Banco.php';

	$email = isset($_POST['email']) ? $_POST['email']: '';
	$senha = isset($_POST['senha']) ? $_POST['senha']: '';

	$pdo = conecta();

	$sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";

	$stmt = $pdo->prepare($sql);
	
	$stmt->bindValue(':email', $email);
	$stmt->bindValue(':senha', $senha);

	$stmt->execute();

	echo 'qtd de linhas '.$stmt->rowCount();

	if($stmt->rowCount() > 0){
		echo 'Acesso liberado';
      $array = $stmt->fetchAll(PDO::FETCH_ASSOC);
		var_dump($array);
	}else{
		echo 'Usuario ou senha incorretos';
	}

	echo '<pre>';
	$err = $stmt->errorInfo();
	print_r($err);

Inseri as linhas que citou. No echo qtde linhas ele retorna 0.

:/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem a possibilidade de realmente ser 0.

 

Eu partiria para uma 'força' bruta...

 

Verifica se está consultando e trazendo algo:

<?php


$pdo = conecta();

// $sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";
$sql = "SELECT * FROM usuarios";

$stmt = $pdo->prepare($sql);

// $stmt->bindValue(':email', $email);
// $stmt->bindValue(':senha', $senha);

$stmt->execute();

$usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($usuarios);
die();

 

Verifica a conexão, verifica via MYSQL (Cliente: cli, phpmyadmin, MySQL Workbench, adminer, SQLyog) enfim se realmente tem algum registro na tabela usuários.

 

@Dica:

Verificou se os parâmetros estão chegando?

 

<?php
print_r($_POST);

 

 

@Dica2:
Tem uma classe que tranfromar query simples e ajuda no debug:

https://github.com/panique/pdo-debug

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
22 minutos atrás, gabrieldarezzo disse:

Tem a possibilidade de realmente ser 0.

 

Eu partiria para uma 'força' bruta...

 

Verifica se está consultando e trazendo algo:


<?php


$pdo = conecta();

// $sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";
$sql = "SELECT * FROM usuarios";

$stmt = $pdo->prepare($sql);

// $stmt->bindValue(':email', $email);
// $stmt->bindValue(':senha', $senha);

$stmt->execute();

$usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($usuarios);
die();

 

Verifica a conexão, verifica via MYSQL (Cliente: cli, phpmyadmin, MySQL Workbench, adminer, SQLyog) enfim se realmente tem algum registro na tabela usuários.

 

@Dica:

Verificou se os parâmetros estão chegando?

 


<?php
print_r($_POST);

 

 

@Dica2:
Tem uma classe que tranfromar query simples e ajuda no debug:

https://github.com/panique/pdo-debug

Dando o print_r no fetchAll, como descreveu acima, ele retorna o array:

Array
(
    [0] => Array
        (
            [email] => admin@admin.com
            [senha] => 123456
        )

)

Mas quando adiciono "WHERE email = :email AND senha = :senha" na query e adiciono os bindValue ele retorna o array vazio novamente.

 

E ja tinha verificado o POST. Os valores digitados no formulário estão chegando sim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentar forçar via hardcode:

 

<?php

$pdo = conecta();

$sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";
//$sql = "SELECT * FROM usuarios";

$stmt = $pdo->prepare($sql);


$email = 'admin@admin.com';
$senha = '123456';

$stmt->bindValue(':email', $email);
$stmt->bindValue(':senha', $senha);

$stmt->execute();

$usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($usuarios);
die();
    

Obs:

se tentar assim:


$stmt->bindValue(':email', 'PARAMETRO_DIRETO');

Ele (PDO) vai reclamar hehe

 

Edit/Update:

Força o 'String'

$sth->bindValue(':email', $email, PDO::PARAM_STR);

 

As vezes está alguma coisa definindo int na classe de conexão ^^


 

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 minutos atrás, gabrieldarezzo disse:

Tentar forçar via hardcode:

 


<?php

$pdo = conecta();

$sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";
//$sql = "SELECT * FROM usuarios";

$stmt = $pdo->prepare($sql);


$email = 'admin@admin.com';
$senha = '123456';

$stmt->bindValue(':email', $email);
$stmt->bindValue(':senha', $senha);

$stmt->execute();

$usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($usuarios);
die();
    

Obs:

se tentar assim:


$stmt->bindValue(':email', 'PARAMETRO_DIRETO');

Ele (PDO) vai reclamar hehe

 

Edit/Update:

Força o 'String'

$sth->bindValue(':email', $email, PDO::PARAM_STR);

 

As vezes está alguma coisa definindo int na classe de conexão ^^


 

Tentei via hardcoded e funcionou, retornou o array com os valores digitados.

Tentei usar PDO::PARAM_STR no bindValue, mas com os dados do banco, sem usar hardcoded, e retornou o array vazio novamente :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu realmente não sei.

 

De qlq forma isolamos o problema.

 

Ele está em algum lugar aqui:

require_once 'Banco.php';

$email = isset($_POST['email']) ? $_POST['email']: '';
$senha = isset($_POST['senha']) ? $_POST['senha']: '';

$pdo = conecta();

tenta executar a query e exibir os parametros recebidos.

 

Confirma se no formulario tem o method esperado (no seu caso POST):

<form action="" method="POST"></form>

Reveja os inputs name=""

 

Fora isso só batendo cabeça msm hehe.

 

Alguma dica que eu deixei passar  @ESerra ?

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
22 minutos atrás, gabrieldarezzo disse:

Eu realmente não sei.

 

De qlq forma isolamos o problema.

 

Ele está em algum lugar aqui:


require_once 'Banco.php';

$email = isset($_POST['email']) ? $_POST['email']: '';
$senha = isset($_POST['senha']) ? $_POST['senha']: '';

$pdo = conecta();

tenta executar a query e exibir os parametros recebidos.

 

Confirma se no formulario tem o method esperado (no seu caso POST):


<form action="" method="POST"></form>

Reveja os inputs name=""

 

Fora isso só batendo cabeça msm hehe.

 

Alguma dica que eu deixei passar  @ESerra ?

Agora foi. O fetchAll estava dentro do if. Eu joguei ele para fora do if (Sem pensar em lógica, foi uma medida desesperada kkk) e o rowCount trouxe um resultado do banco quando digito email e senha corretos e retorna 0 quando digito email e senha incorretos.

 

Muito obrigado mesmo @gabrieldarezzo e @ESerra, me ajudaram muito!   \o/

 

Agora, Gabrielvt14 disse:

Agora foi. O fetchAll estava dentro do if. Eu joguei ele para fora do if (Sem pensar em lógica, foi uma medida desesperada kkk) e o rowCount trouxe um resultado do banco quando digito email e senha corretos e retorna 0 quando digito email e senha incorretos.

 

Muito obrigado mesmo @gabrieldarezzo e @ESerra, me ajudaram muito!   \o/

 

Código ficou assim:

<?php

	require_once 'Banco.php';

	$email = isset($_POST['email']) ? $_POST['email']: '';
	$senha = isset($_POST['senha']) ? $_POST['senha']: '';

	$pdo = conecta();

	$sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha";

	$stmt = $pdo->prepare($sql);
	
	$stmt->bindValue(':email', $email, PDO::PARAM_STR);
	$stmt->bindValue(':senha', $senha, PDO::PARAM_STR);

	$stmt->execute();

		echo 'qtde linhas: ' . $stmt->rowCount();
		$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
	

	if($stmt->rowCount() <= 0){
		echo 'Acesso negado';
	}else{
		echo 'Acesso liberado';
	}

/*	echo '<pre>';
	$err = $stmt->errorInfo();
	print_r($err);
*/

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por violin101
      Caros amigos
       
      Gostaria de tirar uma dúvida com os amigos.
       
      No Codeiginter tem como visualizar um arquivo .PDF dentro do sistema ?
       
      Por exemplo:
             o usuário realizou um download do arquivo --> DadosEmpresa.pdf
       
      Quando clicar em cima do arquivo, tem como visualizar em uma página o arquivo ?   E como faria ?
       
      Grato,
       
      Cesar
    • Por Ivana_Silva
      Olá a todos que estão lendo!
       
      Preciso de uma função PHP que filtre 2 padrões de campos a partir do caractere barra(|), preservando a linha.
       
      Em uma caixa de texto vou colar valores assim:
      0001|qwerty
      0002|091234
      0003|09164867
      0004|ab12312
      ...
      A caixa de texto:
      <form id="form" name="form" method="post" action=""> <textarea name="lista" type="text" id="lista" cols="48" rows="5" size="600" /></textarea> <br /> <br /> <button type="submit">Separar</button> </form> <?php ?> Quando eu clicar no botão Separar, preciso que o código filtre e mostre apenas as linhas que, após barra " | " possuam números inteiros de 6 e 8 dígitos(sem letras, símbolos ou pontos).
       
      Exemplo:
      Dados colados na caixa de texto:
      0001|qwerty
      0002|091234
      0003|09164867
      0004|ab12312
       
      Dados filtrados após clicar no botão Separar:
      0002|091234
      0003|09164867
       
      Filtrou apenas os campos que após a barra "|" possuem 6 e 8 dígitos(Nem mais nem menos), não é pra filtrar campos com letras ou números e letras, se tiver letra após a barra já descarta... É pra Filtrar e mostrar apenas as linhas que possuem 6 e 8 dígitos após a barra.
      Agradecida se alguém puder ajudar!
       
    • Por RSN
      Boa Noite, 
      Gostaria de saber se existe a possibilidade de gravar além do id do option value outra variavel, para enviar via post.
      <div class="form-group"> <label class="col-md-4 control-label" for="txtgrupo">Tipo de Pagamento : </label> <div class="col-md-4"> <select id="" class="selectpicker" data-live-search="true" name="tipo_pagamento" > <?php $query = mysql_query("SELECT * FROM tipo_pagamento ORDER BY id ASC"); while($result = mysql_fetch_array($query)) { echo '<option value="'.$result["id"].'">'.$result["nome_tipo"].'</option>'; } ?> </select> </div> </div>  
    • Por JeanTDZ
      Eu tenho um form com algumas informações etc. O form envia pro banco de dados e tudo mais, funcional.
       
      Alguém teria algum exemplo que após o submit, o form é transformado em pdf/doc e direcionado para uma pasta/ftp já criada.?
    • Por Rafael Ferreira_163968
      Boa noite amigos, armazeno em um mysql senhas geradas pelo seguinte codigo:
       
      $name = "name"; $email = "email"; $password = "pass"; $string = mcrypt_create_iv (24, MCRYPT_DEV_URANDOM); $salt = strtoupper(bin2hex ($string)); $hash = hash_pbkdf2 ("sha1", $password, $string, 1000, 24, true); $hash = strtoupper(bin2hex ($hash)); //finalmente execute a seguinte consulta: $qrCreate = "INSERT INTO tc_users (name, email, hashedpassword, salt) VALUES ('$name', '$email', '$hash', '$salt')"; $stCreate = mysql_query($qrCreate) or die ('Erro ao cadastrar em '.$tabela.' '.mysql_error()); esse codigo insere um hash e salt unico nos campos, por mais que insira a mesma senha em outro usuario o hash e salt serao diferentes.
       ai vem a duvida, como eu faço para comparar a senha texto digitada pelo usuario com os dados inseridos no BD, por exemplo,
      se eu fizer a seguinte comparacao:
      $readTeste = read('tc_users',"WHERE id = '2'"); foreach ($readTeste as $teste); $pass = $teste['hashedpassword']; if (password_verify('pass', $pass)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } so me retorna invalido. function read esta funcionando, se eu printar o resultado da hashedpassword ele retorna os dados do banco ok. minha duvida e como comparar a senha texto com o banco, se é com o hash ou com o salt ou com os dois junto e como. desde ja obrigado
×

Informação importante

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