Ошибка в php коде, который вызывает обновление всех паролей пользователя, а не соответствующего пользователя - PullRequest
0 голосов
/ 18 апреля 2020

У меня серьезная проблема на нашем веб-сайте, и мне требуется решение.

Итак, в основном в приведенном ниже коде мы принимаем электронную почту пользователя в качестве имени пользователя в базе данных и вместе с ним случайный пароль, взятый из файла MOCK_DATA.csv и сохраняющий его в БД.

Но он выполняет проверку, поэтому, если имя пользователя еще не существует в базе данных, введите имя пользователя и пароль. Если имя пользователя уже существует, просто обновите пароль.

Теперь вот проблема ниже:


Описание проблемы:

После того, как пользователь совершил покупку, если имя пользователя уже существует в базе данных, происходит то, что пароль для этого пользователя и ВСЕХ других пользователей в базе данных обновляется до этого пароля.

Чтобы уточнить, это не произойдет, если это новый пользователь. Поэтому, если электронная почта abc@gmail.com отсутствует в базе данных, abc@gmail.com и пароль 123456 вставляются в базу данных, и ни один из других пользователей в базе данных не затрагивает их пароль.

Однако, если я сделаю При покупке с тем же адресом электронной почты abc@gmail.com снова пароль будет обновлен для этого пользователя (скажем, 654321), но для всех паролей других пользователей в базе данных также будет установлено значение 654321.

Ожидается результат:

Пароль должен обновляться только для одного этого пользователя, если имя пользователя уже существует

Фактический результат:

Обновление пароля для всех пользователи.

$email_address = $_GET['email'];
$email_address_metis = "xxx@xxx.com.test-google-a.com";

//Get Access Code
$csv = array_map('str_getcsv', file('MOCK_DATA.csv'));
// get random index from array $arrX
$randIndex = array_rand($csv[0]);

    // Define variables and initialize with empty values
    $username = $password = $confirm_password = "";
    $username_err = $password_err = $confirm_password_err = "";

    // Processing form data when form is submitted
    //if($_SERVER["REQUEST_METHOD"] == "POST"){

            // Prepare a select statement
            $sql = "SELECT id FROM users WHERE username = ?";

            if($stmt = mysqli_prepare($link, $sql)){
                // Bind variables to the prepared statement as parameters
                mysqli_stmt_bind_param($stmt, "s", $param_username);

                // Set parameters
                $param_username = $email_address;//trim($_POST["username"]);

                // Attempt to execute the prepared statement
                if(mysqli_stmt_execute($stmt)){
                    /* store result */
                    mysqli_stmt_store_result($stmt);

                    if(mysqli_stmt_num_rows($stmt) == 1){
                        $username_err = "exists";

                        }

                    } else{
                        $username = $email_address;//trim($_POST["username"]);
                    }
                } else{
                    echo "Oops! Something went wrong. Please try again later.";
                }

                // Close statement
                mysqli_stmt_close($stmt);
            //}
        // output the value for the random index

        // Validate password

            $password = $csv[0][$randIndex];


            if($username_err!=="exists"){
            // Prepare an insert statement
            $sql = "INSERT INTO users (username, password) VALUES (?, ?)";

            if($stmt = mysqli_prepare($link, $sql)){


                // Set parameters
                $param_password = password_hash($password, PASSWORD_DEFAULT); // Creates a password hash

                // Bind variables to the prepared statement as parameters
                mysqli_stmt_bind_param($stmt, "ss", $param_username, $param_password);

                // Attempt to execute the prepared statement
                if(mysqli_stmt_execute($stmt)){
                    // Redirect to login page
                   // header("location: login.php");
                } else{
                    // echo "Something went wrong. Please try again later.";
                }

                // Close statement
                mysqli_stmt_close($stmt);
            }
       }
       else {
                                    // Prepare an update statement
                                $sql = "UPDATE users SET password = ? WHERE username = ?";

                                if($stmt = mysqli_prepare($link, $sql)){
                                    // Bind variables to the prepared statement as parameters
                                    mysqli_stmt_bind_param($stmt, "si", $param_password, $param_username);

                                    // Set parameters
                                    $param_password = password_hash($password, PASSWORD_DEFAULT);
                                    $param_username = $username;

                                    // Attempt to execute the prepared statement
                                    if(mysqli_stmt_execute($stmt)){
                                        // Password updated successfully. Destroy the session, and redirect to login page
                                        session_destroy();
                                        header("location: login.php");
                                        exit();
                                    } else{
                                        echo "Oops! Something went wrong. Please try again later.";
                                    }

                                    // Close statement
                                    mysqli_stmt_close($stmt);
                                }
       }

        // Close connection
        mysqli_close($link);

1 Ответ

2 голосов
/ 18 апреля 2020

Итак, после долгого обсуждения в чате между OP и I, я пришел к выводу, что переменная $username не заполнялась, что, в свою очередь, привело к сбою вашего запроса / UPDATE, и я мог бы молча add.

Кроме того, i в mysqli_stmt_bind_param() для запроса UPDATE также было проблемой с самого начала, поскольку вы пытались сохранить строку в формате integer.

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