15

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

我已阅读用户 session_id() 以了解是否存在会话,但由于我必须在调用 session_id() 之前使用 session_start(),并且如果没有会话,session_start() 将创建一个新 ID,如何我可以检查会话是否存在吗?

4

11 回答 11

26

在 5.4 之前的 PHP 版本中,您可以只使用以下session_id()函数:

$has_session = session_id() !== '';

在 PHP 5.4+ 版本中,您可以使用session_status()

$has_session = session_status() == PHP_SESSION_ACTIVE;
于 2012-10-28T23:42:02.320 回答
18
isset($_SESSION)

应该是这样的。如果您想检查是否存在单个会话变量,请使用if(isset($_SESSION['variablename'])).

于 2012-10-28T23:47:13.023 回答
10

我发现最好(取决于应用程序的性质)简单地测试以查看是否在客户端中设置了会话 cookie:

<?php

if (isset($_COOKIE["PHPSESSID"])) {
    echo "active";
} else {
    echo "don't see one";
}

?>

当然,将默认会话名称“PHPSESSID”替换为您正在使用的任何自定义名称。

于 2016-02-07T13:40:57.450 回答
7

在 PHP 中有一个叫做会话名称的东西。如果会话已经开始,该名称与将要设置的 cookie 相关。

$_COOKIE因此,如果有可用的会话 cookie,您可以检查数组。Cookie 通常是与浏览器交换会话名称的会话 ID 的首选形式。

如果 cookie 已经存在,则意味着 PHP 会话已较早启动。如果没有,那么session_start()将创建一个新的会话 id 和会话。

第二种检查方法是检查传出标头是否设置了会话的 cookie。如果它是一个新会话,它将被设置。或者如果会话 id 发生了变化。

于 2012-10-28T23:49:45.947 回答
3

isset($_SESSION)是不够的,因为如果session_destroy()在同一次执行中创建和销毁会话(使用 ),isset($_SESSION)将返回true。当使用 3rd 方代码时,这种情况可能会在您不知情的情况下发生。session_id()但是,正确返回一个空字符串,并且可以在session_start().

于 2014-03-16T01:46:04.913 回答
0

您可以在 session_start 之前调用 session_id。http://www.php.net/manual/en/function.session-id.php - 读取 id 参数

于 2012-10-28T23:46:41.507 回答
0

我一直只是简单地使用

if (@session_id() == "") @session_start();

还没有让我失望。

使用这个已经很久了。

注意@简单地抑制警告。

于 2014-02-10T16:08:45.107 回答
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 的替换)。如果没有,请再次登录。

于 2015-03-05T12:56:25.123 回答
0

如果注意在您的 php 版本中工作,请关闭错误报告将您的 php 代码放在首位

error_reporting(0);

于 2016-08-17T05:29:25.727 回答
0

在调用 session_start() 之前检查会话是否存在

if(!isset($_SESSION))session_start();
于 2017-09-06T05:36:54.643 回答
-1

我在三年前解决了这个问题,但我无意中从我的电脑上删除了文件。

它是这样的。用户必须按我想要的顺序访问的 3 个页面。

1)每个php页面 enter code here会话的顶部start();enter code here 2) 第一页: a) enter code here$_session["timepage1"] = 一个 php 日期函数;time() 简单易用 b) enter code here$_session["timepage2"]= $_session["timepage1"]; b) enter code here$_session["timepage3"]=$_session["timepage1"]; 3) 第二页:a) enter code here$_session["timepage2"] = 一个 php 日期函数;time() 简单易用 b) enter code here$_session["timepage3"]= $_session["timepage3"]; 3) 第三页: a) enter code here$_session["timepage3"] = 一个php日期函数;time() 简单易用

逻辑:如果第 2 页上的 timepage3 小于 timepage3 {用户在第 2 页之前到第 3 页做某事}

如果第 2 页上的 timepage2 小于 timepage1 {用户可能试图破解第 2 页,我们希望他们在第 1 页做点什么}

timepage1 在除 page1 之外的任何页面上都不应等于 timepage2 或 timepage3,因为如果在第二页或第三页上它不是更大,则用户可能试图破解“做某事”

您可以使用 3 个 timepage1-2-3 变量通过简单的算术来完成复杂的事情。您可以重定向或发送消息说请转到第 2 页。您还可以判断用户是否跳过第 2 页。然后发送回第 2 页或第 1 页,但最好的安全功能是什么都不说,只需重定向回第 1 页。

如果你enter code here回显 time(); 在每个页面上,在测试期间,如果您以正确的顺序访问,您将看到最后 3 位数字上升。

于 2017-10-30T20:29:04.077 回答