一次为多个用户提供 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 CoreAnimation 一次为多个 UIView 设置动画