如何检查PHP会话是否存在?

时间:2012-10-28 23:40:39

标签: php session

只是想知道如何检查PHP会话是否存在...我的理解是,无论如何,如果我正在使用会话,我必须使用session_start()启动我的文件甚至访问会话,即使我知道它已经存在。

我已经读到用户session_id()以查明会话是否存在,但是因为我必须在调用session_id()之前使用session_start(),而session_start()将创建一个新的ID(如果没有会话,我怎样才能检查会话是否存在?

11 个答案:

答案 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位数字。