Ваш код было трудно прочитать с таким количеством операторов и общих сообщений. При разработке вы хотите отобразить ошибки, которые вам легко: 1. понять, что их вызвало, и 2. правильно их обработать. Эти сообщения должны быть общими (без ошибок mysql и т. Д.), Когда код находится в разработке.
Я поместил ваш код в функцию, чтобы его было легко обрабатывать и читать.
Я полагаю, ваша проблема сводится к следующей строке:
mysqli_stmt_bind_param($stmt,"ss",$newpasswordHash,$tokenEmail);
Где вы изменили значения для обновления. Если бы я делал это для себя, я бы просто использовал класс и разбил его на разные функции, так как это довольно большой кусок кода, выполняющий несколько функций.
<?php
if(isset($_POST['reset-submit'])){
$selector=$_POST['selector'];
$validator=$_POST['validator'];
$password=$_POST['password1'];
$passwordRepeat=$_POST['password2'];
if(empty($password) || empty($passwordRepeat)){
echo "empty fields";
exit();
}
elseif($password!=$passwordRepeat){
echo "password did not match";
exit();
}
$expiryDate=date("U");
require "db.inc.php";
$reset = reset_password( $conn , $selector , $validator , $password );
if( ! $reset['Results'] ){
echo $reset['Msg'];
exit();
}
header("Location: ../login.php?resetpassword=success");
exit();
}
else{
header("Location: ../index.php");
exit();
}
function reset_password( $conn , $selector , $validator , $password ){
$sql="SELECT * FROM pwdreset WHERE pwdresetSelector=? AND pwdresetExpires >= ?;";
$stmt=mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt,$sql)){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => '1: SQL Error - ' . mysqli_error($conn) ];
}
mysqli_stmt_bind_param($stmt,"ss",$selector,$expiryDate);
if( ! mysqli_stmt_execute($stmt) ){
return [ 'Result' => false , 'Msg' => 'Failed to execute 1' ];
}
$result=mysqli_stmt_get_result($stmt);
if(!$row=mysqli_fetch_assoc($result)){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => 'Failed to find reset' ];
}
$tokenBin=hex2bin($validator);
if( ! password_verify($tokenBin,$row['pwdresetToken']) ){ //you can check against this directly. No need to put it into a variable.
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => 'Incorrect Password' ];
}
$tokenEmail=$row['pwdresetEmail'];
mysqli_stmt_close($stmt);
$sql="SELECT * FROM users WHERE emailUsers=?;";
$stmt=mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt,$sql)){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => '2: SQL Error - ' . mysqli_error($conn) ];
}
mysqli_stmt_bind_param($stmt,"s",$tokenEmail);
if( ! mysqli_stmt_execute($stmt) ){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => 'Failed to execute 2' ];
}
$result=mysqli_stmt_get_result($stmt);
if(!$row=mysqli_fetch_assoc($result)){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => 'No User Found' ];
}
mysqli_stmt_close($stmt);
$sql="UPDATE users SET pwdUsers=? WHERE emailUsers=?;";
$stmt=mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt,$sql)){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => '3: SQL Error - ' . mysqli_error($conn) ];
}
$newpasswordHash=password_hash($password,PASSWORD_DEFAULT);
mysqli_stmt_bind_param($stmt,"ss",$newpasswordHash,$tokenEmail); //you had these reversed. According to your SQL looks like it should be this way
if( ! mysqli_stmt_execute($stmt) ){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => 'Failed to execute 3' ];
}
mysqli_stmt_close($stmt);
$sql="DELETE FROM pwdreset WHERE pwdresetEmail=?;";
$stmt=mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt,$sql)){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => '4: SQL Error - ' . mysqli_error($conn) ];
}
mysqli_stmt_bind_param($stmt,"s",$tokenEmail);
if( ! mysqli_stmt_execute($stmt) ){
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => false , 'Msg' => 'Failed to execute 4' ];
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
return [ 'Result' => true , 'Msg' => 'Failed to execute 4' ];
}