我正在尝试创建登录表单,如果存在用户名,则从数据库进行检查,如果是,则将其重定向到另一个页面,其中显示welcome + username,我想知道是否需要会话来达到条件或不?因为我的代码没有错误,也没有显示欢迎消息。
让我解释一下,我在login.php中有一个名为“$ welcome”的变量,当用登录表单提交有效的用户名&时,它会被回应。密码,然后它将我重定向到admin-panel.php并回显变量“$ welcome”。这是我的工作
的login.php
<?php
session_start();
include "connection.php";
?>
<?php
if(isset($_POST['submit'])){
$admin_user = isset($_POST['username']) ? $_POST['username'] : '';
$admin_pass = isset($_POST['password']) ? $_POST['password'] : '';
$sql = mysqli_stmt_init($conn);
if ($sql = mysqli_prepare($conn, "SELECT username, password FROM account WHERE username = ? AND password = ?")){
mysqli_stmt_bind_param($sql, "ss", $admin_user, $admin_pass);
mysqli_stmt_execute($sql);
mysqli_stmt_bind_result($sql, $username,$password);
mysqli_stmt_fetch($sql);
mysqli_stmt_close($sql);
}
global $username, $password;
if(empty($admin_user) || empty($admin_pass)){
$msg = "<span class='text-danger'> Username or Password Can't be empty </span>";
} elseif($admin_user != $username || $admin_pass != $password){
$msg = "<span class='text-danger'> Username or Password is not valid </span>";
} else{
header("location:admin-panel.php");
$welcome = "<h2>Welcome ". $admin_user ."!!!</h2>";
$_SESSION['welcome'] = $welcome;
}
mysqli_close($conn);
}
?>
的index.php
<?php
include "login.php";
global $msg;
?>
<!DOCTYPE html>
<html>
<head>
<title>Admin Panel</title>
</head>
<body>
<form method="post">
<?php if(isset($msg)){ ?>
<div>
<?php echo $msg; ?>
</div>
<?php } ?>
<div>
<label for="username">Username:</label>
<input type="text" name="username">
</div>
<div>
<label for="password">Password:</label>
<input type="password" name="password">
</div>
<div>
<input type="submit" name="submit">
</div>
</form>
管理-panel.php
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>Welcome Admin</title>
</head>
<body>
<div>
<?php
echo $_SESSION['welcome'];
?>
</div>
</body>
</html>
答案 0 :(得分:2)
重定向用户时:
header("location:admin-panel.php");
用户的浏览器为提供的URL发出全新请求(特别是GET请求)。所以代码刚才所做的一切都已经结束了,一个全新的请求正在开始。该请求不了解先前请求中的任何内容。
因此,当您包含其他脚本时:
include "login.php";
该脚本执行,但在这种情况下它不会做任何事情,因为所有事情都包含在一个条件中:
if(isset($_POST['submit'])){
此新请求中的和 条件为false
。重定向不是表单提交。
不是尝试包含上一页(完全删除include "login.php";
),而是将值存储在服务器的会话状态中,并在重定向页面上读取该值。简单的事情:
// on the login page:
session_start();
$_SESSION['welcome'] = $welcome;
和
// on the admin page:
session_start();
echo $_SESSION['welcome'];
请注意,非常过度简化只是为了向您介绍这个概念。您可能希望考虑其他一些事情,例如在显示值之前检查值,根据需要清理值,并且您 想要查看prepared statements with query parameters并且进入password hashing,因为目前您的代码非常对攻击开放。