Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正在验证datatabase中的用户名和密码_Php_Pdo - Fatal编程技术网

Php 正在验证datatabase中的用户名和密码

Php 正在验证datatabase中的用户名和密码,php,pdo,Php,Pdo,我这里有一段代码,当我输入它时返回“Username is not correct”,当它应该输出“error password”时,因为我只是输入了一个正确的用户名,但密码不正确 if ($_POST['login']) { $username = strip_tags($_POST['username']); $password = strip_tags($_POST['password']); $fetchme = $dbc->query('SELECT *

我这里有一段代码,当我输入它时返回“Username is not correct”,当它应该输出“error password”时,因为我只是输入了一个正确的用户名,但密码不正确

if ($_POST['login']) {
    $username = strip_tags($_POST['username']);
    $password = strip_tags($_POST['password']);
    $fetchme = $dbc->query('SELECT * FROM users WHERE username="$username"');
    while($row = $fetchme->fetch(PDO::FETCH_ASSOC)) {
        $lastlogin = $row['lastlogin'];
    }
    if (!$username||!$password) {
        echo '<center>Please enter a valid username and password</center>';
    }else{
        $login = $dbc->query('SELECT * FROM users WHERE username="$username"');
        $num_rows_login = ($login->fetchColumn() > 0) ? true : false;
        if ($num_rows_login == 0) {
            echo "<center>Username doesn't exist</center>";
        }else{
            while($login_row = $login->fetch(PDO::FETCH_ASSOC)) {
                $password_db = $login_row['password'];
                $password_db2 = hash('sha512', $password);
                if ($password_db2 != $password_db) {
                    echo '<center>Incorrect password</center>';
                }
            }
        }    
    }
}
if($\u POST['login'])){
$username=strip_标签($_POST['username']);
$password=strip_标签($_POST['password']);
$fetchme=$dbc->query('SELECT*FROM username=“$username””);
而($row=$fetchme->fetch(PDO::fetch_ASSOC)){
$lastlogin=$row['lastlogin'];
}
如果(!$username | |!$password){
echo“请输入有效的用户名和密码”;
}否则{
$login=$dbc->query('SELECT*FROM username=“$username””);
$num\u rows\u login=($login->fetchColumn()>0)?true:false;
如果($num\u rows\u login==0){
echo“用户名不存在”;
}否则{
而($login\u row=$login->fetch(PDO::fetch\u ASSOC)){
$password_db=$login_行['password'];
$password_db2=hash('sha512',$password);
if($password\u db2!=$password\u db){
回显“密码不正确”;
}
}
}    
}
}

这是我第一次使用PDO。感谢您的帮助

首先,不要在用户名或密码上使用
带标签();它们没有任何用途,您应该在SQL中正确地转义它们(或使用准备好的语句)

其次,您可以假设从
users
表返回最多一行,因此您实际上不需要
while
来获取所有记录

第三,不要区分不存在的用户名和无效密码;它们都应该产生相同的消息“无效的用户名或密码”

下面是一个快速重写:

$stmt = $dbc->prepare('SELECT * FROM users WHERE username=?');
$stmt->execute(array($username));
// fetch all records and take first one (returns false in case of no rows)
$user = current($stmt->fetchAll(PDO::FETCH_ASSOC));
// validate record
if ($user === false || hash('sha512', $password) !== $user['password']) {
    echo '<center>Invalid username or password</center>';
} else {
    echo 'yay, you are the man';
}
$stmt=$dbc->prepare('SELECT*FROM username=?'的用户);
$stmt->execute(数组($username));
//获取所有记录并获取第一条记录(如果没有行,则返回false)
$user=current($stmt->fetchAll(PDO::FETCH_ASSOC));
//验证记录
if($user==false | | hash('sha512',$password)!==user['password'])){
回显“无效用户名或密码”;
}否则{
echo‘耶,你就是那个男人’;
}
最后,为了更好地进行密码散列,请阅读以下内容:


您的SQL语法错误。您应该会收到一条错误消息。如果您正在使用PDO,也要使用准备好的语句。不要在密码上做
strip_tags()
;这是没有意义的,尤其是因为在存储之前,您会将其散列。你为什么要重复这个问题?