Проблема с формой смены пароля

131
16 февраля 2022, 15:20

всем привет. возникла небольшая проблема, подскажите, пожалуйста, как исправить. пишу форму смены пароля, но не появляются ошибки и пароль не меняется. подскажите, пожалуйста, что не так

if(isset($data['do_change'])) {
 $user = R::findOne('users', 'login = ?', array($data['login']));
 $errors = array();
 if($user){
  if(password_verify($data['old_password'], $user->password)) {
   // change here
   if($data['new_password_1'] == '') {
    $errors[] = "Введите новый пароль!";
   }
   if($data['new_password_2'] != $data['new_password_1']) {
    $errors[] = 'Повторный пароль введён неверно!';
   }
   if(empty($errors)) {
    $user->password = password_hash($data['new_password_1'], PASSWORD_DEFAULT);
    echo '<div id="success" style="color: green;">Пароль успешно сменён!</div><hr>';
   } else {
    echo '<div id="errors" style="color: red;">' . array_shift($errors) . '</div><hr>';
   } 
  } else {
   $errors[] = "Старый пароль введён неверно";
  }
 }
 if(!empty($errors)) {
  echo '<div id="errors" style="color: red;">' . array_shift($errors) . '</div><hr>';
 }
}
Answer 1

Для начала убедитесь что у вас показываются ошибки php, а не тот array error который вы создаете.

Добавьте в шапке файла:

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

Далее я бы обратил внимание на три места в вашем коде:

if($user){

Вардампните что-то после этой строки или запишите в файл, чтобы убедится что пользователь определяется и скрипт это условие обрабатывает.

if($user){
    var_dump($data['old_password']); // вардамп старого пароля.

Следующее место:

 if(password_verify($data['old_password'], $user->password)) {

password_verify использует сравнение пароля хешу. Т.е. в $data['old_password'] должен быть пароль в виде 1111, а в $user->password закодированная алгоритмом строка. Выведите и то, и то, убедитесь что они соответствуют друг другу.

Вардампните перед этим условием:

 var_dump($data['old_password']);
 var_dump($user->password);
 if(password_verify($data['old_password'], $user->password)) {
    echo "соответствуют";

Последнее место на которое стоит обратить внимание:

   if(empty($errors)) {
    $user->password = password_hash($data['new_password_1'], PASSWORD_DEFAULT);

Я не уверен что за фреймворк/CMS вы используете, но у вас точно так должен записываться новый пароль в БД?

Похоже что здесь просто присваивается к $user->password хеш нового пароля.

Соответственно как только скрипт заканчивает обработку никаких записей куда-либо не происходит. Полагаю что данные вы храните в БД, а значит нужно через SQL произвести UPDATE значения пароля пользователя. Возможно в виде какого-то класса или обработчика в соответствии с вашей CMS/фреймворком.

READ ALSO
При импорте товара выдаёт ошибку Undefined index: sku (opencart)

При импорте товара выдаёт ошибку Undefined index: sku (opencart)

В контроллере сделал импорт модели $this->load->model('catalog/product');, также есть массив данных товара, примерно такой:

106
PAYEER Мерчант, получение данных с БД

PAYEER Мерчант, получение данных с БД

Платёжная система https://payeercom предоставляет возможность подключить Мерчант, система работает, но, не работают многие вещи из PHP7 session как в пример,...

80
Обновление с заменой

Обновление с заменой

В чем здесь ошибка? $update= $conn->query("UPDATE 'accounts' SET password=REPLACE(password,'%$2y$10$%','%$2a$10$%') where password like '%$2y$10$%'");

105