我正在尝试回显过去15分钟内处于活动状态的每个活动会话,我使用以下代码检查他们上次看到的时间。
$_SESSION['last_seen'] = date("Y-m-d H:i:s");
但是在执行下面的代码时我收到了这些错误,这段代码就是上面的代码。
注意:未定义的索引:last_seen in 第249行的C:\ xampp \ htdocs \ hk \ templates \ default \ index.php警告: 非法字符串偏移' last_seen'在 第249行的C:\ xampp \ htdocs \ hk \ templates \ default \ index.php
<?php
foreach($_SESSION as $s){
if ($s['last_seen'] >= date("Y-m-d H:i:s", strtotime("-900 seconds")))
{
echo $s['username'];
}
}
?>
答案 0 :(得分:2)
长话短说:
1)首先你需要每次都回忆起session_start()(如果还没有)。
2)您无法使用PHP的本机会话处理程序从其他会话中读取。您需要实现自己的会话处理程序。
我猜你刚开始使用PHP。 所以这里有一些关于Web,PHP,会话和cookie需要了解的基本解释:
Cookie:Cookie是小信息,在加载页面时会发送到客户端的浏览器。如果浏览器接受cookie(并非总是如此),他会在每次请求时发送cookie信息。
所以......做类似
的事情<?php
setcookie('my_cookie', 'Hello World!', time() + 60 * 60);
如果客户端正在请求该页面并执行上述代码,则会要求客户端浏览器存储来自your_domain.com的cookie,其名称为“my_cookie”,其中包含“Hello World!”
假设浏览器接受了该cookie,他将在每次加载your_domain.com的页面上发送它 - 只要cookie没有过期。 这允许您在客户端存储小的文本信息,并且您将能够使用$ _COOKIE ['my_cookie']检索和阅读以后的请求。
这与会话有什么关系?没有cookie我们将无法跟踪客户端。 PHP应用程序在请求之间丢失会话信息。
如果客户端在页面上发现错误,首次调用session_start(),PHP将创建一个具有唯一ID的会话Cookie,并在文件系统空间的某处分配数据,存储在$ _SESSION中。这称为“会话存储”。所以你可以开始像$_SESSION['last_seen'] = date("Y-m-d H:i:s");
那样将数据写入$ _SESSION。浏览器将在接下来的几个请求中每次向您的服务器发送该cookie。回想一下session_start(),PHP现在知道已经设置了会话cookie并读取了该ID。如果ID与先前生成的会话存储匹配,则将填充$ _SESSION var并且您可以读取$ _SESSION ['last_seen']的值
您认为使用$ _SESSION可以访问任何用户的所有会话信息,但这是错误的。会话存储将只为您提供该客户端的会话ID特定数据。
正如我之前提到的,您无法使用PHP的本机会话处理程序访问任何其他会话数据,但是您可以实现自己的会话处理程序。
大多数开始编写自己的会话处理程序的人倾向于使用MySQL数据库作为会话存储。我更喜欢使用Redis。
这可能对您有所帮助: 基本PHP会话教程:http://www.phpro.org/tutorials/Introduction-To-PHP-Sessions.html
编写自己的会话处理程序并使用MySQL:http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/
答案 1 :(得分:1)
我认为你不理解$_SESSION
全局数组。它仅包含当前用户会话的数据(不适用于您站点的所有用户)。您应该将这些数据保存在memcached或数据库中。
答案 2 :(得分:-1)
我建议您实际尝试echo "<pre>"; print_r($_SESSION); echo "</pre>"
进行故障排除 - 这将告诉您会话数组的结构。
PS:我相信你已经使用命令session_start()
启动了会话?
答案 3 :(得分:-1)
您可以使用strtotime
来比较两个日期
if (strtotime($s['last_seen']) >= strtotime('+10 minutes')))
{
echo $s['username'];
}