PHP password_verify (), похоже, не работает

Я проходил методы 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.'; } 

Попробуйте с этим 🙂 Лучше вариант просто построить свой собственный запрос.