如何在从PHP脚本登录后将MySql列从-1更新为1

如何在从PHP脚本登录后将MySql列从-1更新为1,php,mysql,Php,Mysql,在我提出这个问题之前,我知道SQL注入有问题,我很可能会用PDO来解决,我现在只是想弄清楚这一点 我希望PHP从MySql中读取状态列,如果状态列为-1,其中$username=($_POST[“username”]),我希望PHP首先将它们发送到“更改密码”屏幕,然后在其更改后将更新脚本发送到MySql,以将列“status”从默认值-1更新为1 如果它是1,我希望它正常登录,如果它是-1,我希望他们被迫改变他们的密码基本上,我有麻烦找到一个方法来做到这一点 我假设我的更新查询是这样的 $qu

在我提出这个问题之前,我知道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);
}
?>
如果有人能帮助我理解如何从我的sql中提取状态区域,并在状态为-1时将它们重定向到更改密码页面,那将是非常棒的

我只是想弄清楚,如果mysql中的状态为-1,如何重定向以更改密码

第二次更新:我做了第二次查询,检查信息并将您发送到更改密码日志,但我知道这是不正确的。不过,我觉得我离答案越来越近了。代码的工作原理是让我进入正确的屏幕,但它没有获得正确的信息。我需要用户名是一个基于代理输入内容的变量。再一次,这里的任何帮助都将不胜感激

        $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);
}

我在上面发布的更新查询中添加了以下代码。这已经解决了我的问题,并准确地检查用户是否以前登录过,如果他们有网站,则指示他们更改密码,如果他们已登录,则将他们发送到网站。我创建了一个单独的查询来选择状态和用户名,这样就不会干扰密码。我假设这将与任何用户名一起工作,考虑到它是完全可变的,只要他们在它应该指示他们之前从未登录。如果这个代码有任何问题,我很想知道,但是它对我来说是正确的

$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");
                    }
                }


        }

 }

SQL注入有什么问题?这将使用带有占位符值的准备好的语句,如果您在实际代码中遵循该模式,您在这方面可以做得很好,但还有其他严重的问题。警告:编写自己的访问控制层并不容易,而且有很多机会使它严重出错。请不要编写自己的身份验证系统,因为任何现代的同类产品都有一个强大的内置系统。我会仔细研究一下,不过我正在使用Dreamweaver来构建这个系统。这是一个在封闭网络中使用的简单登录。我只需要它重定向到更改密码,如果状态列=-1作为代码编辑器Dreamweaver很好,但它的PHP代码片段非常糟糕,不应该使用它们。记住,你今天的“封闭网络”系统明天可能会因为许多原因向公众开放,无论是有意还是无意。如果您第一次正确构建了应用程序(这并不困难),您将来就不会面临风险。这里需要注意的一点是,在用户表中使用
username
作为主要标识符是有问题的。即使您的规则不明确允许,用户名也会改变。在内部使用类似于
自动增量的
标识符、URL中的用户名以及用于登录目的。永远不要回收自动生成的ID,否则您将面临将数据从一个帐户交叉链接到另一个帐户的风险。
$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");
                    }
                }


        }

 }