2015-12-04 2 views
2

У меня проблема с функцией PHP password_verify. Я написал простую функцию PHP, которая использует _GET, принимает 3 параметра: $user_unique_id, old_password и new_password. Он проверяет, являются ли old password и password stored in database одинаковыми. Я использую hash из моей базы данных и сравниваю его с old password с помощью password_verify() fucntion, но он возвращает false даже whem. Я на 100% уверен, что пароли одинаковы. Может ли кто-нибудь помочь мне с этой проблемой? Я проверил MySQL queries и все работает очень хорошо. Я возвращаю updated_at время, которое позже кодирую до JSON.PHP password_verify возвращает NULL, когда параметры одинаковы

Это моя функция в основном скрипте changeuserpassword.php я вызываю из ссылки:

<?php 
require_once 'include/DB_Functions.php'; 
$db = new DB_Functions(); 

// JSON Response Array 
$response = array(); 

// Receiving The Post Params 
$old_password = $_GET['old_password']; 
$new_password = $_GET['new_password']; 
$user_unique_id = $_GET['user_unique_id']; 

// Change User Password 
$user = $db->changeUserPassword($user_unique_id, $old_password, $new_password); 

if ($user != false) { 
    $response["error"] = false; 
    $response["user"]["updated_at"] = $user["updated_at"]; 
    echo json_encode($response); 
} else { 
    $response["error"] = true; 
    $response["error_msg"] = "Podano nieprawidłowe stare hasło"; 
    echo json_encode($response);  
} 
?> 

Это функция я использую в changeuserpassword.php основного сценария. Это называется changeUserPassword:

/** 
* Change User Account Password 
*/ 
public function changeUserPassword($user_unique_id, $old_password, $new_password) { 
    $stmt = $this->conn->prepare("SELECT user.`encrypted_password` 
            FROM `user` 
            WHERE user.`unique_id` = ?"); // Preparing SELECT Query To The `user` Table 
    $stmt->bind_param("s", $user_unique_id);      // Binding With Params 

    if ($stmt->execute()) { 
     $user = $stmt->get_result()->fetch_assoc(); // Fetching Rows From Query 
     $stmt->close(); 

     $password_hash = $user["encrypted_password"]; // Decrypting Hashed Password 

     // Checking Currrent Password Identity With Decrypted Password 
     if (password_verify($old_password, $password_hash)) { // Old Password And Current One Are The Same 
      $encrypted_password = password_hash($new_password, PASSWORD_DEFAULT); // Hashing New Password 

      $stmt = $this->conn->prepare("UPDATE user 
              SET user.`encrypted_password` = ?, user.`updated_at` = NOW() 
              WHERE user.`unique_id` = ?"); 
      $stmt->bind_param("ss", $encrypted_password, $user_unique_id); 
      $result = $stmt->execute(); 
      $stmt-close(); 

      // Checking For Succesfull UPDATE 
      if ($result) { 
       $stmt = $this->conn->prepare("SELECT user.`updated_at` 
               FROM `user` 
               WHERE user.`unique_id` = ?"); 
       $stmt->bind_param("s", $user_unique_id); 
       $stmt->execute(); 
       $user = $stmt->get_result()->fetch_assoc(); // Fetching Rows From Query 
       $stmt->close(); 

       return $user; 
      } 
     } else { // Old Password And Current One Are Different 
      return false; 
     } 
    } 
} 

Редактировать

Вот мой скриншот базы данных: enter image description here Мои работает скрипт, но он всегда возвращает ложь, которая означает, что password_verify() возвращает ложь.

решаемые

Проблема была $stmt->close() заявление. Я использовал их слишком часто, и поэтому сценарий не работал.

+0

sidenote: почему вы используете '$ _GET ['new_password']', а не POST? что не так безопасно. –

+0

Я использую его с Google Volley? Я просто начинающий. Любые idae, как это сделать «безопасно» с помощью Java? – anton86993

+0

Извините, я не знаю никаких java. –

ответ

1

После отладки с помощью @ anton86993 в чате мы обнаружили, что ошибкой является использование слишком большого количества операторов $sql->close(), когда они не были нужны.

Нет причин иметь такое множество операторов, поскольку PHP автоматически закрывает соединение с SQL при выполнении сценария. Причиной для закрытия оператора может быть освобождение соединения с SQL, если у вас ограниченное количество подключений сразу или очевидное, чтобы выпустить ресурсы.

Смежные вопросы