AngularJS PHP MYSQL用户登录
问题描述:
我正在研究一个需要用户登录才能访问内容的Web应用程序。我是PHP新手,所以我试图弄清楚当我试图从数据库中检索信息时,我的代码是否有问题。AngularJS PHP MYSQL用户登录
<?php
include('./connection.php');
$loginInfo = json_decode(file_get_contents('php://input'));
$username = $loginInfo->username;
$password = password_hash($loginInfo->password, PASSWORD_DEFAULT);
$q = $db->prepare("SELECT * FROM userauth WHERE username=:username AND password=:password");
$q->bindParam(':username', $username, PDO::PARAM_STR);
$q->bindParam(':password', $password, PDO::PARAM_STR);
$q->execute();
$userRow=$q->fetch(PDO::FETCH_ASSOC);
if($userRow == true){
print 'success';
}else{
print 'error';
}
?>
下面是角的服务:
'use strict';
app.factory('loginSrv', function($http,$location){
return{
login:function(loginInfo, scope){
var $promise = $http.post('../app_back_end/app_endpoints/login.php', loginInfo);
$promise.then(function(msg){
if(msg.data == 'success'){
console.log('success login');
$location.path('/profile');
}
else {
console.log('error login');
scope.msgtxt = 'Want to try again? :)';
}
});
}
}
});
答
password_hash()
不会从相同的输入两次产生相同的结果。
所以,即使输入的密码与您最初输入的密码相同,但您不会得到相同的散列值。
这就是password_verify()
是为什么发明的,所以你的搜索只使用用户名,然后用password_verify()
来检查密码是一样的。
<?php
include('./connection.php');
$loginInfo = json_decode(file_get_contents('php://input'));
$username = $loginInfo->username;
$q = $db->prepare("SELECT * FROM userauth WHERE username=:username");
$q->bindParam(':username', $username, PDO::PARAM_STR);
$q->execute();
$userRow=$q->fetch(PDO::FETCH_ASSOC);
if(password_verify($loginInfo->password , $userRow['password'])){
print 'success';
}else{
print 'error';
}
?>
'$ userRow' return'associative array' not true !!阅读http://php.net/manual/en/pdostatement.fetch.php – Saty
'password_hash()'你在SELECT上使用了错误的函数,你需要使用'password_verify()'。 –
为什么比较$ userRow为true?你可以先尝试print_r()$ userRow来查看结果吗? –