数据库表未更新

时间:2012-08-08 22:12:22

标签: php mysql database mysqli

我正在使用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想要更改密码,那么她将输入她的用户名,然后输入新密码,然后将所有内容更新到上表中。但它没有更新任何东西。

谢谢

3 个答案:

答案 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”。

请回复你找到的内容。