-1

我正在使用 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想修改密码,那么她会输入她的用户名,然后输入一个新密码,那么这应该都更新到上表中。但它没有更新任何东西。

谢谢

4

3 回答 3

1

您正在将用户名获取到名为的变量中,$username但您正在绑定一个$teacherusername在 bind_param() 中调用的变量,这就是查询不获取任何结果的原因。

bind_param 代码应该是:

    // You only need to call bind_param once
    $stmt->bind_param("s",$username);
于 2012-08-08T22:17:51.400 回答
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'";

希望有效。

于 2012-08-09T01:13:22.560 回答
0

1) 我没有看到任何错误检查或处理。

2) 我对变量“$username”、“$newpassword”、“$dbTeacherUsername”、“$dbTeacherPassword”等感到困惑。您确定在正确的地方使用了正确的名称吗?

3) 至少,请检查“$stmt->execute() == false”,并酌情显示 PDO“errorInfo”。

请发回您找到的内容。

于 2012-08-08T22:30:48.900 回答