【问题标题】:PHP $_SESSION data returning emptyPHP $_SESSION 数据返回空
【发布时间】:2013-02-28 00:44:38
【问题描述】:

我有一个 login.php 文件:

<?php

session_start();

include('db.php');

            if(isset($_POST['email']) && !empty($_POST['email']) AND isset($_POST['password']) && !empty($_POST['password'])){
                $email = mysql_escape_string($_POST['email']);
                $password = mysql_escape_string($_POST['password']);

                $search = mysql_query("SELECT * FROM users WHERE email='".$email."' AND password='".$password."' AND active='1'") or die(mysql_error()); 
                $match  = mysql_num_rows($search);

                if($match > 0){
                    $row = mysql_fetch_assoc($search);
                    $user=$row['forename'].' '.$row['surname'];
                    $_SESSION['username']=$user;
                    //$msg = 'Login Complete! Thanks, '.$user.'!';
                    header( 'Location: page1.php' ) ;
                    die;
                }else{
                    $msg = 'Login Failed!<br /> Please make sure that you enter the correct details and that you have activated your account.';
                }
            }


?>

现在,当我加载 page1.php 时,我遇到了问题。该文件包含这个...

<?php

session_start();

include('db.php');

if(isset($_SESSION['username'])){
    echo 'Success, '.$_SESSION['username'].'!';
}else{
    echo 'No dice!';
    //header( 'Location: login.php' ) ;
}

?>

如果没有存储用户名,我希望它重定向到登录。如果有,我想让他们查看。但是,我得到“没有骰子!”每次,所以看起来我没有正确检索(或存储)数据。我做错了什么?


需要明确的是,else 不应该被触发,因为它应该引用 index.php 中的会话数据集。重定向不是问题。


这个问题是特定于我的主机的,他的设置很奇怪。在联系他们时,他们为我提供了正确的路径信息,我必须使用 session_save_path 来设置。在此基础上得出正确答案。

【问题讨论】:

  • $search 变量包含什么?或者它在哪里定义?包括更多关于查询用户数据的代码。
  • 这无关紧要。检查只是看它是否被设置,而不是它是否有一个值。您是在login.php 开始会话吗?
  • 我也在 login.php 中开始会话。我应该只从那里开始吗?重新开始是一件坏事吗?

标签: php mysql session session-variables


【解决方案1】:

重定向格式不正确。您必须指定完整的网址,如下所示:

header('Location: http://your.site.com/page1.php');
die;

重定向后结束脚本很重要。

如果没有保留会话数据,可能是您有一些配置问题。验证您的 php 配置并检查存储会话数据的写入权限。

<?php phpinfo();?>

【讨论】:

  • 是的,你必须这样做。 linklink
  • 在这种情况下,重定向被注释掉了,但是它触发得很好。问题是,else 不应该被触发。
  • 评论经常是错误的。检查 rfc 和标头位置语法,RFC 2616 第 14.30 章。还要注意大写的“L”。
  • @Splatter 您是否正在退出登录脚本中的脚本(dieexit)?否则可能会执行低于重定向的代码,导致会话混乱。
  • 同样,标题不是问题。当它未注释时,它触发正常。问题是整个代码段不应该被触发,因为应该设置 $_SESSION['username']。
【解决方案2】:

我会对此发表评论,但低于 50 次的限制意味着我不能出于某种原因。试试

$row = mysql_fetch_assoc($search);
$user=$row['forename'].' '.$row['surname'];
echo 'User: '.$user.'<br />';

$_SESSION['username']=$user;
echo 'Session: '.$_SESSION['username'];

//header( 'Location: page1.php' ) ;

看看是否有任何东西实际存储在变量中。

编辑:试试这个

if($match > 0){
   $row = mysql_fetch_assoc($search);
   $user=$row['forename'].' '.$row['surname'];
   $_SESSION['username']=$user;
   $_SESSION['logintrue'] = true;
   //$msg = 'Login Complete! Thanks, '.$user.'!';
   header( 'Location: page1.php' ) ;
   die;
}

session.php

<?php
session_start();

if(!$_SESSION['logintrue'])
{
header( 'Location: login.php' ) ;
}

$SessionUsername = $_SESSION['username'];
?>

page1.php

<?php

require_once 'session.php';
require_once 'db.php';

echo 'I work now maybe?<br />';
echo $SessionUsername;
?>

还包括不是函数,所以写成include 'db.php';我也犯了这个错误。

【讨论】:

  • 我放回注释行,修改为$msg = 'Login Complete! Thanks, '.$_SESSION['username'].'!';,它返回了正确的信息。它似乎没有持续到新页面。
  • 试试if(!empty($_SESSION['username'])){ echo 'Success, '.$_SESSION['username'].'!'; }else{ echo 'No dice!'; //header( 'Location: login.php' ) ; }
  • 一个很好的建议,但它返回相同的结果。回显 $_SESSION['username'] 不会返回任何内容。
  • 最后一次尝试尝试我在答案中编辑的内容,它是我如何登录的,它对我有用。
  • 我喜欢会话控制的想法,看起来很棒。可悲的是,我用回声替换了标题,它消失了。所以看起来没有会话数据被保存。我想我需要弄清楚为什么。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多