忘れたパスワード機能を作成するために、最近私はhttp://megarush.net/forgot-password-php/からいくつかのコードを適用しました。私はそれをmysqliに変更し、パスワードを更新する際にいくつかのbcrypt機能を追加しました。短い形式では、ユーザーは電子メールアドレスを入力してリンクを送信し、このリンクを使用してパスワードを更新できますが、もう一度ハッシュされます。 私の問題は...私は、ユーザーに行くための電子メールを得ることができますが、リンクをクリックすると、新しい電子メールアドレスを試しても "無効なリンクまたはパスワードが既に変更されました"と続きます。私が間違っているアイデアは?助けを歓迎します!パスワード機能を忘れた場合はリセットページでエラーが発生する
email
,token
およびused
のトークンテーブルがあります。
forgot.php
<?php require 'header.php';
if (!isset($_GET['email'])) {
echo '<form action="forgot.php">
Enter Your Email Id:
<input type="text" name="email" />
<input type="submit" value="Reset My Password" />
</form>';
exit();
}
$email = $_GET['email'];
$sql = "SELECT email FROM user WHERE email='$email'";
$query = $mysqli_conn->query($sql);
if ($query->num_rows == 0) {
echo "Email id is not registered";
die();
}
$token = getRandomString(10);
$sql = "INSERT INTO `tokens` (`token`, `email`) VALUES ('{$token}','{$email}')";
$query = $mysqli_conn->query($sql);
function getRandomString($length) {
$validCharacters = "ABCDEFGHIJKLMNPQRSTUXYVWZ123456789";
$validCharNumber = strlen($validCharacters);
$result = "";
for ($i = 0; $i < $length; $i++) {
$index = mt_rand(0, $validCharNumber - 1);
$result.= $validCharacters[$index];
}
return $result;
}
function mailresetlink($to, $token) {
$subject = "Forgot Password";
$uri = 'http://' . $_SERVER['HTTP_HOST'];
$message = '
<html>
<head>
<title>Forgot Password</title>
</head>
<body>
<p>Click on the given link to reset your password <a
href="' . $uri . '/project/reset.php?token=' . $token . '">Reset Password</a></p>
</body>
</html>
';
$headers = "MIME-Version: 1.0" . "\r\n";
$headers.= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
$headers.= 'From: Admin<[email protected]>' . "\r\n";
$headers.= 'Cc: [email protected]' . "\r\n";
if (mail($to, $subject, $message, $headers)) {
echo "We have sent the password reset link to your email id <b>" . $to . "
</b>";
}
}
if (isset($_GET['email'])) mailresetlink($email, $token);
?>
reset.php
<?php require 'header.php';
$token = $_GET['token'];
if (!isset($_POST['password'])) {
$sql = "SELECT email FROM tokens WHERE token='" . $token . "' and used=0";
$query = $mysqli_conn->query($sql);
while ($row = mysqli_fetch_array($query)) {
$email = $row['email'];
}
if ($email != '') {
$_SESSION['email'] = $email;
}
else die("Invalid link or Password already changed");
}
$password = $_POST['password'];
$email = $_SESSION['email'];
if (!isset($password)) {
echo '<form method="post">
enter your new password:<input type="password" name="password" />
<input type="submit" value="Change Password">
</form>';
}
if (isset($_POST['password']) && isset($_SESSION['email'])) {
$password = password_hash($password, PASSWORD_DEFAULT);
$sql = "UPDATE user SET password= '$password' where email='$email'";
$query = mysqli_query($sql);
if ($query) mysqli_query("UPDATE tokens SET used=1 WHERE token='$token'");
echo "Your password is changed successfully";
if (!$query) echo "An error occurred";
}
?>
UPDATE:無効なエラーが修正さとフォームが表示され、今では単に「と言っ表示されていますエラーが発生しました。すべてのエラーを拾うために、SQLエラーがで追加されました、私が変数をエコーしていると
if (isset($_POST['password']) && isset($_SESSION['email'])) {}
はなぜあなたのクエリ
localhostでメール機能が動作しない場合は、localhostで試してみてください。 – rummykhan
@rummykhanメールはユーザーに送信されます。クリックしたときに「無効なリンクまたはパスワードが変更されました」というエラーが返されただけのリンクです。私のウェブサイトはサーバー上でホストされています – Jess
ああ申し訳ありませんが、私は再びそれを見てみましょう。 – rummykhan