使用PHP和mysqli创建登录表单
我是这方面的初学者,我正在努力学习。我正在使用php、mysqli创建简单的登录表单。我已经创建了包含所有需要信息的数据库。我选择了下面的php代码来尝试在我的页面上登录用户,但现在发生的事情是,在输入正确的电子邮件和密码后,它只会将我带回到同一页面(index.php),似乎信息不正确,但我知道这是因为我自己将它们放在数据库中,它只是不想将我带到下一个页面(home.php)。请有人看看我的代码,看看我做错了什么。多谢各位 登录表单(index.php): 登录\u process.php:使用PHP和mysqli创建登录表单,php,mysqli,Php,Mysqli,我是这方面的初学者,我正在努力学习。我正在使用php、mysqli创建简单的登录表单。我已经创建了包含所有需要信息的数据库。我选择了下面的php代码来尝试在我的页面上登录用户,但现在发生的事情是,在输入正确的电子邮件和密码后,它只会将我带回到同一页面(index.php),似乎信息不正确,但我知道这是因为我自己将它们放在数据库中,它只是不想将我带到下一个页面(home.php)。请有人看看我的代码,看看我做错了什么。多谢各位 登录表单(index.php): 登录\u process.php:
require("db_config.php");
$email = $_POST['email'];
$password = $_POST['password'];
$conn = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);
$email = mysqli_real_escape_string($conn, $email);
$query = "SELECT * FROM users WHERE email = '$email'";
$result = mysqli_query($conn, $query);
if(mysqli_num_rows($result) == 0){
header("Location: index.php");
}
$userData = mysqli_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password));
if($hash != $userData['password']){
header("Location: index.php");
}else{
header("Location: home.php");
}
您不能只在字符串中使用变量,您需要将它们链接在一起 那么你的
"SELECT * FROM users WHERE email = '$email'";
一定是
"SELECT * FROM users WHERE email = " . $email;
但这是不安全和不好的做法强>
你很容易受到攻击
你至少需要使用
以链接为例,这是一个如何编写此类查询的示例
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
请开始使用PDO和准备好的语句。试着一步一步地调试从mysqli_num_行中得到的内容。@dariusz.g PDO不是强制性的,mysqli是可以的……如果你用mysqli_error()检查错误就好了。@ClementMalet,你是对的,但是使用PDO是向前迈出的一步。使用
if($hash=$userData['password']){header(“Location:home.php”)}else{header(“Location:index.php”);}
将比您当前的结构库更好。我将进一步查找此信息。我还按照Janaka的建议进行了更正,现在我可以处理到下一页(home.php),即使我输入了错误的密码。if($hash!=$userData['password']){header(“Location:home.php”);}else{header(“Location:index.php”);}你是从你的选择中得到一个结果吗?还是它是空的?我不确定我是否理解。在我输入电子邮件和密码后,它会将我带到我想要的页面(home.php),但即使我输入了错误的电子邮件和密码,它也会将我带到下一页。我希望在输入错误的信息后,将我放回登录页面(index.php).是的,我理解。我想知道的是,在您启动SELECT
语句后,您是否可以确认$result
实际具有预期值!如果没有数据,将永远不会正确检查数据是否正确,因为没有可比较的数据
"SELECT * FROM users WHERE email = " . $email;
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();