php - 为什么 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>";
}
解决方案
session_start()
需要在尝试访问任何会话变量之前调用,即使在刷新页面时也是如此。
因此,刷新页面时,会话当前未处于活动状态。因此,您的 if 语句评估为真。
尝试移动session_start()
到文件的顶部。
推荐阅读
- android - 相机传感器部分解析/处理以提高帧率
- ios - 移出可见 tableView 后 TableViewCell 有灰色背景
- c# - 测试已成功执行,但报告未扩展报告未在 specflow 中生成
- php - 如何交叉多个多维数组
- python - 从 Flask-SQLAlchemy 获取 UTC 中的 DateTime 字段
- office-ui-fabric - Office UI Fabric React:下拉组件
- sitecore - 使字段只读,除了在 Sitecore 中具有特定角色的用户之外的所有用户?
- javascript - 将文件名设置为 Blob 文件
- php - 最好的插入方式。或 , 显示货币时为整数
- javascript - 鼠标悬停时如何更改段落文本?