Php 为什么不是';登录时是否进行mysql查询匹配?

Php 为什么不是';登录时是否进行mysql查询匹配?,php,mysql,login,hash,Php,Mysql,Login,Hash,我不明白为什么在激活后尝试登录时密码不匹配。为了便于查看,我删减了下面粘贴的代码 以下是相关的注册代码: $salt = substr(sha1(uniqid(rand(),true)),0,20); $password_db = hash('sha256', $salt.$password1); $sqlinfo = mysql_query("INSERT INTO db_1 (email, password, salt) VALUES('$email1','$password_db','$

我不明白为什么在激活后尝试登录时密码不匹配。为了便于查看,我删减了下面粘贴的代码

以下是相关的注册代码:

$salt = substr(sha1(uniqid(rand(),true)),0,20);
$password_db = hash('sha256', $salt.$password1);

$sqlinfo = mysql_query("INSERT INTO db_1 (email, password, salt)
VALUES('$email1','$password_db','$salt')") or die(mysql_error());
以下是登录的相关代码:

$email = $_POST['email'];
$password = $_POST['password'];

$sqlinfo = mysql_query("SELECT * FROM db_1 WHERE email='$email' AND emailactiv='1'"); 

if($sqlinfo['password'] == hash('sha256', $sqlinfo['salt'].$password)){
    while($row = mysql_fetch_array($sqlinfo)){
    ... }
    else { ...
到目前为止,我已经做了几次迭代,但都没有结果。如有任何见解,将不胜感激

$email = $_POST['email'];
$password = $_POST['password'];

$sqlinfo = mysql_query("SELECT * FROM db_1 WHERE email='$email' AND emailactiv='1'"); 

//You need to first fetch data before using it.
while($result = mysql_fetch_array($sqlinfo)) {

    //Now you can use the data
    if($result['password'] == hash('sha256', $result['salt'].$password)){
         //matched... login correct
    } else {
         //not matched.. invalid login
    }
}
...
希望这是不言自明的。 你错过了一条非常重要的线路

顺便说一句,停止使用mysql_*函数,因为它们已被弃用,请使用PDO或mysqli_*


编辑:请现在再试。我认为它只能保存一个值(用于登录)

您的代码目前易受SQL注入攻击。一个建议是使用重新格式化代码

PDO示例:

<?php

$stmt = $dbh->prepare("SELECT * FROM db_1 WHERE email = ? AND emailactiv=? ");
$stmt->bindParam(1, $email);
$stmt->bindParam(2, 1);

$stmt->execute();

?>
并在您的
IF
语句中使用
$rowHere

您需要使用

另外,
mysql.*
函数也不推荐使用。使用或代替

您需要“清理输入”(一个常见短语),以避免SQL注入,使用or


根据问题的注释查看链接。

+
var\u dump($sqlinfo)
为什么你要使用while循环来检查密码是否匹配,为什么不使用
和password='“$password”扩展你的
WHERE
。”
让我向你介绍我的一个朋友@zeshin。你的代码容易受到SQL注入的攻击。请阅读上面的BBBY表,如果你不想被黑客攻击。(虽然使用一个大的随机盐是一个好的开始,SHA很容易受到蛮力攻击,因为它太快了。虽然我会考虑到SQL注入漏洞的次要…最好/最简单的是使用一个良好的审查现有的AuthSt.)如果查询有多个结果,则此操作不起作用,它仅在第一行包含密码时起作用。除非电子邮件列是唯一的。。。
$rowHere = mysql_fetch_row($sqlinfo);