Я проходил методы password_hash()
и password_verify()
в PHP, и я пытался включить это в свой код. Я не могу заставить его работать, я прошел серию поисковых запросов и даже некоторые из вопросов здесь, но они, похоже, не решают проблему.
Моя длина столбца в базе данных – 255. Когда я пытаюсь запустить код, я получаю сообщение $loginerror
. Вот мой кодовый блок. Пожалуйста, что я делаю неправильно.
$signin_email=$_POST['signin_email']; $signin_password=$_POST['signin_password']; if($valid){ require_once 'scripts/connect_to_mysql.php'; $sql = "SELECT First_name, Last_name,Password FROM customer WHERE Email=? AND Password=? LIMIT 1"; $stmt=$conn->prepare($sql);//preparing the statement if(!$stmt){ echo "Unable to prepare: ".$conn->errno. " " .$conn->error; } //executing the statement //$date=date('dm Y h:i:s'); if(!$stmt->bind_param('ss', $signin_email, $signin_password)){//bind parameters to sql statement. i=integer, s=string, b=blob, d=double echo "Binding parameters failed: ".$stmt->errno. " " . $stmt->error; } if(!$stmt->execute()){//executing the statement echo "Statement Execution failed: ". $stmt->error; } if(!$stmt->bind_result($dbfirstname,$dblastname,$dbpassword)){// used to bind variables to a prepared statement for result storage echo "Unable to bind results to variables: ".$stmt->error; } $stmt->store_result(); //echo $stmt->num_rows; echo $dbpassword; if(password_verify($signin_password, $dbpassword)){ if($stmt->num_rows===1){//to check if username and password actually exists while($row=$stmt->fetch()){ $user=$dbfirstname. " ". $dblastname; echo $user; } /*$_SESSION['user']=$user; header('location:logintest.php'); exit();*/ } } else{ //$error="Invalid Email address/Password. Please try again"; $loginerror= "Invalid Email address/Password. Please try again"; } $stmt->close();//closing the prepared statement $conn->close();//closing the connection }
в$signin_email=$_POST['signin_email']; $signin_password=$_POST['signin_password']; if($valid){ require_once 'scripts/connect_to_mysql.php'; $sql = "SELECT First_name, Last_name,Password FROM customer WHERE Email=? AND Password=? LIMIT 1"; $stmt=$conn->prepare($sql);//preparing the statement if(!$stmt){ echo "Unable to prepare: ".$conn->errno. " " .$conn->error; } //executing the statement //$date=date('dm Y h:i:s'); if(!$stmt->bind_param('ss', $signin_email, $signin_password)){//bind parameters to sql statement. i=integer, s=string, b=blob, d=double echo "Binding parameters failed: ".$stmt->errno. " " . $stmt->error; } if(!$stmt->execute()){//executing the statement echo "Statement Execution failed: ". $stmt->error; } if(!$stmt->bind_result($dbfirstname,$dblastname,$dbpassword)){// used to bind variables to a prepared statement for result storage echo "Unable to bind results to variables: ".$stmt->error; } $stmt->store_result(); //echo $stmt->num_rows; echo $dbpassword; if(password_verify($signin_password, $dbpassword)){ if($stmt->num_rows===1){//to check if username and password actually exists while($row=$stmt->fetch()){ $user=$dbfirstname. " ". $dblastname; echo $user; } /*$_SESSION['user']=$user; header('location:logintest.php'); exit();*/ } } else{ //$error="Invalid Email address/Password. Please try again"; $loginerror= "Invalid Email address/Password. Please try again"; } $stmt->close();//closing the prepared statement $conn->close();//closing the connection }
Проблема заключается не в password_verify
а в том, что вы строите свой запрос:
`$sql ="SELECT First_name, Last_name,Password FROM customer WHERE Email=? AND Password=? LIMIT 1";
Вы связываете $signin_password
с этим запросом и не содержат хешированного значения из $_POST
.
Существует 2 решения:
1) удалить AND Password=?
из вашего запроса – вы проверите свой пароль с помощью password_verify
2) измените $signin_password
на:
$signin_password=password_hash($_POST['signin_password']);
(но этот способ использования password_verify не имеет значения.
$signin_password=$_POST['signin_password']; $hash = password_hash($dbpassword, PASSWORD_DEFAULT); if (password_verify($signin_password, $hash)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; }
Попробуйте с этим 🙂 Лучше вариант просто построить свой собственный запрос.