我继承了以下有趣的代码。这个逻辑似乎是多余的,也可能是错误的。
// make the use of sessions possible.
if (!session_id()) {
session_start();
}
然而,它是在大规模用户系统上,我不愿意改变它。尽管有PHP经验,但我很感激社区的投入,以确保我不会错过任何东西。
如果您可以提及当前代码的副作用或洞察力,则获得积分。
也许逻辑不是正确的词。为什么在调用session_id()
之前检查session_start()
,当它始终返回空字符串时,否则代码中的其他位置将被session_start()
调用。
答案 0 :(得分:13)
需要此代码来检查会话是否已启动。如果会话已启动,则无需再次初始化它。此外,尝试在会话已初始化时调用session_start()将导致E_NOTICE错误。
答案 1 :(得分:4)
看看PHP.net:
http://php.net/manual/en/function.session-id.php
session_id()返回当前会话的会话ID或空字符串(“”),如果没有当前会话(不存在当前会话ID)。
如果您要更新代码而不做太多改动,最好写一下:
if (session_id() === "") {
session_start();
}
检查会话是否真的开始。如果对php.net doc进行评论和引用,那么看看开发人员想要完成的工作会更清楚。
请注意,同时:
$test = ""
!$test // This returns true
不太清楚。
答案 2 :(得分:1)
特别是在旧代码中,包含文件作为函数(我已经看过那些)或类似的解决方案,单个代码可以做几件不同的事情:初始化新会话或设置新值。
该代码可用于检查会话是否已启动。在它可能是例如会话数据验证之后,或者与会话完全无关的东西,但是需要存在会话的东西。
这当然意味着程序员知道她在做什么。大多数时候,这种解决方案只是程序员只是从旧的代码库中复制代码,或者现在更有可能从Google复制代码,并调整它直到它不会崩溃,并让它来完成这项工作。
评论(在示例中)意味着不强制会话支持;只有存在会话支持时,它们才会立即生效。 PHP可以在没有会话支持IIRC的情况下编译。在这种情况下,要么是程序员错误,要么函数总是返回false或null,如果不存在会话支持,则返回false。
答案 3 :(得分:0)
我敢回答,因为我正在问同样的问题,因为上面提到的代码片段最初对我来说没有意义(或者)。所以我想知道为什么在php.net网站上随处可见代码,并提出了一个初步的答案。
session_id()
正在发挥作用 session_id()
将返回会话ID。因此,如果我在我的网站上进行了身份验证并且已创建会话并填充了数据,则已创建cookie并将其发送到浏览器
session_start();
$_SESSION['uid'] = 'root';
我在浏览器中打开的下一页应该让PHP看到我从cookie值(和内部文件)提前10秒打开的会话,对吧?因此,在任何session_start()
$sid = session_id();
if ($sid) {
echo "Yes: no need to call session_start since ID is " . $sid;
exit;
}
会显示是吗?
要检查会话是否存在,必须在session_start()
之前致电session_id()
。但是,等等......如果以前不存在会话(或已过期),session_start()
会创建会话。因此,在session_id()
之后调用session_start()
不太可能返回无效结果,并且如果想要检查会话是否存在则没有多大意义。是吗?
有点像require
和require_once
...我的PHP程序中没有任何require_once
。因为我只在必要时执行需要,并且非常乐意让致命错误告诉我 require 已完成两次:意味着一个错误。
与会话相同:我根据上下文在开始时调用session_start()
一次或根本不调用session_id()
,因此不能调用两次(或致命错误)。但我想有些人需要session_start()
告诉他们之前是否已在同一请求中调用session_id()
。这是{{1}}有意义的地方......