Как обновить столбец MySql с -1 до 1 после входа в систему из PHP-скрипта

Прежде чем я задам вопрос, я знаю, что есть проблемы с SQL-инъекцией, я собираюсь разобраться с этим, скорее всего, с помощью PDO, я просто пытаюсь понять это сейчас.

Я хочу, чтобы PHP читал столбец статуса из MySql, и если в столбце статуса указано -1, где $ username = ($ _POST ["username"]), я хочу, чтобы PHP сначала отправлял их на экран «изменить пароль», а затем после его изменения отправьте сценарий обновления в MySql, чтобы обновить столбец «status» со значения по умолчанию -1 до 1.

Если его 1, я хочу, чтобы он вошел в систему как обычно, а если его -1, я хочу, чтобы они были вынуждены изменить свой пароль в основном, и у меня возникают проблемы с поиском способа сделать это.

Я предполагаю, что мой запрос на обновление будет выглядеть примерно так

$query = "UPDATE login SET status= 1 WHERE user_id='".$username ."' LIMIT 1";

Мой скрипт входа в php пока

<?php
// Include config file
require_once 'LoginConn.php';

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

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

    // Check if username is empty
    if (empty(trim($_POST["username"]))){
        $username_err = 'Please enter username.';
    } else{
        $username = trim($_POST["username"]);
    }

    // Check if password is empty
    if (empty(trim($_POST['password']))){
        $password_err = 'Please enter your password.';
    } else{
        $password = trim($_POST['password']);
    }

    // Validate credentials
    if (empty($username_err) && empty($password_err)){
        // Prepare a select statement
        $sql = "SELECT username, password FROM scorecardusers 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 = $username;

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

                // Check if username exists, if yes then verify password
                if (mysqli_stmt_num_rows($stmt) == 1){                    
                    // Bind result variables
                    mysqli_stmt_bind_result($stmt, $username, $hashed_password);
                    if (mysqli_stmt_fetch($stmt)){
                        if (password_verify($password, $hashed_password)){
                            /* Password is correct, so start a new session and
                            save the username to the session */


                            session_start();

                            $value= $sql['password'];


                            $_SESSION['username'] = $username;      
                            header("location: Test.php");
                        } else{
                            // Display an error message if password is not valid
                            $password_err = 'The password you entered was not valid.';
                        }
                    }
                } else{
                    // Display an error message if username doesn't exist
                    $username_err = 'No account found with that username.';
                }
            } else{

                echo "Oops! Something went wrong. Please try again later.";
            }
        }

        // Close statement
        mysqli_stmt_close($stmt);
    }

    // Close connection
    mysqli_close($link);
}
?>

ОБНОВЛЕНО: я добавил это в свой запрос, и он правильно обновляется.

mysqli_query ($link, "UPDATE Users SET Status = '1' WHERE Status ='-1'and username ='".$username ."' LIMIT 1");

Если бы кто-нибудь мог помочь мне понять, как вытащить область состояния из моего sql и перенаправить их на страницу смены пароля, если status = -1, это было бы здорово.

Я просто пытаюсь понять, как перенаправить на смену пароля, если Status = -1 в mysql ..

ВТОРОЕ ОБНОВЛЕНИЕ: Я сделал второй запрос, который проверяет информацию и отправляет вас в журнал смены пароля, однако я знаю, что это неверно. Но я чувствую, что подхожу к ответу намного ближе. Код работает до тех пор, пока я попадаю на нужный экран, но не получает правильную информацию. Мне нужно, чтобы имя пользователя было переменной в зависимости от того, что вводит агент. Опять же, любая помощь здесь будет очень признательна.

        $id_get = "SELECT Status, username FROM scorecardusers WHERE Status = '-1' and username='MyName' LIMIT 1";


        if ($result=mysqli_query($link, $id_get))
        {   

      // Fetch one and one row// check if first time log in
  while ($row = mysqli_fetch_assoc($result))
    {
   $Status=$row["Status"];
   $username=$row["MyName"];
      if ($Status== "-1" && $username = = "MyName");
      var_dump($result);
        header("location: ChangePW.php");

    }
  // Free result set
  mysqli_free_result($result);
}

