如何获取/设置session_id(),或者它应该自动生成?

7

我在应用程序中实现了一些基本的会话处理。在每个页面中,我都会检查用户是否已登录。如果他们已经登录,则通过$_SESSION['user_id']识别他们,并将他们的登录/注销记录在MySQL表中。

我还想根据唯一ID记录访客(未登录)的访问。我曾经认为一旦调用session_start(),就会自动生成一个内部session_id,并且通过调用session_id()可以检索到它。但是这只会导致“未定义变量”错误,所以我猜我必须手动设置它...?如果是这样,那么最好的方法是什么,以便它是一个唯一的ID,或者通常的方法是什么?

谢谢任何帮助...

3个回答

39

在PHP中使用session和session ID有两种方式:

1 - 自动生成会话ID并获取它:

session_start();
$id = session_id();

2 - 手动设置会话ID,然后启动它:

session_id( 'mySessionId' );
session_start();
如果您打算< strong>设置会话ID,则必须在调用session_start()之前设置它; 如果您打算生成随机的会话ID(或继续在上一个页面请求中已经开始的会话),然后获取该ID以供其他用途,您必须先调用session_start() ,然后再尝试使用session_id()检索会话ID。

抱歉,我删除了上一条评论。现在我看到了我的错误!感谢您提供的信息。 - questioner
没问题 :) 很高兴我能帮到你。 - Brian

1

是的,我刚在测试页面上尝试了一下,它按照你的建议运行良好。但是在我的应用程序中,我正在使用一个类来管理我的会话,并且只从构造函数中调用session_start()一次。因此,问题似乎仅出现在类方法中获取/设置session_id(),但在$_SESSION数组中获取/设置变量时没有问题。不过还是谢谢你,我之前不知道它会静默启动。 - questioner
@grainne:不不不,你没理解我的意思。这是我的沙盒的行为 - 会话自动启动,所以你无法在“显示代码”中看到它,你必须先使用session_start(),然后才能使用session_id() - genesis
谢谢你的解释。我现在明白你的意思了,第一次我以为那只是一些复制粘贴的代码。不确定当时发生了什么 :/ 我稍后需要进行一些适当的测试... - questioner

0

嗯,这可能有点奇怪,但当我需要唯一的ID时,我使用uniqid()


不知道这个 :) 我想我会使用类似于 $_SESSION['guest_id'] 的东西,再加上 uniquid,因为 session_id() 不知道为什么无法工作! - questioner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接