所以我正在尝试为我的网站实施密码更改功能,并且我想提交密码表单而不用刷新页面。所以我正在尝试使用ajax。这是我的html:
<form id="change_Pass" action="" method="post">
Current Password<input type="password" id="change_password" name="change_password"><br>
New Password<input type="password" id="new_password" name="new_password"><br>
Verify Password<input type="password" id="verify_password" name="verify_password"><br>
<input type="submit" value="Submit">
</form>
然后是jquery:
$('#change_Pass').submit(function(e){
$.ajax({
data: $(this).serialize(), // get the form data
type: $(this).attr('POST'), // GET or POST
url: $(this).attr('Private/change_password.php'), // the file to call
success: function(response) { // on success..
$('#success_div).html(response); // update the DIV
},
error: function(e, x, r) { // on error..
$('#error_div).html(e); // update the DIV
}
});
e.preventDefault();
});
然后是php:
<?php
$usr = $_SESSION["username"];
$old_pwd = $_POST["change_password"];
$new_pwd = $_POST["new_password"];
$link = new PDO('mysql:host=*;dbname=*;charset=UTF-8','*','*');
$query = "SELECT *
FROM Conference
WHERE Username = :un";
$stmt = $link->prepare($query);
$stmt->bindParam(':un', $usr);
$stmt->execute();
$row = $stmt->fetchAll();
$hash = $row[0]["Password"];
$is_correct = Bcrypt::check($old_pwd, $hash);
if($is_correct) {
$query = "UPDATE Conference
SET `Password`=:new_pwd
WHERE Username = :usr";
$stmt = $link->prepare($query);
$stmt->bindParam(':new_pwd', $new_pwd);
$stmt->bindParam(':usr', $usr);
$stmt->execute();
}
但我坚持一些事情
1)如何将数据发布到change_password.php而不是序列化,以便我可以使用$_POST
?
2)change_password看起来是否正确?它基本上用数据库中的现有密码检查该人输入current password
的内容。如果匹配则会更改密码。
答案 0 :(得分:1)
你的JS有点不对劲。看我的评论:
$('#change_Pass').submit(function(e) {
var $this = $(this); // It's a good to cache stuff
$.ajax({
data: $this.serialize(),
type: $this.attr('method'), // You want `method` here
url: 'Private/change_password.php', // Dunno why you used `attr`
success: function(response) {
$('#success_div').html(response);
},
error: function(e, x, r) {
$('#error_div').html(e);
}
});
e.preventDefault();
});
此外,您的密码更改逻辑对我来说不合适。您正在使用Bcrypt,因此不需要(并且永远不需要)以明文形式存储用户密码。
存储密码的Bcrypt哈希值而不是密码。这真的是密码散列的重点。