Я думаю, что я hashed пароль, используя функцию PASSWORD непосредственно из базы данных mysql (я делаю неправильно здесь?).  И я пытаюсь проверить этот пароль с помощью этого кода: 
  if($submit) { $first=$_POST['first']; $password=$_POST['password']; $hash="*85955899FF0A8CDC2CC36745267ABA38EAD1D28"; //this is the hashed password i got by using function PASSWORD in database $password=password_verify($password,$hash); $db = new mysqli("localhost", "root","","learndb"); $sql = "select * from admin where username = '" . $first . "' and password = '". $password . "'"; $result = $db->query($sql); $result=mysqli_num_rows($result); if($result>0) { session_start(); $_SESSION['logged_in'] = true; session_regenerate_id(true); header("Location:loginhome.php"); } } 
Но пароль не соответствует. Что мне здесь не хватает?
ОБНОВЛЕНИЕ :
  После всех предложений я использовал password_hash из php-кода для хранения в базе данных. 
 $db = new mysqli("localhost", "root","","learndb"); $password=password_hash('ChRisJoRdAn123',PASSWORD_DEFAULT); $sql="INSERT INTO admin (username,password)values('ChrisJordan','$password')"; $db->query($sql); 
все еще пароль не соответствует.
Невозможно выполнить поиск хеша соленых паролей в базе данных. Чтобы вычислить хеш, вам понадобится функция password_hash (), как вы уже сделали это правильно в инструкции insert.
 // Hash a new password for storing in the database. // The function automatically generates a cryptographically safe salt. $hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); 
Чтобы проверить пароль, сначала нужно выполнить поиск только по имени пользователя (используется подготовленный запрос, чтобы избежать внедрения sql):
 $sql = 'select * from admin where username = ?'; $db->prepare($sql); $db->bind_param('s', $first); 
Когда вы, наконец, получите сохраненный хэш из базы данных, его можно проверить следующим образом:
 // Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb. $isPasswordCorrect = password_verify($password, $existingHashFromDb); 
Это слишком долго для комментария.
Увидев, что этот вопрос еще не содержит зеленый галочку рядом с любым из ответов, я отправляю следующее, чтобы указать на вероятные проблемы.
  Я заметил, что вы пытаетесь перейти с MD5 на password_hash() – password_verify() . 
  Что вам нужно знать, так это то, что MD5 создает строку длиной 32 символа, а не password_hash() длиной 60. 
varchar(255) . Если вы сохранили длину столбца паролей до 32, вам нужно будет очистить существующие хэши из этого столбца, а затем ALTER, чтобы ваш столбец был равен 60 или 255, как предлагает руководство.
Вам нужно будет очистить все существующие пароли, ALTER ваш столбец, создать новый хеш, а затем снова попробовать свой код входа.
Я вижу это в вашем коде:
 "*85955899FF0A8CDC2CC36745267ABA38EAD1D28"; //this is the hashed password i got by using function PASSWORD in database 
  Эта строка *85955899FF0A8CDC2CC36745267ABA38EAD1D28 40 длинная, слишком короткая и отрезанная. 
Это говорит мне, что длина вашей колонки равна 40, а не 60, или снова, как предлагает руководство, 255.
Ссылка MD5:
Возвращает хэш как 32-значное шестнадцатеричное число.
  Ссылка для password_hash() : 
Результат всегда будет состоять из 60 символов или FALSE при сбое.
Для ALTER вашей колонки, здесь ссылка ссылки:
Также убедитесь, что ваша форма содержит метод POST и что входы содержат соответствующие атрибуты имени и что никакие пробелы не вводятся.
  Вы можете использовать trim() чтобы избавиться от них. 
Добавьте отчет об ошибках в начало файла (ов), который поможет найти ошибки.
 <?php error_reporting(E_ALL); ini_set('display_errors', 1); // Then the rest of your code 
Sidenote: Отображение ошибок должно выполняться только в стадии постановки и никогда не производить.
  а также or die(mysqli_error($db)) в mysqli_query() . 
Редактировать:
Что вам нужно сделать, это получить массив и получить совпадение.
 $sql = "select * from admin where username = '".$first."' and password = '".$password."' "; $result = $db->query($sql); if ($result->num_rows === 1) { $row = $result->fetch_array(MYSQLI_ASSOC); if (password_verify($password, $row['password'])) { //Password matches, so create the session // $_SESSION['user']['user_id'] = $row['user_id']; // header("Location:/members"); echo "Match"; }else{ echo "The username or password do not match"; } } 
Другое возможное решение:
 $query = "SELECT * from admin WHERE username='$first'"; $result = $db->query($query); if($result->num_rows ===1){ $row = $result->fetch_array(MYSQLI_ASSOC); if (password_verify($password, $row['password'])){ echo "match"; } else { $error = "email or Password is invalid"; echo $error; } } mysqli_close($db); // Closing Connection 
  password_verify – это логическая функция, которая возвращает либо true либо false .  В вашем коде после получения значения пароля из параметра «Пост» вы выполняете эту операцию 
 $password=password_verify($password,$hash); 
  который изменяет значение $password значение true или false и это логическое значение, хранящееся в $password вы используете в операторе select mysql 
 $sql = "select * from admin where username = '" . $first . "' and password = '". $password . "'"; 
Другое дело, возможно, что используемый хешированный / соленый пароль не является правильным хэшированным паролем, который вы используете.
Обновление: попробуйте
 $cost = [ 'cost' => 15, ]; $hash_password = password_hash('ChRisJoRdAn123', PASSWORD_BCRYPT, $cost); 
  перед любой операцией db измените длину password varchar на> = 64 
 $sql = "INSERT INTO admin (username,password)values('ChrisJordan','".$hash_password."')"; 
После операции вставки выполните оператор select с пользователем
 $sql = "select * from admin where username = 'ChrisJordan'"; 
  после того, как этот выбор hased password и password из параметра post , вам нужно будет проверить оба пароля с помощью password_verify 
 if (password_verify(validate($_POST['password']), $hash_password_from_db)) { echo "Valid Password"; }else{ echo "Invalid Password"; } 
  Вы должны использовать password_hash для кодирования паролей, проверенных с помощью password_verify . 
  Функция MySQL PASSWORD – это нечто совершенно другое.  Он используется для кодирования паролей, специфичных для аутентификации MySQL.  (MySQL специально рекомендует использовать PASSWORD для чего-либо, кроме аутентификации MySQL). 
Оба используют разные алгоритмы хеширования, представляют их вывод в разных форматах и, как правило, несовместимы друг с другом.
  Типичным способом использования password_hash и password_verify является: 
 $hash = password_hash($password, PASSWORD_DEFAULT); //Store $hash in your database as the user's password //To verify: //Retrieve $hash from the database, given a username $valid = password_validate($password, $hash); 
Проблема в вашем коде заключается в том, что вы делаете это:
$password=password_verify($password,$hash); $sql = "select * from admin where username = '" . $first . "' and password = '". $password . "'";
  password_verify возвращает логическое значение (соответствует ли пароль и хэш).  Вместо этого вам нужно получить хэш из базы данных и сопоставить введенный пароль с этим хешем.