2016-09-29 97 views
0

我正在研究一個需要用戶登錄才能訪問內容的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? :)'; 
      } 
     }); 
    } 
} 
}); 
+1

'$ userRow' return'associative array' not true !!閱讀http://php.net/manual/en/pdostatement.fetch.php – Saty

+0

'password_hash()'你在SELECT上使用了錯誤的函數,你需要使用'password_verify()'。 –

+0

爲什麼比較$ userRow爲true?你可以先嚐試print_r()$ userRow來查看結果嗎? –

回答

1

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'; 
} 
?>