@killsxs

Кто-нибудь может помочь реализовать смену данных пользователя самим пользователем?

Есть 2 формы:
- для смены пароля;
- для смены логина.
Пароль в данном случае захеширован, через password_hash($password, PASSWORD_DEFAULT); Я всё пытаюсь и никак не могу сделать так, чтобы пароль захешированный изменялся. Обычный пароль меняется, а захешированный нет. Я не знаю, как это реализовать, может кто помочь? Вот код. Там много ошибок. Я в программировании новичок, так что, не ругайтесь.

Вот PHP код:

session_start();

  $conn_db = mysqli_connect("localhost","root","","practice");

  $fsmsg = "";

  $username = $_POST['username'];

  $email = $_POST['email'];

  $old_password = $_POST['old_password'];

  $new_password = $_POST['new_password'];

  $password = $_POST['password'];

  $new_username = $_POST['new_username'];

  $hash = password_hash($password, PASSWORD_DEFAULT);



  // Если кнопка апдейт нажата, изменить значения полей

  if (isset($_POST['update'])){

    $update2 = "UPDATE `users` SET `password`='$new_password' WHERE `username`='$username' AND `password`='$old_password'";
    $resultupdate = mysqli_query($conn_db, $update2) or die (mysqli_error($conn_db));  
    
  }

  if (isset($_POST['update'])){

    $update = "UPDATE `users` SET `username`='$new_username' WHERE `email`='$email' AND `password`='$password'";
    $resultupdate = mysqli_query($conn_db, $update) or die (mysqli_error($conn_db));

  }


Вот код форм:

<div class="container-fluid padding">
        <div class="row padding">
          <div class="offset-lg-1 col-lg-5">
    
          <br>

      <form action="red.php" method="POST" style="display: block; width: 400px; margin: 0 auto; background: #f2f1f0; padding: 20px; color:#555; text-align: center;">

        <h3>Форма для смены пароля</h3>
        <br>

        <div class="form-group">
          <label for="exampleInputlogin"><h3>Введите имя пользователя</h3></label>
          <input type="login" name="username" class="form-control" id="exampleInputlogin2" aria-describedby="loginHelp" required placeholder="Введите имя пользователя" pattern="[a-zA-Z0-9]+" title="Используйте только цифры и латинские буквы">
        </div>

        <div class="form-group">
          <label for="exampleInputpassword"><h3>Старый пароль</h3></label>
          <input type="password" name="old_password" class="form-control" id="exampleInputpassword" aria-describedby="passwordHelp" required placeholder="Введите старый пароль" pattern="[a-zA-Z0-9]+" title="Используйте только цифры и латинские буквы">
        </div>

        <div class="form-group">
          <label for="exampleInputPassword2"><h3>Новый пароль</h3></label>
          <input type="password" name="new_password" class="form-control" id="exampleInputPassword2" aria-describedby="passwordHelp" required placeholder="Введите новый пароль" pattern="[a-zA-Z0-9]+" title="Используйте только цифры и латинские буквы">
        </div>
        
        <div class="form-check">
          <input class="form-check-input" name="id" type="checkbox" value="" id="invalidCheck3" required>
          <label class="form-check-label" for="invalidCheck3"><h5>Подтвердить изменение</h5></label>
        </div>
        
        <form method="POST">
          <button type="submit" class="btn btn-success btn-block" name="update">Изменить</button>
        </form>


      </form>

          </div>
          
            <div class="col-lg-5">

            <br>

            <form action="red.php" method="POST" style="display: block; width: 400px; margin: 0 auto; background: #f2f1f0; padding: 20px; color:#555; text-align: center;">

              <h3>Форма для смены логина</h3>
              <br>

              <div class="form-group">
                <label for="exampleInputemail"><h3>Введите Email</h3></label>
                <input type="email" name="email" class="form-control" id="exampleInputemail" aria-describedby="emailHelp" required pattern="[a-zA-Z0-9-@-.]+" placeholder="Введите свой Email">
              </div>

              <div class="form-group">
                <label for="exampleInputpassword"><h3>Введите пароль</h3></label>
               <input type="password" name="password" class="form-control" id="exampleInputpassword" aria-describedby="passwordHelp" required placeholder="Введите пароль" pattern="[a-zA-Z0-9]+" title="Используйте только цифры и латинские буквы">
              </div>

              <div class="form-group">
                <label for="exampleInputlogin"><h3>Новый логин</h3></label>
                <input type="login" name="new_username" class="form-control" id="exampleInputlogin" aria-describedby="loginHelp" required placeholder="Введите новый логин" pattern="[a-zA-Z0-9]+" title="Используйте только цифры и латинские буквы">
              </div>

              <div class="form-check">
                <input class="form-check-input" name="id" type="checkbox" value="" id="invalidCheck3" required>
                <label class="form-check-label" for="invalidCheck3"><h5>Подтвердить изменение</h5></label>
              </div>
          
              <form method="POST">
                  <button type="submit" class="btn btn-success btn-block" name="update">Изменить</button>
              </form>

      </form>
            
            </div>
          </div>
        </div>

      <form class="text-center text-danger">

        <?php

          if(!empty($fsmsg)) echo("<br><h2>{$fsmsg}</h2>\n");

        ?>

      </form>
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
delphinpro
@delphinpro
frontend developer
Сначала дернуть из базы пользователя по юзернейму (по паролю нельзя, он хеширован)
Если запись нашлась – хорошо, пользователь есть

SELECT * FROM users WHERE username=:username

Получаем объект/массив с данными пользователя
Примерно такой:

$user = [
  'id' => 1,
  'username' => 'vasya',
  'password' => 'длинный хеш'
]


Потом проверяем старый пароль из формы, правильный ли

password_verify($old_password, $user['hash'])

Если прошли проверку, значит логин и пароль вбили правильно, можно менять

Делаем хеш нового пароля

$hash = password_hash($new_password, PASSWORD_DEFAULT);


И закидываем в базу

UPDATE users SET password=:hash WHERE id=$user['id']
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы