密码重置问题

时间:2013-11-24 21:30:45

标签: php mysqli

这是我遇到的最混乱的PHP问题之一 考虑这个非常简单的密码重置代码。 用户通过电子邮件发送包含其ID和“密钥”的链接,该密钥是其当前密码哈希 如果$ id和$ key与数据库中当前的匹配,则会生成新密码,否则不允许重置密码。

<?php
include("dbconnect.php");

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

// requires $id and $key
$id = (int)$_REQUEST['id'];
$key = $_REQUEST['key'];

if ($id > 0) {
    $query = "select `login`,`password`,`email` from `clients` where `clientid` = $id;";
    $result = $mysqli->query($query);

    $count = $result->num_rows;
    if ($count == 0) { $msg = "Your id was not found."; }
    else {
        $row = $result->fetch_assoc();
        $email = $row['email'];

        if ($key !== $row['password']) { $msg = "Your password reset request is not valid."; }
        else {
            $new_pass = generateRandomString();
            $msg = "
            <div>
                Your password has been reset.
                <br><br>
                Your login is: <strong>". $row['login'] ."</strong><br>
                Your password is: <strong>". $new_pass ."</strong>
            </div>";

            // update password
            $query = "update `clients` set `password` = md5('$new_pass') where `clientid` = $id;";
            $update_result = $mysqli->query($query);
        }
    }
}
else { $msg = "Your id is missing or is not valid."; }

print "
<h1>Reset Password</h1>";
print $msg;

?>

如果我注释掉这一行$update_result = $mysqli->query($query);,那么一切都会正常工作,除了我的密码实际上没有被重置的事实。

由于某种原因,仅仅更新密码的行为会导致重新加载我的整个脚本,密码会更改,但之后我会收到“您的密码重置请求无效”的消息。

起初我想,也许是因为我在if语句中执行此操作并且php以某种方式及时倒退并重新评估...但是当我移动整个重置密码时如果声明,一旦我更新密码,我仍然重新开始我的整个脚本,并且我收到密码重置请求无效的消息(即使密码重置DID OCCUR!)。

似乎只有一个$ mysqli-&gt;查询会导致整个脚本重新开始。不一定在这里要求调试,我只是想了解为什么会发生这种情况。

0 个答案:

没有答案