Какие проблемы с SQL-инъекцией? При этом используются подготовленные операторы со значениями-заполнителями, если вы следуете этому шаблону в своем фактическом коде, у вас все в порядке, но есть и другие серьезные проблемы.

tadman 24.05.2018 18:28
ПРЕДУПРЕЖДЕНИЕ: Написать свой собственный уровень контроля доступа непросто, и есть много возможностей сделать это совершенно неправильно. Пожалуйста, не пишите свою собственную систему аутентификации, если любой современный рамки разработки, такой как Laravel, имеет встроенный надежный система аутентификации.
tadman 24.05.2018 18:28

Я изучу его, но я использую Dreamweaver для его создания. Это простой логин, который будет использоваться в закрытой сети. Мне просто нужно перенаправить, чтобы сменить пароль, если столбец статуса = -1

Malsum 24.05.2018 18:50

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

tadman 24.05.2018 18:56

Здесь следует отметить, что использование username в качестве основного идентификатора в вашей таблице пользователей проблематично. Имена пользователей могут и будут меняться, даже если ваши правила явно не разрешают это. Используйте что-то вроде идентификатора AUTO_INCREMENT внутри, имя пользователя в URL-адресах и для входа в систему. Никогда не перерабатывайте автоматически сгенерированные идентификаторы, иначе вы рискуете связать данные из одной учетной записи в другую.

tadman 24.05.2018 18:57

Как можно изменить имя пользователя, если все они имеют уникальные идентификаторы, которые никогда не меняются и не повторяются? У них не будет возможности установить свое имя пользователя как предопределенное. В таком случае мне все равно нужно использовать AUTO_Increment? Я изучаю AUTO_INCREMENT, потому что никогда раньше не использовал его.

Malsum 24.05.2018 19:34

Не менять и не повторять имена пользователей - это просто политика. Что, если кто-то очень хочет, чтобы его имя изменилось, и он попросит администратора «исправить» это за него? Это может создать огромный беспорядок. Если само имя - это просто другое поле, проблем нет.

tadman 24.05.2018 21:15

Я понимаю, откуда вы, однако я единственный администратор, и нет необходимости менять имя пользователя, оно основано на их уникальных идентификаторах, и каждый получает его, и они никогда не будут одинаковыми. Не должно быть причин, по которым когда-либо потребуется смена идентификатора. Я говорю имя пользователя, но на самом деле это уникальный идентификатор, который привязан к человеку. Если они уходят, этот идентификатор не используется повторно. Идентификаторы в основном представляют собой автоинкремент.

Malsum 24.05.2018 21:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
57
1

Ответы 1

Я добавил запрос на обновление, опубликованный выше, после следующего кода. Это решило мою проблему и точно проверит, входил ли пользователь в систему раньше, есть ли у них веб-сайт, направляет их на изменение пароля, если они вошли в систему, отправьте их на веб-сайт. Я создал отдельный запрос для выбора статуса и имени пользователя, чтобы он не мешал вводу пароля. Я предполагаю, что это будет работать с любым именем пользователя, учитывая, что оно полностью изменчиво, если они никогда не входили в систему, прежде чем он должен направить их. Если есть какие-либо проблемы с этим кодом, я хотел бы знать, однако он работает правильно для меня.

$id_get = "SELECT Status, username FROM Users WHERE Status = '-1' and username = ?";




 if ($Check = mysqli_prepare($link, $id_get)){
        // Bind variables to the prepared statement as parameters
        mysqli_stmt_bind_param($Check, "s", $param2_username);

        // Set parameters
        $param2_username = $username;
        $param_status=$status;

        // Attempt to execute the prepared statement
        if (mysqli_stmt_execute($Check)){
            // Store result
            mysqli_stmt_store_result($Check);

            if (mysqli_stmt_num_rows($Check) == 1){                    
                // Bind result variables


                mysqli_stmt_bind_result($Check, $username, $param2_status);
                if (mysqli_stmt_fetch($Check)){

                   if ($param_status== "-1" && $param2_username == '?');
                        header("location: ChangePassword.php");
                    }
                }


        }

 }

Другие вопросы по теме