Невозможно обновить пароль в базе данных с помощью phpmailer - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь разработать систему забытых паролей.Кажется, все работает нормально, даже сообщения с обновленными паролями на моей странице входа в систему, но в действительности это не обновлялось в базе данных.Я не мог понять, почему это происходит.Также я использую phpmailer для отправки писем.Любая помощь будет очень полезна

Страница сброса пароля:

<?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";
    }
    elseif($password!=$passwordRepeat){
        echo "password did not match";
    }

    $expiryDate=date("U");
    require "db.inc.php";

    $sql="SELECT * FROM pwdreset WHERE pwdresetSelector=? AND pwdresetExpires >= ?;";
    $stmt=mysqli_stmt_init($conn);
    if(!mysqli_stmt_prepare($stmt,$sql)){
        echo "Could not validate your request";
    }
    else{
        mysqli_stmt_bind_param($stmt,"ss",$selector,$expiryDate);
        mysqli_stmt_execute($stmt);
        $result=mysqli_stmt_get_result($stmt);
        if(!$row=mysqli_fetch_assoc($result)){
            echo "Could not validate your request";
        }
        else{
            $tokenBin=hex2bin($validator);
            $tokenCheck=password_verify($tokenBin,$row['pwdresetToken']);

            if($tokenCheck===false){
                echo "Could not validate your request";
            }
            elseif($tokenCheck===true){
                $tokenEmail=$row['pwdresetEmail'];

                $sql="SELECT * FROM users WHERE emailUsers=?;";
                $stmt=mysqli_stmt_init($conn);
                if(!mysqli_stmt_prepare($stmt,$sql)){
                    echo "Could not validate your request";
                }
                else{
                    mysqli_stmt_bind_param($stmt,"s",$tokenEmail);
                    mysqli_stmt_execute($stmt);
                    $result=mysqli_stmt_get_result($stmt);
                    if(!$row=mysqli_fetch_assoc($result)){
                        echo "Could not validate your request";
                    }
                    else{
                        $sql="UPDATE users SET pwdUsers=? WHERE emailUsers=?;";
                        $stmt=mysqli_stmt_init($conn);
                        if(!mysqli_stmt_prepare($stmt,$sql)){
                            echo "Could not validate your request";
                        }
                        else{
                            $newpasswordHash=password_hash($password,PASSWORD_DEFAULT);
                            mysqli_stmt_bind_param($stmt,"ss",$tokenEmail,$newpasswordHash);
                            mysqli_stmt_execute($stmt);

                            $sql="DELETE FROM pwdreset WHERE pwdresetEmail=?;";
                            $stmt=mysqli_stmt_init($conn);
                            if(!mysqli_stmt_prepare($stmt,$sql)){
                                header("Location: ../createnewpassword.php?error=sqlerror");
                                exit();
                            }
                            else{
                                mysqli_stmt_bind_param($stmt,"s",$tokenEmail);
                                mysqli_stmt_execute($stmt);

                                header("Location: ../login.php?resetpassword=success");
                                exit();
                            }
                        }
                    }
                }
            }
            else{
                echo "Could not validate your request";
            }
        }
    }
    mysqli_stmt_close($stmt);
    mysqli_close($conn);
 }
 else{
     header("Location: ../index.php");
     exit();
 }

1 Ответ

0 голосов
/ 05 апреля 2019

Ваш код было трудно прочитать с таким количеством операторов и общих сообщений. При разработке вы хотите отобразить ошибки, которые вам легко: 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' ];
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...