这是我遇到的最混乱的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;查询会导致整个脚本重新开始。不一定在这里要求调试,我只是想了解为什么会发生这种情况。