2016-07-17 2 views
1

Я пытаюсь сделать форму аутентификации с PHP и MySQL, но это не работает, и мне интересно, почему.authentification не работает

Есть ли кто-нибудь, кто может мне помочь? Я сделал хэш пароля в файле прецедента, но они не связаны. Этот независимый.

Спасибо!

<?php 

session_start(); 

function connect_db($host, $port, $db, $username, $password) 
{ 
    $pdo = new PDO("mysql:host=$host; port=$port; dbname=$db", $username, $password); 
    return $pdo; 
} 

if (isset($_POST["email"]) && isset($_POST["password"]) && !empty($_POST["email"]) && !empty($_POST["password"])) 
{ 
    $error_pass= ""; 
    $email = $_POST["email"]; 
    $password = $_POST["password"]; 

    try 
    { 
     $pdo = connect_db("localhost", 3306, "*******", "******", "*******"); 
     $sql = $pdo-> prepare("SELECT * FROM users WHERE email = :email AND password = :password"); 
     $sql->bindParam(':email', $email); 
     $sql->bindParam(':password', $password); 
     $sql->execute(); 
     $req = $sql->fetch(); 
     echo $req["password"] . "SALUT \n"; 
     var_dump($req["password"]); 
     if (password_verify($password, $req['password']) == 0) { 
      session_unset(); 
      $error_pass = "Incorrect email/password"; 
     } 

     else { 
      $_SESSION["name"] = $req["name"]; 
      header("Location: index.php", true, 302); 
     } 
    } 
    catch (PDOException $e) 
    { 
     echo $e->getMessage(); 
    } 

    if ($error_pass) { 
     echo $error_pass; 
    } 
} 

else { 
    echo "Some fields are missing"; 
} 
?> 
<!DOCTYPE html> 
<html> 
<body> 
    <form method="post" action ="login.php"> 
     <input type="text" name="email"> 
     <input type="text" name="password"> 
     <input type="submit" name="submit" value ="submit"> 
    </form> 
</body> 

</html> 
+0

bindParam должно быть с: так '$ sql-> bindParam (': электронная почта', $ электронная почта);' – Mihai

+0

Да жаль, что это ошибка, но это не решает мою проблему –

+0

наконечник безопасности: вы следует стараться избегать размещения ваших имен пользователей + паролей в Интернете. Кроме того, сделайте этот пароль более сильным, если это тот, который вы планируете использовать на производстве. – mpen

ответ

2

Удалить пароль из вашего запроса. Вам нужно найти пользователя только по электронной почте, а затем проверить правильность пароля.

$sql = $pdo-> prepare("SELECT * FROM users WHERE email = :email"); 
$sql->bindParam(':email', $email); 
$sql->execute(); 
$req = $sql->fetch(); 

// @todo :: check did you got any users 

if (password_verify($_POST["password"], $req['password'])) { 
    // password is valid 
} 
+1

Yup. Пароль в базе данных хэширован, поэтому версия без заголовка никогда не будет равна хешированной версии, поэтому '$ sql-> fetch();' вернет 0 строк. –