Help with login system [duplicate]

1

I'm setting up a login system. But I can not validate the password you entered.

When I try in this way it accuses the wrong login / password. But I already made sure, the login and password are correct:

<?php

require_once 'init.php';

// resgata dados digitados no formulario
$email = isset($_POST['email']) ? $_POST['email']: '';
$senha = isset($_POST['senha']) ? $_POST['senha']: '';

// Verifica se os campos do form nao estao vazios
if(empty($email) || empty($senha)){
    echo "<script language='javascript' type='text/javascript'>alert('Infome Email e senha.');window.location.href='../login.php';</script>";
    exit;
}

// Comando no banco de dados
$pdo = db_connect();    // Abre conexão com o banco

$sql = "SELECT id, nome FROM usuarios WHERE email = :email AND senha = :senha";
// Cria query

$stmt = $pdo->prepare($sql);    // Prepare da query

$stmt->bindValue(':email', $email);
$stmt->bindValue(':senha', $senha);
// Atribui valor do campo email no valor email da query

$stmt->execute();   // Execute na query

$arr = $stmt->fetchAll(PDO::FETCH_ASSOC);   // Cria array associativo

if(count($arr) <= 0) {  // Verifica se a busca trouxe retorno
    echo "<script language='javascript' type='text/javascript'>alert('Login e/ou senha inválido!');window.location.href='../login.php';</script>";
    exit;
}

    // Pega o primeiro usuario
    $user = $arr[0];

    // Inicia a sessão
    session_start();

    // Definir os dados persistindo entre paginas
    $_SESSION['logged_in'] = true;
    $_SESSION['user_id'] = $user['id'];
    $_SESSION['user_name'] = $user['nome'];

    header('Location: ../index.php');

When I give var_dump($arr); it returns an empty array, so it does not login.

Could anyone help me?

Thank you!

======= DEBUG =======

Current code: link

Email: [email protected] | Password: 123456

Right user, wrong password: Result: Accuse wrong password

Right user, right password: Result: Accuse wrong password too

Wrong user, right password: Result: Accuses user not found

Wrong user, wrong password: Result: Accuses user not found too

With correct username and password, using var_dump ($ password) and var_dump ($ arr [0] ['password'])

Nowwiththelineif(!password_verify($senha,$arr[0]['senha'])){beforewaswithout!

    
asked by anonymous 09.01.2017 / 20:57

1 answer

0

Editing

<?php
require_once 'init.php';

// Dados do formulário
$email = $_POST['email'];
$senha = $_POST['senha'];

// Verifica se os campos estão vazios: usuário OU senha
if (empty($email) OR empty($senha)) {
    // Se sim, mostra mensagem e redireciona o usuário para a página de login
    echo 'Preencha os campos';
    header('Location: ../index.php');
}

// Cria objeto PDO: conexão com o banco de dados
$pdo = db_connect();

$sql = "select id, nome, senha from usuarios where email = :email";

$stmt = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));

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

$stmt->execute();

// Conta o número de linhas retornadas
$contar = $stmt->rowCount();

// Verifica se existe apenas um registro com o login informado: login unico
if ($contar == 1) {
    // Se sim, retorna os dados do banco de dados
    $arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
    // Compara o hash de senha do banco de dados, com o hash da senha informada pelo usuário
    if (password_verify($senha, $arr[0]['senha'])) {
        echo 'Bem-vindo ao sistema...';
    } else {
        echo 'Senha errada';
    }
} else {
    echo 'Usuário não encontrado';
}

Checks if the password is encrypted in the database (hash of the password) and what algorithm (sha1, md5 etc) and compare the hashes if it is the case:

$hashDaSenha = password_hash($_POST['senha'], PASSWORD_DEFAULT);

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

If this is not the case, try using rowCount () instead of count () ;

// Usando PDO::rowCount()

if($stmt->rowCount() <= 0) { 
    echo "<script language='javascript' type='text/javascript'>alert('Login e/ou senha inválido!');window.location.href='../login.php';</script>";
    exit;
}

Do not prepare (), use the following:

$stmt = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); 
    
09.01.2017 / 21:28