Ошибка в изменении пароля с помощью Ajax / MySQLi подготовленных операторов (объектно-ориентированных)?
я не уверен, что процедура, позволяющая пользователю изменить свой пароль, является правильной.
Ajax
работает нормально, потому что он показывает мне ошибки, такие как следующие ошибки:
Notice: Undefined переменная: password in C:\xampp\htdocs\users\changepass.php on line 48 Warning: password_hash() expects at least 2 parameters, 1 given in C:\xampp\htdocs\users\changepass.php on line 48 Фатальная ошибка: вызов функции члена bind_param () on boolean in C:\xampp\htdocs\users\changepass.php on line 65
может объяснить мне, как разрешить пользователю правильно изменить свой пароль. Необходимо, чтобы форма была скрыта, и покажите сообщение ¡Пароль успешно изменен!
Changepass.php
if (isset($_POST['password_change'])) {
$hash = password_hash($password);
$username = strip_tags($_POST['username']);
$password = strip_tags($_POST['old_password']);
$old_password = $hash;
$newpassword = strip_tags($_POST['new_password']);
$new_password = $hash;
$confirmnewpassword = strip_tags($_POST['con_newpassword']);
$con_newpassword = $hash;
$stmtUsers=$con->prepare("SELECT COUNT(*) FROM users where username=? limit 1");
$stmtUsers->bind_param("s",$username);
if($stmtUsers->execute()) {
$hash = $stmtUsers->fetch();
if ($password == $hash['password']){
if($newpassword == $confirmnewpassword) {
$stmtUpdate=$con->prepare("UPDATE `users` SET `password` = ? WHERE `username` = ?");
$stmtUpdate->bind_param("ss",$newpassword,$username);
if($stmtUpdate->execute()){
echo "¡Contraseña cambiada con éxito!";
} else{
echo "La contraseña no se pudo actualizar";
}
} else {
echo "¡Las contraseñas no coinciden!";
}
} else {
echo "Por favor, escriba su contraseña actual con precisión!";
}
} else {
echo "Nombre de usuario incorrecto";
}
}
Форма
<form name="resetform" action="changepass.php" id="resetform" class="passform" method="post" role="form">
<h3>Change Your Password</h3>
<br />
<input type="hidden" name="username" value="<?php echo $username; ?>" ></input>
<label>Enter Old Password</label>
<input type="password" class="form-control" name="old_password" id="old_password">
<label>Enter New Password</label>
<input type="password" class="form-control" name="new_password" id="new_password">
<label>Confirm New Password</label>
<input type="password" class="form-control" name="con_newpassword" id="con_newpassword" />
<br>
<input type="submit" class="btn btn-warning" name="password_change" id="submit_btn" value="Change Password" />
</form>
<!--display success/error message-->
<div id="message"></div>
Аякс
<script type="text/javascript">
$(document).ready(function() {
var frm = $('#resetform');
frm.submit(function(e){
e.preventDefault();
var formData = frm.serialize();
formData += '&' + $('#submit_btn').attr('name') + '=' + $('#submit_btn').attr('value');
$.ajax({
type: frm.attr('method'),
url: frm.attr('action'),
data: formData,
success: function(data){
$('#message').html(data).delay(3000).fadeOut(3000);
},
error: function(jqXHR, textStatus, errorThrown) {
$('#message').html(textStatus).delay(2000).fadeOut(2000);
}
});
});
});
</script>
1 answers
В этом ответе, который я дал некоторое время назад, вы можете увидеть использование password_verify
и password_hash
https://es.stackoverflow.com/a/166704/38103
Исходя из этого давайте проверим ваш код:
if (isset($_POST['password_change'])) {
// Asignamos variables
$user = $_POST['username'];
$old_password = $_POST['old_password'];
$new_password = $_POST['new_password'];
$con_password = $_POST['con_newpassword'];
// comprobamos que las password coinciden
if($con_password !== $new_password){
echo "¡Las contraseñas no coinciden!";
exit;
}
// Buscamos el usuario
$stmtUsers = $con->prepare("SELECT * FROM users where username=? limit 1");
$stmtUsers->bind_param("s", $username);
// validamos consulta
if(!$stmtUsers->execute()) {
echo 'Error nose pudo ejecutar la consulta';
exit;
}
//obtenemos el resultado
if(!$result = $stmtUsers->fetch()){
echo "Nombre de usuario incorrecto";
exit;
}
// validamos password bd con la introducida
if (!password_verify($old_password, $result['password'])) {
echo '¡La contraseña no es válida!';
exit;
}
// si llegamos hasta aquí todo esta en orden y actualizamos
// cifrados la password antes de guardarla recuerda
$hash = password_hash($new_password, CRYPT_BLOWFISH);
$stmtUpdate = $con->prepare("UPDATE `users` SET `password` = ? WHERE `username` = ?");
$stmtUpdate->bind_param("ss", $hash, $username);
if($stmtUpdate->execute()){
echo "¡Contraseña cambiada con éxito!";
} else{
echo "La contraseña no se pudo actualizar";
}
}