PHP - 密码重置表单不起作用

时间:2016-02-15 02:45:43

标签: php passwords forgot-password password-recovery

我找到了一个可以用于我的网站的教程密码重置功能,所以我下载了这些文件并使用了代码。我不太喜欢他们,所以我删除了几乎全部并保留了重要部分。无论如何,我从here下载了它,不幸的是现在它还没有工作。

每当我输入电子邮件时,无论它是什么,它都会说,"电子邮件无效。"任何帮助将不胜感激。另外,我在PHP上是一个轻微的菜鸟,但我理解这里的所有代码。我的代码如下:

<?php include "base.php"; ?>
 <html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
<link rel="stylesheet" href="style.css" type="text/css" />
<link rel="stylesheet" href="style2.css" type="text/css" />
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Forgot Password</title>
</head>
<body>

    <div id="main"><h1>Forgot Password</h1>

    <p>If you forgot your password, please enter the email associated with your account, and we will send you a reset link.</p>

        <form action="" method="post" name="passwd" id="passwd">
        <fieldset>
            <label for="emailadd"><div>Email Address:</div></label><input id="emailid" name="emailid" type="text" placeholder="Your Account's Email"><br>
            <input type="submit" value="Reset Password" />
        </fieldset>
        </form>
        </div>

<?php

    if(!empty($_POST['emailid']))
    {
        $emailaddress = mysqli_real_escape_string($_POST['emailid']);
        if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $emailaddress))  // Validate email address
       {
            echo '<p id="msg"><center>That is an invalid email address. Please try again.</center></p>';
        }
        else
        {
            $query = "SELECT UserID FROM users where  EmailAddress='".$emailaddress."'";
            $result = mysqli_query($query);
            $Results = mysqli_fetch_array($result);

           if(count($Results)==1)
            {
                $encrypt = md5(XXXXXXXXXXXXXXXXXXX);
                echo '<p id="msg"><center>Your password reset link has been sent to your email.</center></p>';
                $to=$emailaddress;
                $subject="Forgot Password";
                $from = 'no-reply@XXXXXXXXXXXX.com';
                $body='Hello, <br/> <br/>Your Membership ID is:   '.$Results['id'].' <br><br>Click <a href="http://XXXXXXXXXXX.com/home/forgot/reset.php?encrypt='.$encrypt.'&action=reset">here</a> to reset your password, or follow the link below:<br><br>http://XXXXXXXXXXXX.com/home/forgot/reset.php?encrypt='.$encrypt.'&action=reset <br/> <br/>--<br>XXXXXXXXXXXX<br>Games, Tools, and so much more!';
                $headers = "From: " . strip_tags($from) . "\r\n";
                $headers .= "Reply-To: ". strip_tags($from) . "\r\n";
                $headers .= "MIME-Version: 1.0\r\n";
                $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

                mail($to,$subject,$body,$headers);

            }
            else
            {
                echo '<p id="msg"><center>Account not found. Please try again.    </center></p>';
            }
        }
    } elseif(!empty($_SESSION['LoggedIn']) && !empty($_SESSION['Username'])) {

        echo "<meta http-equiv='refresh'              content='0;http://www.XXXXXXXXXXXX.com/home/main.php'/>";

    } else {

    }
//    include("html.inc"); 
?>

</body>
</html>

P.S。 Base.php连接到我的数据库,X代表我的加密或我的网站地址。

提前致谢!

1 个答案:

答案 0 :(得分:2)

以下功能让您失望:

  • mysqli_real_escape_string($_POST['emailid'])
  • mysqli_query($query)

这两个函数都要求将数据库连接传递给它并作为第一个参数。

参考文献:

同时确保您确实已开始会话,并确定您正在使用它们。

参考:

<强>脚注:

如果您在该教程链接中注意到您说您已关注http://www.phpgang.com/how-to-create-forget-password-form-in-php_381.html

他们正在传递这两个函数的连接:

$encrypt = mysqli_real_escape_string($connection,$_GET['encrypt']);

$result = mysqli_query($connection,$query);

所以,你需要按照教程 来参加&#34; T&#34; ,这是你没有做过的事情。

这样做,并修改您的数据库以适应该教程的代码和列类型,适当的长度等。

哦,并且MD5并不被认为可以安全地用作密码散列函数。

使用以下其中一项:

其他链接:

关于列长的重要说明:

如果您决定使用password_hash()或隐藏,请务必注意,如果您当前的密码列长度低于60,则需要将其更改为(或更高)。手册建议长度为255。

您需要更改列的长度并重新开始使用新哈希才能使其生效。否则,MySQL将无声地失败。

error reporting添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code

旁注:只应在暂存时进行显示错误,而不是生产。

以及or die(mysqli_error($connection))mysqli_query()

你没有告诉我们的是你用来连接的MySQL API。

  

&#34; P.S。 Base.php连接到我的数据库,X代表我的加密或我的网站地址。&#34;

确保您使用MySQLi API进行连接,看到您正在使用mysqli_query()而不是mysql_或PDO。

  • 不同的API不会混合。

请参阅以下内容:

您还需要确保邮件可供您使用。

如果没有,那么这超出了这个问题的范围。

更改

mail($to,$subject,$body,$headers);

if(mail($to,$subject,$body,$headers)){
   echo "Mail sent";
}
else {
   echo "Error";
}

并且看到&#34;邮件已发送&#34;,意味着mail()已完成其工作。

如果你看到&#34;错误&#34;,那么你需要找出&#34;为什么&#34;那是。

再次,&#34;超出范围&#34;问题。