【问题标题】:Losing session values after header redirection标头重定向后丢失会话值
【发布时间】:2013-08-21 22:44:41
【问题描述】:

我正在使用 $_SESSION 让我的用户在登录后保持登录状态。

回到首页时,一开始看起来是登录的,但是刷新一次页面后,就不再登录了。

注意:我还在学习 PHP 编程,所以请不要介意我的大部分代码都相当不成熟。

Index.php 代码:

<?php
session_start();

$UserOnline = "Guest";

if (isset($_SESSION['username'])) {
    $UserOnline = $_SESSION['username'];
}


echo $UserOnline;
?>

Login.php 代码:

<?php
session_start();

$username = $_POST['username'];
$password = $_POST['password'];

if (empty($username)) {
    $InvalidLogin = "Please submit a username";
    $_SESSION['IL'] = $InvalidLogin;
    header ('Location: http://localhost/practice/index.php');
    exit;
} elseif (empty($username)) {
    $InvalidLogin = "Please submit a password";
    $_SESSION['IL'] = $InvalidLogin;
    header ('Location: http://localhost/practice/index.php');
    exit;
}


require 'required/connect.php';

$result = mysqli_query($con, "SELECT * FROM users WHERE username='$username'");
$row = mysqli_fetch_array($result);

if ($password == $row['password']) {
    $_SESSION['username'] = $username;
    echo "Successful Login!";
    echo "<br>";
    echo "<a href='index.php'>Return to HomePage?</a>";
} else {
    $InvalidLogin = "Your info didn't match ours!";
    $_SESSION['IL'] = $InvalidLogin;
    header ('Location: http://localhost/practice/index.php');
    exit;
}


?>

如果用户在那里进行会话,我已经在 login.php 页面上进行了测试,并且我总是得到正确的返回值。问题是,在我在 Index.php 页面上刷新一次后,用户不再处于会话中。

是我忘记了什么,还是我没有正确使用 $_SESSION?还有另一个我根本不知道的错误吗?

【问题讨论】:

  • 请注意,您应该在header() 调用检查空用户名和密码之后使用exit;。否则,即使在那些 header() 调用之后,脚本仍将继续运行。
  • loginAttempt.php 和你的 login.php 一样吗?是错字还是有 3 个文件?
  • 使用 HTTP 1.1,您不需要 Location 标头的完整 URI。一个简单的相对路径就可以了。让你的代码更便携
  • 一些注意事项 - 首先,您现在有严重的 SQL 注入漏洞。其次,您将密码明文存储在数据库中,这通常是不好的做法。
  • 不,它不是完全没问题。这就像几年前有人说使用这个 IE6 特定的功能,它没有任何规范,因为在这些日子里它工作得非常好。

标签: php session


【解决方案1】:

exit; 放在 header('location:.....') 之后,你的问题就解决了。

【讨论】:

  • 谢谢大家,我从来不知道“退出”,每天都在学习更多!
  • @Phil 我知道,我不明白这将如何解决 OP 的问题。
  • 好吧,我仍然遇到同样的问题。用户没有保持登录状态。添加退出;毕竟是标题。
  • @AngeloGeels 我的猜测是带有try=fail 参数的loginAttempt.php 可能会使会话无效。 好吧,不是这样
【解决方案2】:

问题已解决。在 Index.php 中发现错误。在 if(isset($_SESSION['username'])) 之前设置变量 $UserOnline。谢谢大家的帮助

【讨论】:

  • 你能澄清一下吗?查看您问题中的代码(甚至是编辑历史记录中的原始代码),这个答案没有意义
  • 我无法诚实地告诉你为什么它现在可以工作。我刚刚在设置 $UserOnline 变量时进行了更改。
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2013-06-19
相关资源
最近更新 更多