首页 > 解决方案 > 为什么 PHP 假定会话已启动时未启动?

问题描述

php伙计们,

为什么在第二页加载(同一页面)时,ELSEIF 没有触发?

我的期望:在第一次加载页面时,应该触发 IF,因为一开始没有会话。

然后应该开始一个会话。设置为'$_SESSION['form_step'] = 'start'

最后,设置为:

$_SESSION['form_step'] = 'end';

在第二次页面加载(重新加载同一页面)时,ELSEIF应该触发,因为会话之前已启动并设置为:$_SESSION['form_step'] = 'end'

if(!session_id() || $_SESSION['form_step'] != 'end') 
{
    session_start();
    $_SESSION['form_step'] = 'start';
    echo "Line: 28 "; echo "Session Step: "; echo $_SESSION['form_step']; echo "<br>";
    echo "Line: 29 "; echo "New Session Id: "; echo session_id(); echo "<br>";
    $_SESSION['form_step'] = 'end';
}
elseif($_SESSION['form_step'] == 'end') 
{
    echo "Line: 35 "; echo "Session Step: "; echo $_SESSION['form_step']; echo "<br>";
    echo "Line: 36 "; echo "New Session Id: "; echo session_id(); echo "<br>";
}

结果:

在第二次页面加载或同一页面重新加载时,即使存在会话,ELSEIF也不会触发,而是IF触发,就好像不存在会话或之前没有启动会话或尚未启动会话一样。这是为什么?当您测试代码时,您将看到: 在第一个页面加载时,IF将触发。到目前为止,一切都很好。

但是刷新页面会导致IF再次触发相同的内容,而不是ELSEIF!不好!令人费解。我很困惑。在每次重新加载页面时,我都会得到相同的回应:

Line: 28 Session Step: start 
Line: 29 New Session Id: ri4pbr42623g9uoaiiq3ebr41r

编辑 1 我根据 Alvaro Gonzales 和 Ben Foster 的建议编辑了以下代码:

<?php
error_reporting(E_ALL);
session_start();

if(!session_id() || session_id() != $session_id || $_SESSION['form_step'] != 'end') 
{
    session_start();
    $_SESSION['form_step'] = 'start';
    echo "Line: 28 "; echo "Session Step: "; echo $_SESSION['form_step']; echo "<br>";
    echo "Line: 29 "; echo "New Session Id: "; echo session_id(); echo "<br>";
    $_SESSION['form_step'] = 'end';
    $session_id = session_id();
}
elseif($_SESSION['form_step'] == 'end') //Q2. WHY THIS IF GETS TRIGGERED WHEN CLICKING ANY NUMBERED PAGE LINKS (ON PAGINATION SECTION (EG PAGE 1 2 3 ETC.)) SINCE SESSION ID ALREADY EXISTS DUE TO ['form_step'] = 'end' ?
{
    echo "Line: 35 "; echo "Session Step: "; echo $_SESSION['form_step']; echo "<br>";
    echo "Line: 36 "; echo "New Session Id: "; echo session_id(); echo "<br>";
}

我现在收到此错误:

注意:未定义变量:第 5 行 C:\xampp\htdocs\power.page\pagination_test_SIMPLE.php 中的 session_id

注意: session_start():会话已经开始 - 忽略 C:\xampp\htdocs\power.page\pagination_test_SIMPLE.php 第 7 行**

随着错误,我得到了我的回声:

Line: 28 Session Step: start
Line: 29 New Session Id: s3sojmnogkhkmga43fhk1u2j17**

如何在不看到错误的情况下解决此问题?注意:在页面第一次加载时,我需要触发 IF,以便它找不到会话并创建一个。

Sets $_SESSION['form_step'] = 'start';
Then $_SESSION['form_step'] = 'end';

然后当我重新加载页面时,我需要 PHP 找到$_SESSION['form_step'] == 'end'并再次触发IFELSE和不一样IF

为什么我需要ELSEIF在页面重新加载时触发?是因为当页面重新加载时,我需要触发任务 2。第一次加载页面时,我需要触发任务 1。

IF处理任务 1。ElseIF处理任务 2。这是一个复杂的脚本。我在这里只给出了一个相关的片段。

编辑2 如果我离开IF这个:

if(!session_id())

然后 IF 永远不会触发。总是ELSE. 我需要 IF 在页面第一次加载并启动会话并执行第一个任务时触发。然后只要会话存在,在每次页面刷新/重新加载时,我都需要ELSEIF触发来执行第二个任务。此代码不起作用...

<?php
error_reporting(E_ALL);
session_start();

if(!session_id()) 
{
    session_start();
    $_SESSION['form_step'] = 'start';
    echo "Line: 28 "; echo "Session Step: "; echo $_SESSION['form_step']; echo "<br>";
    echo "Line: 29 "; echo "New Session Id: "; echo session_id(); echo "<br>";
    $_SESSION['form_step'] = 'end';
    $session_id = session_id();
}
elseif($_SESSION['form_step'] == 'end')
{
    echo "Line: 35 "; echo "Session Step: "; echo $_SESSION['form_step']; echo "<br>";
    echo "Line: 36 "; echo "New Session Id: "; echo session_id(); echo "<br>";
}

标签: phpsession

解决方案


session_start()需要在尝试访问任何会话变量之前调用,即使在刷新页面时也是如此。

因此,刷新页面时,会话当前未处于活动状态。因此,您的 if 语句评估为真。

尝试移动session_start()到文件的顶部。


推荐阅读