Php 基于URL参数更新数据库值
好的,我向用户发送一个链接,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
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"