一次为多个用户提供 PHP $_SESSION

Posted

技术标签:

【中文标题】一次为多个用户提供 PHP $_SESSION【英文标题】:PHP $_SESSION for multiple users at once 【发布时间】:2012-08-09 12:15:53 【问题描述】:

我想知道 $_SESSION 数组是如何工作的。如果我有很多用户使用我的网站,我需要为每个用户设置一个子数组吗?例如现在我有

$_SESSION['userid'] = $userid;
$_SESSION['sessionid'] = $sessionid;
$_SESSION['ipaddress'] = $ipaddress;

但是为了应付更多的用户,我需要做一个多维数组吗?

$_SESSION[$userid]['sessionid'] = $sessionid;
$_SESSION[$userid]['ipaddress'] = $ipaddress;

$_SESSION 全局是按客户端处理还是整体处理?在登录时设置 $_SESSION['userid'] 会踢出前一个用户并恢复最新登录的用户吗?

【问题讨论】:

据我所知,会话是客户端,这意味着存储在浏览器中。不是服务器端。在这种情况下,同时拥有多个用户应该不是问题,因为将为每个单独的用户创建会话。 @s3polz 你错了。 $_SESSION 存储在服务器端。 @s3polz 你被会话标识符弄糊涂了 抱歉我的错误信息。但是会话仍然为每个用​​户单独创建对吗? 【参考方案1】:

没有。为每个用户创建了一个单独的$_SESSION。这一切都由服务器完成,您不必担心。编写代码时,将$_SESSION 视为站点上只有一个用户。

编辑:实际上,仔细想想,这是一个很好的问题。问这些问题很好,这意味着您正在认真考虑您的代码如何真正工作。继续问这些问题,并继续测试。我有一种感觉,有一天你会写出一些惊人的代码。

因此,请注意,以下是来自apache 网站的一些信息:

什么是会话?

会话接口的核心是一个键值对表,可跨浏览器请求访问。根据使用会话的应用程序的需要,可以将这些对设置为任何有效的字符串。

在服务器上保持会话

Apache 可以配置为跟踪存储在特定服务器或服务器组上的每个用户会话。此功能类似于典型应用程序服务器中可用的会话。

如果已配置,会话将通过使用存储在 cookie 中的会话 ID 进行跟踪,或者从嵌入在 URL 查询字符串中的参数中提取,如典型的 GET 请求中所示。

还有来自 Sessions 上的php docs:

PHP 中的会话支持包括一种在后续访问中保留某些数据的方法。这使您能够构建更多定制的应用程序并增加您网站的吸引力。

访问您网站的访问者被分配一个唯一的 ID,即所谓的会话 ID。这要么存储在用户端的 cookie 中,要么在 URL 中传播。

会话支持允许您在 $_SESSION 超全局数组中存储请求之间的数据。当访问者访问您的站点时,PHP 将自动检查(如果 session.auto_start 设置为 1)或根据您的请求(显式通过 session_start() 或隐式通过 session_register())检查是否已随请求发送了特定会话 ID。如果是这种情况,则重新创建先前保存的环境。

【讨论】:

对于那些想知道$_SESSION数据存储在哪里的人***.com/questions/454635/… @Black_Stormy 看到人们想要了解他们的代码并知道它在内部是如何工作的,而不仅仅是希望获得最好的结果,这实际上是一种奇妙而令人耳目一新的感觉。 感谢您的先发制人的赞美!编辑:所以 session_id() 函数有点像每个用户的会话子数组名称,$_SESSION[session_id][userid] 但你永远看不到它,也不必处理它。谢谢! @Black_Stormy 如果你仔细想想,它更像是有一个这样的数组:[userID]->_SESSION[] 为每个用户。 有什么方法可以在单个页面中维护所有会话详细信息(例如:该文件必须与会话详细信息同步,如果某些会话销毁或创建新会话,它应该在其中复制,我需要它来列出当前都登录到该网站的用户)【参考方案2】:

在经过大量搜索和会议之后,我找到了自己的方式。我希望它对这里的每个人都有效

这是我的用户的登录页面查询: 在匹配来自 mysql 的数据后,我在这里将电子邮件存储为来自输入字段的会话

<?php
include_once("dbcon.php");
$que=mysqli_query($con,"select * from agents where companyemail='$email' AND 
pass='$password' AND post != 'Owner'"); 
$record = mysqli_fetch_assoc($que);
$_SESSION[$email]=$email;
header("Location:/dashboard/woresk/Dashboard_For_Agents/light/index.php? 
&loginid=$agentid");
?>

然后在用户的仪表板中有一个我使用此方法的注销选项

<?php
session_start();
include_once("dbcon.php");
$sid=$_GET['loginid'];
$que=mysqli_query($con,"select * from agents where id='$sid'"); 
$recorde = mysqli_fetch_assoc($que);
$email=$recorde['companyemail'];
unset($_SESSION[$email]); 
header('location:/dashboard/woresk/index.php');
?>

为了避免用户在未登录或未设置会话时进入仪表板,以下代码对我很有用

<?php
session_start();
include_once("dbcon.php");
$sid=$_GET['loginid'];
$que=mysqli_query($con,"select * from agents where id='$sid'"); 
$recorde = mysqli_fetch_assoc($que);
$email=$recorde['companyemail'];
if(isset($_SESSION[$email]) && isset($_SESSION['alllogout']))

 
 else if(!isset($_SESSION[$email]))
    echo 
    "<script>
      window.location.href='/dashboard/woresk/index.php'
    </script>";
  
  else if (!isset($_SESSION['alllogout']))
    echo 
    "<script>
      window.location.href='/dashboard/woresk/index.php'
    </script>";
  
  ?>

我希望这也适用于其他人。如果有任何问题请告诉我

【讨论】:

嘿伙计,你使用了一些非常古老的 sql 东西——你不应该使用mysqli_fetch_assoc——而应该使用 PDO 类和准备好的语句。阅读:phpdelusions.net/pdo 全部阅读。升级! 这包含一些SQL注入漏洞,应该不惜一切代价避免。

以上是关于一次为多个用户提供 PHP $_SESSION的主要内容,如果未能解决你的问题,请参考以下文章

是否可以一次为多个指令定义 $IFDEF ?

使用 CoreAnimation 一次为多个 UIView 设置动画

phpMyAdmin 一次为多个表“转储一些行”

一次为每次点击生成一个唯一的ID [重复]

我如何编写将一次更新多个表的授权访问的 PLSQL 查询 |SQL Developer|

C# 三个布尔值,一次为真 [关闭]