根据URL参数更新数据库值

时间:2014-10-14 18:43:58

标签: php mysql sql

好的,所以我发送的链接指向URL中的参数,如下所示:

mydomain.com/home/reset-password.php?email=email@gmail.com&token=85988817a21062f92016a7065c

用户点击该链接并转到reset-password.php。在此页面上有3个字段: 密码 确认密码 数学验证

我想根据URL中的参数使用用户提交的新密码更新数据库。我遇到的问题是,它没有使用新密码更新数据库。

这是我的reset-password.php代码:

function checkDataValidity(){
if(empty($_POST['password'])){ 
    throw new Exception("Please enter a password."); 
} 
}   

function updateUserPassword($dbHandler) {


try {

    $salt     = dechex(mt_rand(0, 2147483647)) . dechex(mt_rand(0, 2147483647)); 
    $password = hash('sha256', $_POST['password'] . $salt); 
    for($round = 0; $round < 65536; $round++){ 
        $password = hash('sha256', $password . $salt); 
    }

    $urlEmail = isset($_GET['email']) ? $_GET['email'] : '';
    $urlToken = isset($_GET['token']) ? $_GET['token'] : '';

    $query_params = array( 
        ':password' => $password, 
        ':salt' => $salt,
        ':emptyToken' => '',
        ':user' =>  $urlEmail,
        ':token' => $urlToken
    ); 

    $dbHandler->beginTransaction();
    $sql = "UPDATE users SET password = :password, salt = :salt, recovery = :emptyToken  WHERE username = :user AND recovery = :token";
    $stmt = $dbHandler->prepare($sql); 
    $result = $stmt->execute($query_params);
    $dbHandler->commit(); 

    } catch(Exception $dbException){
        $dbHandler->rollback();
        echo 'The following error occured: <br/>'.$dbException->getMessage();
    }

    return true;
}




require("config.php"); //connects to the database
if(!empty($_POST)){
try {
    checkDataValidity();
    $updatePassword = updateUserPassword($db);
    if($updatePassword){
        $message = "Success!";
    } else {
        $message = "Please try again.";
    }
} catch (Exception $e){
    echo 'The following error occured: <br/>'.$e->getMessage();
}   
}

我不再收到任何错误,但我知道它有一些与此有关:

$urlEmail = isset($_GET['email']) ? $_GET['email'] : '';
$urlToken = isset($_GET['token']) ? $_GET['token'] : '';

如果我将此isset($_GET['email']) ? $_GET['email'] : ''替换为数据库中的实际电子邮件地址,一切正常。与token相同。

所以基本上我要做的是GET URL中的emailtoken参数,并在我的sql查询中使用它,如上所示。因此,当用户提交新密码时,请更新该用户的现有密码,并从数据库中删除该令牌。

我的代码上面的GET网址中的参数是否有问题,并在我的查询中使用该参数?

1 个答案:

答案 0 :(得分:1)

问题是表单的action属性。根据您的评论:

action="reset-password.php"

请注意,那里没有查询字符串,因此在发布表单时,将不会有$_GET个变量。

有两种方法可以解决这个问题:

  1. 通过POST完成所有事情;在构建表单时,您必须使用$_GET['email']$_GET['token']字段添加两个隐藏的表单字段:

    <input type="hidden" name="email" value="<?php echo $_GET['email']; ?>">
    <input type="hidden" name="token" value="<?php echo $_GET['token']; ?>">;

  2. 将查询字符串附加到您在action属性中使用的网址:

    action="reset-password.php?email=<?php echo $_GET['email']; ?>&token=<?php echo $_GET['token']; ?>"
  3. 注意您可能需要(应该,真的......)转义$_GET变量以用于html和查询字符串,但php具有标准函数。< / p>