好的,所以我发送的链接指向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中的email
和token
参数,并在我的sql查询中使用它,如上所示。因此,当用户提交新密码时,请更新该用户的现有密码,并从数据库中删除该令牌。
我的代码上面的GET
网址中的参数是否有问题,并在我的查询中使用该参数?
答案 0 :(得分:1)
问题是表单的action属性。根据您的评论:
action="reset-password.php"
请注意,那里没有查询字符串,因此在发布表单时,将不会有$_GET
个变量。
有两种方法可以解决这个问题:
$_GET['email']
和$_GET['token']
字段添加两个隐藏的表单字段:<input type="hidden" name="email" value="<?php echo $_GET['email']; ?>">
<input type="hidden" name="token" value="<?php echo $_GET['token']; ?>">
; action
属性中使用的网址:action="reset-password.php?email=<?php echo $_GET['email']; ?>&token=<?php echo $_GET['token']; ?>"
注意您可能需要(应该,真的......)转义$_GET
变量以用于html和查询字符串,但php具有标准函数。< / p>