只是想知道如何检查PHP会话是否存在...我的理解是,无论如何,如果我正在使用会话,我必须使用session_start()启动我的文件甚至访问会话,即使我知道它已经存在。
我已经读到用户session_id()以查明会话是否存在,但是因为我必须在调用session_id()之前使用session_start(),而session_start()将创建一个新的ID(如果没有会话,我怎样才能检查会话是否存在?
答案 0 :(得分:23)
在5.4之前的PHP版本中,您可以只使用session_id()
函数:
$has_session = session_id() !== '';
在PHP版本5.4+中,您可以使用session_status()
:
$has_session = session_status() == PHP_SESSION_ACTIVE;
答案 1 :(得分:16)
isset($_SESSION)
那应该是它。如果您想检查单个会话变量是否存在,请使用if(isset($_SESSION['variablename']))
。
答案 2 :(得分:7)
在PHP中有一种称为会话名称的东西。如果会话已经启动,该名称将与设置的cookie相关联。
因此,如果有可用的会话cookie,您可以检查$_COOKIE
数组。 Cookie通常是将会话名称的会话ID与浏览器交换的首选形式。
如果cookie已经存在,则意味着之前已启动PHP会话。如果没有,则session_start()
将创建新的会话ID和会话。
如果在那里设置会话的cookie,则检查第二种方法是check the outgoing headers。如果它是新会话,它将被设置。或者,如果会话ID已更改。
答案 3 :(得分:5)
我发现它最好多次(取决于应用程序的性质)来简单地测试以查看是否在客户端中设置了会话cookie:
<?php
if (isset($_COOKIE["PHPSESSID"])) {
echo "active";
} else {
echo "don't see one";
}
?>
当然,更换默认会话名称&#34; PHPSESSID&#34;使用您正在使用的任何自定义。
答案 4 :(得分:3)
isset($ _ SESSION)是不够的,因为如果在同一次执行中创建并销毁了会话(使用session_destroy()
), isset($ _ SESSION) )将返回 true 。当使用第三方代码时,如果不知道这种情况,可能会发生这种情况。 session_id()
正确地返回一个空字符串,并且可以在session_start()
之前调用。
答案 5 :(得分:0)
您可以在session_start之前调用session_id。 http://www.php.net/manual/en/function.session-id.php - 阅读id参数
答案 6 :(得分:0)
我一直都在使用
if (@session_id() == "") @session_start();
我还没有失败。
用了很长时间。
注意:@
只是抑制警告。
答案 7 :(得分:0)
将session_id
存储在$_SESSION
中并对其进行检查。
第一次
session_start();
$_SESSION['id'] = session_id();
启动会话并存储随机给定的会话ID。
下次
session_start();
$valid_session = isset($_SESSION['id']) ? $_SESSION['id'] === session_id() : FALSE;
if (!$valid_session) {
header('Location: login.php');
exit();
}
启动会话,检查当前会话ID和存储的会话ID是否相同(使用三元?作为php中不存在的短路AND的替代)。如果没有,请再次登录。
答案 8 :(得分:0)
关闭错误报告,如果注意到您的PHP版本在您的PHP代码上放置
error_reporting(0);
答案 9 :(得分:0)
在调用session_start()
之前检查会话是否存在if(!isset($_SESSION))session_start();
答案 10 :(得分:-1)
三年前我解决了这个问题,但是我无意中从计算机上删除了文件。
它是这样的。用户必须按照我想要的顺序访问的3页。 1)每个php页面的顶部
enter code here
会话开始(); enter code here
2)第一页:
a)enter code here
$ _ session [&#34; timepage1&#34;] = php日期函数; time()简单易用
b)enter code here
$ _ session [&#34; timepage2&#34;] = $ _session [&#34; timepage1&#34;];
b)enter code here
$ _ session [&#34; timepage3&#34;] = $ _ session [&#34; timepage1&#34;];
3)第二页:
a)enter code here
$ _ session [&#34; timepage2&#34;] = php日期函数; time()简单易用
b)enter code here
$ _ session [&#34; timepage3&#34;] = $ _session [&#34; timepage3&#34;];
3)第三页:
a)enter code here
$ _ session [&#34; timepage3&#34;] =一个php日期函数; time()简单易用
逻辑: 如果timepage3小于第2页的timepage3 {用户在第2页之前已经进入第3页}
如果第2页上的timepage2小于timepage1 {用户可能正试图破解我们希望他们在第1页上做的第二页}
timepage1永远不应该在除page1之外的任何页面上等于timepage2或timepage3,因为如果在第二或第三页上它不是更大,则用户可能正在尝试破解&#34;做某事&#34;
你可以用3个timepage1-2-3变量用简单的算术做复杂的事情。您可以重定向或发送消息说,请转到第2页。您还可以告诉用户是否跳过第2页然后发送回第2页或第1页,但最好的安全功能是什么都没有,只是重定向回第1页。
如果你enter code here
回显时间();在每个页面上,在测试期间,如果您按正确的顺序访问,您将看到最后3位数字。