【问题标题】:My update queries won't work我的更新查询不起作用
【发布时间】:2015-10-24 10:51:25
【问题描述】:

我已经启动并运行了一个基本的注册、登录、个人资料页面网页,并且最近开始实施忘记密码功能。

一切似乎都在运行,但我的更新查询似乎没有触发。

例如,如果电子邮件地址和内容匹配,我忘记密码页面上的代码会创建一个新的重置密钥,然后通过电子邮件发送链接内的代码(即 www.mydomain.net/forgotpassword.php?key=xxx)。

页面测试你登陆时是否有key,代码如下:

include ('database_connection.php');
session_start();
if($_GET['key'])
{
    $key = $_GET['key'];
     $query_check_key = "SELECT * FROM password_reset WHERE Reset_link='$key' AND Expiration>=NOW() AND used=0";
     $result_check_key = mysqli_query($dbc, $query_check_key);
     $result_check_row = $result_check_key->fetch_array(MYSQLI_ASSOC);
     if(!$result_check_key) {
        echo "Error";
     }

      if (mysqli_num_rows($result_check_key) == 1)
      {
         // Update the database to set the "used" field to 1
        $query_link_used = "UPDATE password_reset SET Used=1 WHERE Reset_link='$key'";
        $result_link_used = mysqli_query($dbc, $query_activate_account) ;

        $_SESSION['Memberid'] = $result_check_row['Memberid']; 
        header("Location: reset_password.php");
      }
}

当我尝试此操作时,if 语句评估为 true,因为页面被重定向到 reset_password.php 并且会话已成功正确创建。但是当我检查数据库表时,Used 字段尚未更新。

同样在 reset_password.php 页面上更新查询也不起作用:

if (empty($error))
        {
            //Query to change password
            $query_change_password = "UPDATE members SET Password=$hashed_password WHERE Memberid=$Memberid";
            $result_change_password = mysqli_query($dbc, $query_change_password);

            if (mysqli_affected_rows($dbc) > 0)//if update query was successful
            {
                echo '<div class="success">Your password has now been reset. You may now <a href="login.php">Log in</a></div>';

            } else
            {
                echo '<div class="errormsgbox">Oops !Your password could not be reset. Please contact the system administrator.</div>';
            } 
            mysqli_close($dbc);
        }

错误数组肯定是空的,检查受影响行的 if 语句保持为 0,因为该语句返回 false 并回退到 else 语句。

我在 PHPMyAdmin 中运行了查询,它们工作正常,所以我看不出问题出在哪里。非常感谢任何帮助。

【问题讨论】:

  • 我想你忘了用引号括起来字段值,它应该是 '$hashed_pa​​ssword' 和 chk $Memberid
  • 我会试一试,但在第一个代码块中,变量用引号括起来,即"UPDATE password_reset SET Used=1 WHERE Reset_link='$key'"
  • 在你的更新中运行 $query_activate_account 我在任何地方都看不到。
  • 解决了!由于各种原因,我从我的另一页复制了大量代码并从那里进行了更改,但甚至没有发现该错误。我已经为此绞尽脑汁好几天了,它是如此之小!谢谢大家!

标签: php mysqli sql-update


【解决方案1】:

在您的 reset_password.php 页面中启动会话并更新查询字符串:

session_start();
if (empty($error))
{
    $Memberid = $_SESSION['Memberid'];
    //Query to change password
    $query_change_password = "UPDATE members SET Password='$hashed_password' WHERE Memberid='$Memberid'";

【讨论】:

  • 会话已经开始,所以这不是问题。上面来自@user1844933 的关于封闭引号的评论解决了重置页面。但是,我仍然无法将 Used 列从第一个代码块更新为 1,即 "UPDATE password_reset SET Used=1 WHERE Reset_link='$key'"
  • 如何生成重置密钥?是随机值吗?
  • 随机生成的哈希。
  • 那么有没有可能重复相同的值?这是为了预防措施。您的查询执行中有错误。您将查询存储在 $query_link_used 变量中。但执行为 $result_link_used = mysqli_query($dbc, $query_activate_account);所以改成 $result_link_used = mysqli_query($dbc, $query_link_used) ;
  • 和上面的 cmets 一样,这个问题现在已经解决了。虽然有可能,但不太可能。如果它已经存在,我将添加一个重新生成的检查。
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多