我正在使用mysqli和php,我想要做的是我希望用户能够创建新密码,如果他们希望这样做。
如果用户更改了密码,将在“用户名”文本框中输入用户名,然后在“新密码”文本框中输入新密码。
当用户提交表单时,它应该在数据库中查找,找到在数据库中匹配的用户名并更新该行,以便先前的密码更改为新密码,并且它还为密码提供更好的加密。
但问题是它根本就没有这样做。数据库根本没有更新密码,不记得给它们加盐,我无法弄清楚我需要做什么。
以下是我的尝试(我已连接到db但未包含以下代码):
<?php
// PHP code
session_start();
$salt = "";
for ($i = 0; $i < 40; $i++) {
$salt .= substr(
"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
mt_rand(0, 63),
1);
}
$username = (isset($_POST['username'])) ? $_POST['username'] : '';
$newpassword = (isset($_POST['newpassword'])) ? $_POST['newpassword'] : '';
if (isset($_POST['submit'])) {
// don't use $mysqli->prepare here
$query = "UPDATE Teacher SET TeacherSalt = $salt, TeacherPassword = SHA1(CONCAT($newpassword,$salt)) WHERE TeacherUserName = ?";
// prepare query
$stmt=$mysqli->prepare($query);
// You only need to call bind_param once
$stmt->bind_param("s",$username);
// execute query
$stmt->execute();
// get result and assign variables (prefix with db)
$stmt->bind_result($dbTeacherUsername,$dbTeacherPassword);
while($stmt->fetch()) {
if ($username == $dbTeacherUsername) {
$loggedIn = true;
}
}
/* close statement */
$stmt->close();
/* close connection */
$mysqli->close();
}
....
<p>Username</p><p><input type="text" name="username" /></p> <!-- Enter Teacher Username-->
<p>New Password</p><p><input type="password" name="newpassword" /></p> <!-- Enter Teacher Password-->
以下是数据库表目前的样子:
TeacherUsername TeacherPassword TeacherSalt
j.lu fgrfre4r4ffsdfv
因此,如果j.lu想要更改密码,那么她将输入她的用户名,然后输入新密码,然后将所有内容更新到上表中。但它没有更新任何东西。
谢谢
答案 0 :(得分:1)
您正在将用户名提取到名为$username
的变量中,但您在bind_param()中绑定了一个名为$teacherusername
的变量,这就是查询无法获取任何结果的原因。
bind_param代码应为:
// You only need to call bind_param once
$stmt->bind_param("s",$username);
答案 1 :(得分:1)
我猜问题是sql查询字符串。像$ salt和$ newpassword这样的变量应该是单引号,这样字符串就会包含TeacherSalt ='random'而不是TeacherSalt = random。
所以你应该替换
$query = "UPDATE Teacher SET TeacherSalt = $salt, TeacherPassword = SHA1(CONCAT($newpassword,$salt)) WHERE TeacherUserName = ?";
与
$query = "UPDATE Teacher SET TeacherSalt = '$salt', TeacherPassword = SHA1(CONCAT('$newpassword','$salt')) WHERE TeacherUserName = 'yoursearchparam'";
希望有效。
答案 2 :(得分:0)
1)我没有看到任何错误检查或处理。
2)我对变量“$ username”,“$ newpassword”,“$ dbTeacherUsername”,“$ dbTeacherPassword”等感到困惑。您确定在正确的位置使用了正确的名称吗? (S)?
3)至少请检查“$ stmt-&gt; execute()== false”,并根据需要显示PDO“errorInfo”。
请回复你找到的内容。