CodeIgniter 3 - flashdata()在页面重新加载后始终返回null

oxiaedzo  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(81)

从CodeIgniter 2迁移到CI3. PHP 8.2
通过查看网络流量,我已经确认没有多个请求。只有4个其他文件从同一台服务器加载,它们是favicon,两个svg文件和一个JavaScript脚本,没有一个通过CI。此外,如果多个请求导致了这个问题,那么在旧的CI2系统中也会发生这种情况,但这工作正常。
调用set_flashdata()会在session_ci3表中设置相应的记录。如预期的那样,删除页面会从记录中删除flashdata。
如果在set_flashdata()之后立即调用flashdata(),则调用flashdata()将返回正确的值。

$mytestmessage = $this->session->flashdata('mytestmessage');
echo "Old testmessage: $mytestmessage";
$this->session->set_flashdata('mytestmessage', 'THIS IS A TEST FLASHDATA MESSAGE');
$mytestmessage = $this->session->flashdata('mytestmessage');
echo "New testmessage: $mytestmessage";

字符串
多次运行上述代码的输出总是:“旧测试消息:新测试消息:这是一个测试闪存数据消息”
预期输出为“旧测试消息:这是一条测试 Flink 数据消息新测试消息:这是一条测试 Flink 数据消息”
该问题未在下文中得到答复:

7kqas0il

7kqas0il1#

首先,flashdata本身在CI3.x中已经是一个遗留方法,只是为了向后兼容:
这是一个遗留方法,保留它只是为了向后兼容旧的应用程序。您应该直接访问$_SESSION。

TL; TD;

使用php 8.1.2 flashdata工作完美无瑕
使用php 8.2.9旧版网站可能会抛出弃用警告,如果应用程序环境设置为“开发”;这些警告将禁用flashdata流
你可以通过在根目录index.php中将应用程序环境设置为“testing”或“production”来解决这个问题。这样就不会抛出弃用警告,flashdata会按设计工作。

深入查看:

在php8.1之前,不会抛出创建动态属性的弃用警告
在php 8.2中,这些警告显示为
留言:Creation of dynamic property ... is deprecated
在未来的php 9.x中,请注意这些弃用警告将实际上是一个错误,请参阅PHP RFC: Deprecate dynamic properties,内置属性AllowDynamicProperties提供了解决方案。
现在如果你仔细看看CI的系统/核心,你会发现罪魁祸首是Exceptions.php函数show_php_error(...)。它有一个include(),它执行一个新的请求,因此“杀死”你的闪存数据。
当环境设置为“测试”或“生产”并且flashdata继续无缝时,不调用此函数(针对弃用警告)。

oymdgrw7

oymdgrw72#

flashdata在新版本的php中不再支持,你应该用tempdata替换flashdata。

$mytestmessage = $this->session->tempdata('mytestmessage');
echo "Old testmessage: $mytestmessage";
$this->session->set_tempdata('mytestmessage', 'THIS IS A TEST FLASHDATA MESSAGE', 5);
$mytestmessage = $this->session->tempdata('mytestmessage');
echo "New testmessage: $mytestmessage";

字符串
更多详情:CodeIgniter Session Library

相关问题