Php 基于URL参数更新数据库值

Php 基于URL参数更新数据库值,php,mysql,sql,Php,Mysql,Sql,好的,我向用户发送一个链接,URL中有参数,如下所示: mydomain.com/home/reset password.php?电子邮件=email@gmail.com&令牌=85988817a21062f92016a7065c 用户点击链接,进入reset password.php。此页面上有3个字段: 密码 确认密码 数学验证码 我想用用户根据URL中的参数提交的新密码更新数据库。我遇到的问题是,它没有用新密码更新数据库 这是我的重置密码。php代码: function checkData

好的,我向用户发送一个链接,URL中有参数,如下所示:

mydomain.com/home/reset password.php?电子邮件=email@gmail.com&令牌=85988817a21062f92016a7065c

用户点击链接,进入
reset password.php
。此页面上有3个字段: 密码 确认密码 数学验证码

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

这是我的
重置密码。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();
}   
}
如果我替换这个
isset($\u GET['email'])$_获取['email']:''
数据库中的实际电子邮件地址,一切正常。与
令牌相同

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


上面我的代码在
获取URL中的参数并将其用于我的查询时是否有问题?

问题在于表单的action属性。根据您的评论,即:

action="reset-password.php"
请注意,那里没有查询字符串,因此在发布表单时,将没有可用的
$\u GET
变量

有两个选项可以解决此问题:

  • 一切都通过邮政;构建表单时,必须添加两个隐藏的表单字段,分别是
    $\u GET['email']
    $\u GET['token']
    字段:


    通过使用
    echo>输出
    $\u GET
    尝试调试。打印($\u GET,true)。“”。您的表单发布到哪里,相同的url包括查询字符串?您可能希望将链接中的查询变量添加为隐藏表单字段,以便它们也被发布,并且您可以对所有内容使用
    $\u POST
    。另一方面,建议使用哈希密码。不应该
    updateUserPassword($db)
    updateUserPassword($dbHandler)
    -我没有看到分配给
    $db
    的任何内容。我看到
    $\u GET
    $\u POST
    。想知道表单的操作是否为get/post,您可能需要将
    $\u get
    s更改为
    $\u请求
    。在这一点上,我不知道还有什么可以说的,这将有任何进一步的帮助。我正在写这个哈哈。我不必在action属性中将查询字符串附加到url,一切都正常!我还需要转义
    $\u GET
    ?@iamthestreets我总是根据我输出到的媒体转义我的数据,但老实说,对于您的
    令牌
    ,它似乎没有必要,而且我不知道电子邮件地址中是否包含会使html或url无效的字符。@iamthestreets对你找到的解决方案会很好。你可以自己回答,你知道。这样,任何对你的问题感兴趣的人,包括我自己,都会看到问题所在。他唯一需要做的就是删除第2点,因为这是不需要的。
    action="reset-password.php"