2015-05-05 26 views
0

我目前正在创建一个网站,用户可以登录到一个账户。为此,我需要检查用户提交的电子邮件和密码是否与MySQL数据库中的相同。如何检查变量是否具有与提取相同的值()

这是我的代码;

<h2> Log in to an existing account </h2> 
<form action = "account.php" method = "POST" id = "log"> 
    <p><label> Email </label> <input type = "text" name = "logmail" ></p> 
    <p><label> Password </label> <input type = "password" name = "logpass"></p> 
    <p><input type = "submit" value = "Log in"></p> 

if(!empty($_POST['logmail']) && !empty($_POST['logpass'])) 
{ 
    $sql = ("SELECT customer_mail FROM customer_user WHERE customer_mail = '{$_POST['logmail']}'"); 
    $sql2 = ("SELECT customer_pass FROM customer_user WHERE customer_pass = '{$_POST['logpass']}'"); 

    $stmt = $dbh->prepare($sql); 
    $stmt2 = $dbh->prepare($sql2); 

    $stmt->execute(); 
    $stmt2->execute(); 

    var_dump($stmt->fetch()); 
    var_dump($_POST['logmail']); 
    var_dump($stmt2->fetch()); 
    var_dump($_POST['logpass']); 

    if($stmt->fetch()[0] == $_POST['logmail']) 
    {  
     if($stmt->fetch()[0] == $_POST['logpass']) 
     { 
      echo "Logged in"; 
     } 
     else 
     { 
      echo "Wrong password"; 
     } 
    } 
    else 
    { 
     ?> <h2> Wrong email </h2> <?php 
    } 
} 

当我尝试运行此,该var_dumps给了我一个阵列stmt-> fetch()方法和stmt2->取。这些阵列的位置0是我尝试登录的帐户的电子邮件和密码。它们也与我在表单中的字段中键入的内容相同。 $ _POST的var_dumps证实了这一点。

但即使认为它们完全相同,它也不会触发If语句。

有谁知道这可能是为什么?

+2

为什么不只是有一个SQL查询在一个请求中返回两个值?数据库查询的执行时间很昂贵,所以不要做不必要的查询 –

+0

关闭你的HTML表单 –

+0

你不应该有错误的电子邮件/错误的密码不同的错误信息,否则你将信息给淘气的hackery-键入人物 –

回答

1

为什么不是fetchColumn()fetchColumn将默认返回下一行的第一列,而不是返回整行。

我没有意识到你之前在同一张桌子上。对于登录表单,我认为你应该做一些改变。

  1. 你应该为每个用户散列一个唯一盐的密码。你不应该在你的数据库中存储纯文本密码。

  2. 你真的只需要一个查询:

    $sql = ("SELECT customer_pass FROM customer_user WHERE customer_mail = ?"); 
    

    然后你就可以比较的密码(希望散列)

+0

这是Aviz从我的理解中得出答案的基础。关键因素是查询组合成一个查询。所有其他关于密码安全的警告我同意,但这不是问题的具体焦点。 – gview

1

使用一个SQL查询

$sql = ("SELECT customer_pass FROM customer_user WHERE customer_mail = ?"); 
$stm = $dbh->prepare($sql); 
$stm->setFetchMode(PDO::FETCH_ASSOC); 
$stm->execute($_POST['logmail']); 
if ($stm && $stm->rowCount() == 1) { 
    $result = $stm->fetch(); 
    if ($result['customer_pass'] === $_POST['logmail']) { 
     // Login 
    } else { 
     echo 'Wrong Password'; 
    } 
} else { 
    echo 'Email does not exist'; 
} 

下一次养成使用注册和登录时加密密码的习惯SHA256和盐。

+0

这是最好的答案,但请参阅@Mark Ba​​ker关于错误消息的评论。不要泄露信息 - 这两个错误消息应该是:“无法登录,请检查帐户名称和密码” – gview

+0

另外,SHA不加密,这是一个散列。 会推荐使用[PHP的内置密码API](http://php.net/password)。 –

+0

我假设他不知道哈希 – Aviz

相关问题