こんにちは。
現在、ログイン機能を実装しております。
そこで、パスワード忘れた方へのパスワードリセットページを作成しております。
下記のソースで上手く動きません。
PHPの勉強中で、ログインのINSERTとちょっと変更したら登録できるのかなと試行錯誤しております。そもそものコードがおかしいのかわからないく、指摘をいただけないでしょうか?
<?php include ('config.php'); include ('function.php'); $mail = $_GET['mail']; $userID = UserID($mail); $verifytoken = verifytoken($userID, $token); //パスワードのハッシュ化 if(isset($_POST['submit'])){ $new_password = $_POST['new_password']; $password_hash = password_hash($_SESSION['new_password'], PASSWORD_DEFAULT); $password_hash = password_hash($_SESSION['retype_password'], PASSWORD_DEFAULT); if($new_password == $retype_password) { try{ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //トランザクション開始 $dbh->beginTransaction(); $statement = $dbh->prepare("UPDATE member SET password = '$new_password' WHERE id = $userID"); $statement->bindValue(':new_password_hash', $new_password_hash, PDO::PARAM_STR); $statement->execute(); if($update_password){ $statement = $dbh->prepare("UPDATE recovery_keys SET valid = 0 WHERE userID = $userID AND token ='$token'"); $msg = 'Your password has changed successfully. Please login with your new passowrd.'; $msgclass = 'bg-success'; } }else { $msg = "パスワードが一致しません。"; $msgclass = 'bg-danger'; } // トランザクション完了(コミット) $dbh->commit(); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>パスワードリセット</title> <!-- Bootstrap --> <link href="css/bootstrap.css" rel="stylesheet"> </head> <body> <div class="container"> <div class="row"> <?php if($verifytoken == 1) { ?> <div class="col-lg-4 col-lg-offset-4"> <form class="form-horizontal" role="form" method="post"> <h2>Reset Your Password</h2> <?php if(isset($msg)) { ?> <div class="<?php echo $msgclass; ?>" style="padding:5px;"><?php echo $msg; ?></div> <?php } ?> <div class="row"> <div class="col-lg-12"> <label class="control-label">新しいパスワード</label> </div> </div> <div class="row"> <div class="col-lg-12"> <input class="form-control" name="new_password" type="password" placeholder="New Password" required> </div> </div> <div class="row"> <div class="col-lg-12"> <label class="control-label">再入力</label> </div> </div> <div class="row"> <div class="col-lg-12"> <input class="form-control" name="retype_password" type="password" placeholder="Re-type New Password" required> </div> </div> <div class="row"> <div class="col-lg-12"> <button class="btn btn-success btn-block" name="submit" style="margin-top:8px;">Submit</button> </div> </div> </form> </div> <?php }else {?> <div class="col-lg-4 col-lg-offset-4"> <h2>Invalid or Broken Token</h2> <p>Opps! The link you have come with is maybe broken or already used. Please make sure that you copied the link correctly or request another token from <a href="index.php">here</a>.</p> </div> <?php }?> </div> </div> </body> </html>
参考にしたコードは下記になります。
こちら、パスワードの暗号がMD5で古いようなので、PDOの
password_hashに書き換えたいと思い、挑戦して言います。
if(isset($_POST['submit'])) { $new_password = $_POST['new_password']; $new_password = md5($new_password); $retype_password = $_POST['retype_password']; $retype_password = md5($retype_password); if($new_password == $retype_password) { $update_password = mysqli_query($db, "UPDATE member SET password = '$new_password' WHERE id = $userID"); if($update_password) { mysqli_query($db, "UPDATE recovery_keys SET valid = 0 WHERE userID = $userID AND token ='$token'"); $msg = 'Your password has changed successfully. Please login with your new passowrd.'; $msgclass = 'bg-success'; } }else { $msg = "Password doesn't match"; $msgclass = 'bg-danger'; } }
もしもっといい方法があるようでしたら、そちらもヒントを教えていただけないでしょうか。
よろしくお願いします。