My php & mysqli script возвращается с нулевыми строками в базе данных, хотя есть строка - PullRequest
0 голосов
/ 17 июня 2020

Я наполовину новичок в PHP и MySQL, поэтому я использовал это обучающее видео, чтобы настроить систему забытых паролей для их предыдущего руководства по системе входа (https://www.youtube.com/watch?v=wUkKCMEYj9M, временная метка часть, над которой я работаю, - 1:05:46). Все работало нормально, пока я не добрался до той части, где нам нужно было создать новый пароль, и каждый раз, когда я отправляю новый пароль, он получает сообщение об ошибке, в основном о том, что в базе данных нет строк, или, по крайней мере, я считаю, что это то, что ошибка есть. (Сообщение об ошибке: вам необходимо повторно отправить свой запрос (1)) Ниже я привел свой код (файл для коннектора базы данных точно назван db c .in c. php, я испортил при первоначальном названии, поэтому я просто применяю другое имя к своим скриптам), и если вы увидите, что это такое, я буду очень благодарен. Спасибо!

<?php

if(isset($_POST["reset-password-submit"])) {

    $selector = $_POST["selector"];
    $validator = $_POST["validator"];
    $password = $_POST["pwd"];
    $passwordRepeat = $_POST["pwd-repeat"];

    if(empty($password) || empty($passwordRepeat)) {
        header("Location: ../create-new-password.php?newpwd=empty&selector=". $selector . "&validator=" . $validator);
        exit();
    } 
    else if ($password != $passwordRepeat){
        header("Location: ../create-new-password.php?newpwd=pwdnotsame&selector=". $selector . "&validator=" . $validator);
        exit();
    }

    $currentDate = date("U");

    require 'dbc.inc.php';

    $sql = "SELECT * FROM pwdReset WHERE pwdResetSelector=? AND pwdResetExpires >= ?";
    $stmt = mysqli_stmt_init($conn);
    if(!mysqli_stmt_prepare($stmt, $sql)) {
        echo "There was an error. (1)";
        exit();
    } 
    else {
        mysqli_stmt_bind_param($stmt, "ss", $selector, $currentDate);
        mysqli_stmt_execute($stmt);

        $result = mysqli_stmt_get_result($stmt);
        if(!$row = mysqli_fetch_assoc($result)) {
            echo "You need to re-submit your reset request. (1)";
            exit();
        } 
        else 
        {
            $tokenBin = hex2bin($validator);
            $tokenCheck = password_verify($tokenBin, $row["pwdResetToken"]);

            if($tokenCheck == false) 
            {
                echo "You need to re-submit your reset request. (2)";
                exit();
            } 
            else if ($tokenCheck == true) 
            {
                $tokenEmail = $row['pwdResetEmail'];

                $sql = "SELECT * FROM users WHERE emailUsers=?;";
                $stmt = mysqli_stmt_init($conn);
                if(!mysqli_stmt_prepare($stmt, $sql)) {
                    echo "There was an error. (2)";
                    exit();
                } 
                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 "There was an error. (3)";
                        exit();
                    } 
                    else 
                    {
                        $sql = "UPDATE users SET pwdUsers=? WHERE emailUsers=?";
                        $stmt = mysqli_stmt_init($conn);
                        if(!mysqli_stmt_prepare($stmt, $sql)) {
                            echo "There was an error. (4)";
                            exit();
                        } 
                        else {
                            $newPwdHash = password_hash($password, PASSWORD_DEFAULT);
                            mysqli_stmt_bind_param($stmt, "ss", $newPwdHash, $tokenEmail);
                            mysqli_stmt_execute($stmt); 

                            $sql = "DELETE FROM pwdReset WHERE pwdResetEmails=?";
                            $stmt = mysqli_stmt_init($conn);
                            if(!mysqli_stmt_prepare($stmt, $sql)) {
                                echo "There was an error. (5)";
                                exit();
                            } 
                            else {
                                mysqli_stmt_bind_param($stmt, "s", $tokenEmail);
                                mysqli_stmt_execute($stmt); 
                                header("Location: ../signup.php?newpwd=passwordupdated");
                            }
                        }
                    }
                }
            }
        }
    }
}
else {
    header("Location: ../index.php");
}

1 Ответ

0 голосов
/ 17 июня 2020

Я понял, в чем дело. На странице, где пользователь вводит свой новый пароль, также хранятся селектор и токен, в обоих из которых я ошибся. Приведенный выше сценарий отлично работает с небольшими изменениями в нижней части.

Новая часть ha sh должна быть:

$newPwdHash = password_hash($password, PASSWORD_DEFAULT);
mysqli_stmt_bind_param($stmt, "ss", $newPwdHash, $tokenEmail);
mysqli_stmt_execute($stmt); 

$sql = "DELETE FROM pwdReset WHERE pwdResetEmail=?";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
     echo "There was an error 5";
     exit();
} else {
      mysqli_stmt_bind_param($stmt, "s", $tokenEmail);
      mysqli_stmt_execute($stmt);
      header("Location: ../signup.php?newpwd=passwordupdated");
}

Не то, что было изначально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...