【问题标题】:Using session variable to use info on different pages使用会话变量来使用不同页面上的信息
【发布时间】:2014-03-24 02:06:24
【问题描述】:

我有点问题。我正在尝试建立一个只有三个 .php 页面的简单网页。我希望在用户登录时设置会话变量 $_SESSION['userID'],并且我希望索引页面在有人登录时显示额外信息。

在 index.php 上我想显示一些信息,如果用户登录我想显示一些额外的信息。 login.php - 简单的登录表单。 login_exe.php - 负责数据库连接和验证。

这就是我的想法:

在 index.php 上,检查会话是否启动,如果没有:启动。

<?php

if (!isset($_SESSION)) {
  session_start();
  echo "session started";
}

稍后,检查 $_SESSION['userID'] 是否包含一个值,如果是:打印一个字符串

if($_SESSION['userID'] != null){
   echo "User logged in";
}

在 login_exe.php 我有几乎相同的代码:

<?php

if (!isset($_SESSION)) {
  session_start();
    echo "session started";
}

在验证功能中:

$_SESSION['userID'] = $data['userID'];
header("Location: index.php");

问题是每个页面都会启动一个新会话。我该如何解决这个问题并且只开始一次会话?提前致谢

【问题讨论】:

  • 首先,将session_start(); 呼叫放在首位。总是。
  • session_start() 应始终位于文档顶部。而不是检查整个$_SESSION 检查$_SESSION['key']
  • 我应该删除 "if (!isset($_SESSION)) {" 子句并只使用 session_start() 吗?我需要在 index 和 login_exe.php 上都有 session_start() 吗? @vlzvl
  • 您应该将session_start(); 放在使用会话的文档之上。如果您有 5 个使用会话的 .php 文件,则将 5 倍的 session_start() 放在它们上面。这是因为session_start() 发送headers。然后,您应该使用 isset($_SESSION["foo"]) 之类的东西,而不仅仅是整个 $_SESSION 数组,其中 foo 是您之前设置的东西。
  • @vlzvl 你应该把它作为答案,这对我帮助很大!

标签: php session


【解决方案1】:

我认为 PHP 手册与 ...ahm 相比非常好,所以只需阅读有关 session_start() 的内容。它说:

session_start() 创建会话或恢复当前会话 (...)

所以您只需要在代码的早期就使用 session_start()。这必须在每个请求(可能包括在内)上执行。

您检查 userId 的代码看起来不错,这里有一个重要提示:您应该确切地知道 isset()、empty() 等在 PHP 中的含义,因此请随时准备好 comparision of comparison

【讨论】:

    【解决方案2】:

    您不应该在 cmets 中提出新的答案(编辑:问题)。在这里像编码一样系统化。

    如何结束会话:

    这提供了讨论的空间,因为会话 cookie 是客户端,会话数据是服务器端。

    我推荐:

    $_SESSION = null;
    

    原因:这将立即清除所有登录和其他相关数据。它使 cookie 保持原样,这通常是无关紧要的,因为所有相关数据都已消失。

    【讨论】:

    • 谢谢你,虽然我在你回答之前删除了评论。不过还是谢谢你!
    • 您也不应该以用户身份发布 2 个答案
    【解决方案3】:

    您应该将session_start() 放在使用会话的文档之上。比如说,如果您有 5 个使用会话的 .php 文件,那么将 5 倍的 session_start() 放在它们上面。

    这是因为session_start() 发送标头,并且标头必须在任何输出之前发送(例如,任何 echowhitespace)。

    然后,您应该使用类似 isset($_SESSION["foo"]) 的东西,而不仅仅是整个 $_SESSION 数组,其中 foo 是您之前设置的东西。

    如果您根本不想要会话或需要重置整个阵列,只需调用session_destroy() 即可有效地破坏当前会话。当你想摆脱一个键时使用unset($_SESSION["foo"])

    最后,您可能会遇到奇怪的情况,您无法读取您写入的会话密钥。在这些情况下,检查会话的路径是什么以及它们是否可写,或者更改它们的路径:

    $path = session_save_path();        // what is the path
    
    is_writable($path);                 // can i write to it?
    
    session_save_path("my/new/path");   // change the darn path; 
                                        // put -even- before session_start()!
    

    :) 很高兴我能帮上忙

    【讨论】:

      猜你喜欢
      • 2012-12-24
      • 2011-08-17
      • 2013-10-09
      • 1970-01-01
      • 2017-05-21
      • 2015-06-22
      • 2012-04-14
      • 2020-01-16
      • 2011-06-02
      相关资源
      最近更新 更多