如何在从PHP脚本登录后将MySql列从-1更新为1
在我提出这个问题之前,我知道SQL注入有问题,我很可能会用PDO来解决,我现在只是想弄清楚这一点 我希望PHP从MySql中读取状态列,如果状态列为-1,其中$username=($_POST[“username”]),我希望PHP首先将它们发送到“更改密码”屏幕,然后在其更改后将更新脚本发送到MySql,以将列“status”从默认值-1更新为1 如果它是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
$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");
}
}
}
}