【问题标题】:Session lost after page redirect in php在php中页面重定向后会话丢失
【发布时间】:2011-03-02 16:31:48
【问题描述】:

当我使用 php 标头重定向时,所有会话变量都会丢失...有人说添加 exit();就在标题之后(“”);会解决问题,但似乎不是解决方案......

有人可以帮忙吗?

这是我将变量存储到会话中的方式:

include 'dbc.php';

$err = array();

foreach($_GET as $key => $value) {
    $get[$key] = filter($value); //get variables are filtered.
}

if ($_POST['doLogin']=='Login')
{

foreach($_POST as $key => $value) {
    $data[$key] = filter($value); // post variables are filtered
}


$user_email = $data['usr_email'];
$pass = $data['pwd'];


if (strpos($user_email,'@') === false) {
    $user_cond = "user_name='$user_email'";
} else {
      $user_cond = "user_email='$user_email'";

}


$result = mysql_query("SELECT `id`,`pwd`,`full_name`,`approved`,`user_level` FROM users WHERE 
           $user_cond
            AND `banned` = '0'
            ") or die (mysql_error()); 
$num = mysql_num_rows($result);

  // Match row found with more than 1 results  - the user is authenticated. 
    if ( $num > 0 ) { 

    list($id,$pwd,$full_name,$approved,$user_level) = mysql_fetch_row($result);

    if(!$approved) {
    //$msg = urlencode("Account not activated. Please check your email for activation code");
    $err[] = "Account not activated. Please check your email for activation code";

    //header("Location: login.php?msg=$msg");
     //exit();
     }

        //check against salt
    if ($pwd === PwdHash($pass,substr($pwd,0,9))) { 
     // this sets session and logs user in  
       session_start();
       session_regenerate_id (true); //prevent against session fixation attacks.

       // this sets variables in the session 
        $_SESSION['user_id']= $id;  
        $_SESSION['user_name'] = $full_name;
        $_SESSION['user_level'] = $user_level;
        $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);

        //update the timestamp and key for cookie
        $stamp = time();
        $ckey = GenKey();
        mysql_query("update users set `ctime`='$stamp', `ckey` = '$ckey' where id='$id'") or die(mysql_error());

        //set a cookie 

       if(isset($_POST['remember'])){
                  setcookie("user_id", $_SESSION['user_id'], time()+60*60*24*COOKIE_TIME_OUT, "/");
                  setcookie("user_key", sha1($ckey), time()+60*60*24*COOKIE_TIME_OUT, "/");
                  setcookie("user_name",$_SESSION['user_name'], time()+60*60*24*COOKIE_TIME_OUT, "/");
                   }
        if(empty($err)){            
          header("Location: myaccount.php");
         }
        }
        else
        {
        //$msg = urlencode("Invalid Login. Please try again with correct user email and password. ");
        $err[] = "Invalid Login. Please try again with correct user email and password.";
        //header("Location: login.php?msg=$msg");
        }
    } else {
        $err[] = "Error - Invalid login. No such user exists";
      }     
}

重定向代码:

//connect database
    require_once 'dbc.php';

    page_protect();

    $authorID = $_SESSION['user_id'];
    if ( !empty($_POST["answ_content"]) && $authorID != 0 ) {
            //vaqciot html chveulebriv texad
            $content = htmlentities($_POST["answ_content"],ENT_COMPAT,'UTF-8');
            $dro = date('Y-m-d H:i:s');
            $qID = $_POST["question_ID"];
            $author = $_SESSION["user_name"];


            $sql="INSERT INTO wp_comments (comment_ID, comment_post_ID, comment_author, comment_author_IP, comment_date, comment_content, user_id) 
                VALUES
              (NULL, '$qID', '$author', '123.123.123.123', '$dro', '$content', '$authorID')";

            $result = mysql_query($sql);

            //pasuxebis raodenobis ertit gazrda
            $increase = "UPDATE wp_posts SET comment_count = comment_count+1 WHERE ID = $qID";
            mysql_query($increase);

            //gadamisamarteba shekitxvis gverdze  
            $url = 'Location:http://example.com/site/answ/question.php?ID=' .$qID;
            header($url);
    } else {
        echo 'error';
    }

【问题讨论】:

  • 请显示一些您要重定向到的代码和一些示例地址。
  • 你能给我们看一些代码吗?是否在用户电脑上启用了 cookie?您是在会话中使用 cookie,还是总是将会话 ID 作为获取参数发送并在重定向时忘记了?
  • 添加了所有必要的代码...
  • 我在其他几台电脑上测试过,效果很好...找不到任何解释...

标签: php session


【解决方案1】:

你需要在你的header重定向之后加上exit();,否则你刚刚将两页内容加载到一页中。

还要确保在所有脚本的顶部都有 session_start();

【讨论】:

  • 我添加了 exit();但它没有用!不幸的是,由于站点结构,我必须使用重定向...
  • 这里的关键是 session_start();在所有页面的顶部
【解决方案2】:

您没有开始会话。为了使用会话变量并让它们跨页面传递,您需要放置

session_start();

在每一页的顶部。

【讨论】:

    【解决方案3】:

    我试图设置我自己的会话 ID:

    session_id('own_generated_session_id_string');
    

    但正如documentation 所说,您必须在此之前使用它

    session_start();
    

    在 session_start() 之后使用它,清除会话参数。

    【讨论】:

      【解决方案4】:

      简单!确保您来自的页面(例如 www.example.com)在开头重定向到(例如 www.example.com/redirect.php)通知 www。如果您将其逐页更改,那么是的,事情会变得很不稳定。

      【讨论】:

      • 同样的问题,标题重定向从一个页面到另一个页面都在变化,我将它切换到整个项目中使用的通用方案,瞧,它工作了.. 我为此操心了至少一个星期。 ..谢谢你,你是救世主......
      【解决方案5】:

      这些会话有时并不总是像我们预期的那样工作。我的网站使用丢失的会话时遇到了类似的问题。我基本上通过在页面第一次加载时将我想在会话中保留的值注入隐藏文本字段来解决它。然后我第二次调用页面(页面提交)时,我只需从隐藏的文本字段中读取值并继续我的其余代码。

      这比在这种情况下使用会话更容易和更干净!

      【讨论】:

      • 也很不安全。一些会话数据只与服务器相关,不应暴露给客户端。
      • 同意 JoSo,会话比视图状态更干净,会话数据不被视为视图状态数据...
      • 隐藏的文本字段是什么意思...?无法通过查看 html 源代码检查的文本字段?
      【解决方案6】:

      退出;应放置在标头重定向或 session_regenerate_id(true) 之后;可以用

      【讨论】:

        【解决方案7】:

        你只需要检查/var/lib/php目录下的文件权限 授予 yje 对 /var/lib/php/session 目录的公共权限。

        一切都完成了。

        【讨论】:

          猜你喜欢
          • 2020-12-14
          • 1970-01-01
          • 2017-09-11
          • 2013-06-19
          相关资源
          最近更新 更多