在另一个页面中重定向时php会话不起作用[重复]
Posted
技术标签:
【中文标题】在另一个页面中重定向时php会话不起作用[重复]【英文标题】:php session not working when redirecting in another page [duplicate] 【发布时间】:2016-08-11 23:44:17 【问题描述】:会话在我的代码中不起作用。我有一个登录表单,当用户在 db 上时,页面会在 main.php 中重定向他,但它不起作用
//index.php
<?php
session_start();
include('connect.php');
if(isset($_POST['submit']))
$username = mysqli_real_escape_string($dbCon, $_POST['username']);
$password = mysqli_real_escape_string($dbCon, $_POST['password']);
$sql = "select username, password from users where username='$username'";
$res = mysqli_query($dbCon, $sql);
if(!$res)
die(mysqli_errno);
while ($row = mysqli_fetch_assoc($res))
$usr = $row['username'];
$pass = $row['password'];
if($username == $usr && $password == $pass)
$_SESSION["username"] = $username;
header("Location: main.php");
exit();
else
$error = "Invalid username or password";
?>
这是我的 main.php
//main.php
<?php
if(isset($_SESSION["username"]))
$username = $_SESSION["username"];
else
header('Location: index.php');
die();
?>
谢谢
【问题讨论】:
session_start();
在main.php
中缺失,要使用会话,您应该在此之前启动它
肯定是index.php
产生了错误,偶尔看看你的php错误日志
感谢 kmlnvm 这是问题所在
【参考方案1】:
在main.php
的顶部使用session_start();
来解决您的问题。
【讨论】:
【参考方案2】:您的代码在很多方面都是错误的。首先,它打破了 SOLID 的第一条规则。单一责任一。您不能使用同一个类从数据库加载记录并登录给定用户。您必须使用存储库来处理来自数据库的几乎所有内容,而现代 php 应用程序所做的是它们使用 ORM 来处理您的模型和数据库。
第二个问题与您的查询有关。您正在通过检查给定用户名是否存在来测试来自请求的给定数据是否有效。这在很多方面都是错误的,我不会详细说明。要登录用户,您还应匹配其密码,并且该密码应经过哈希处理。
但是即使查询是正确的,您也会遍历来自数据库的每条记录,同时将这些数据存储在更高范围的 2 个变量中,这样您就可以检查与用户名匹配的最后一个用户的数据。
最后但并非最不重要的一点是,您在包含的脚本中肯定不会调用session_start();
。
使您的代码与 PSR-04 兼容,以便您可以使用 composer 加载您的依赖项。
【讨论】:
【参考方案3】:这是通过以下方式完成的,
1.在session_start()之后设置会话值
2.使用header函数重定向
if($username == $usr && $password == $pass)
session_start();
$_SESSION["username"] = $username;
header('location: main.php');
exit();
else
$error = "Invalid username or password";
【讨论】:
以上是关于在另一个页面中重定向时php会话不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章