Php 正在验证datatabase中的用户名和密码
我这里有一段代码,当我输入它时返回“Username is not correct”,当它应该输出“error password”时,因为我只是输入了一个正确的用户名,但密码不正确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 *
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()
;这是没有意义的,尤其是因为在存储之前,您会将其散列。你为什么要重复这个问题?