未定义变量:$_SESSION

Posted

技术标签:

【中文标题】未定义变量:$_SESSION【英文标题】:Undefined variable: $_SESSION 【发布时间】:2012-03-27 20:24:27 【问题描述】:

当核心 Cakephp 文件尝试引用从未设置或未设置的会话 (cake/libs/cake_session.php line 372) 时,我在核心 CakePHP 文件中遇到 E_NOTICE 错误:

function read($name = null) 
    if (is_null($name)) 
        return $this->__returnSessionVars();
    
    if (empty($name)) 
        return false;
    
    $result = Set::classicExtract($_SESSION, $name);

我搜索了我的代码(在 app/ 目录中),但找不到对 $_SESSIONsession_destroy 的引用。我错过了什么吗?

当我尝试运行任何单元测试时会出现此错误。这……正常吗?我已经清除了cake/ 目录并将其替换为另一个(相同版本),以确保我没有无意中修改核心文件中的任何内容,但我仍然遇到相同的错误。我不确定这只是框架中的缺陷还是其他原因。

编辑

以下是在命令行上运行的测试结果:

Welcome to CakePHP v1.3.11 Console
---------------------------------------------------------------
App : app
Path: /var/www/program/app
---------------------------------------------------------------
CakePHP Test Shell
---------------------------------------------------------------
Running app case models/owners_equity
E_NOTICE: Undefined variable: _SESSION in /var/www/program/cake/libs/cake_session.php on line 372
E_NOTICE: Undefined variable: _SESSION in /var/www/program/cake/libs/cake_session.php on line 372
ERROR->Unexpected PHP error [Undefined variable: _SESSION] severity [E_NOTICE] in [/var/www/program/cake/libs/cake_session.php line 372]
    in testGenerateOwnerWithdrawals
    in BalanceTestCase
    in /var/www/program/app/tests/cases/models/owners_equity.test.php

ERROR->Unexpected PHP error [Undefined variable: _SESSION] severity [E_NOTICE] in [/var/www/program/cake/libs/cake_session.php line 372]
    in testGenerateOwnerWithdrawals
    in BalanceTestCase
    in /var/www/program/app/tests/cases/models/owners_equity.test.php

【问题讨论】:

你需要确保启动会话:session_start(); 我对 Cake 不熟悉,但你可以在文件顶部(或出错行之前的任何位置)放置一个 session_start()。 你在命令行上运行单元测试吗?确切的错误信息是什么? @Shiplu 我已经添加了命令行的输出 【参考方案1】:

您需要确保在要使用$_SESSION 超全局的每个 PHP 文件的顶部启动会话。像这样:

<?php
  session_start();
  echo $_SESSION['youritem'];
?>

您忘记了会话助手。

查看此链接:book.cakephp.org/2.0/en/core-libraries/helpers/session.html

【讨论】:

我在 core.php 文件中调用Configure::write('Session.start', true);。蛋糕不应该从那里照顾它吗? 你试过 session_start();在第一行 session_name('CAKEPHP'); session_start(); print_r($_SESSION);【参考方案2】:

原来 AppModel 中有一些额外的代码搞砸了:

beforeFindafterFind

App::Import("Session");
$session = new CakeSession();
$sim_id = $session->read("Simulation.id");

我不知道为什么,但这就是问题所在。删除这些行解决了我遇到的问题。

【讨论】:

【参考方案3】:

此警告的另一种可能性(并且很可能是应用行为问题)是应用的原始作者依赖 session.auto_start 处于打开状态(默认为关闭)

如果你不想弄乱代码并且只需要它工作,你可以随时更改 php 配置并重新启动 php-fpm(如果这是一个 web 应用程序):

/etc/php.d/my-new-file.ini

session.auto_start = 1

(这对于 CentOS 8 是正确的,请根据您的操作系统/包装进行调整)

【讨论】:

【参考方案4】:

对于在 CakePHP 4.x 中遇到此问题的任何人:

Argument 1 passed to Cake\Http\Session::_overwrite() must be of the type array, null given, called in /opt/lampp/htdocs/rondeel/vendor/cakephp/cakephp/src/Http/Session.php on line 513

我正在测试我的身份验证表单并使用调试语句发布表单数据。事实证明,这会导致在会话开始之前发送标头,从而导致 Cake\Http\Session::start() 方法失败:

if (ini_get('session.use_cookies') && headers_sent()) 
    return false;

解决方案:确保在会话开始之前不要回显或调试任何内容。

【讨论】:

以上是关于未定义变量:$_SESSION的主要内容,如果未能解决你的问题,请参考以下文章

删除 $_SESSION 时未定义的索引

标头重定向后未定义PHP会话索引?

未定义的变量:_get XAMPP PHP

未定义变量:Laravel 5.3 中的 _ENV

如果 __name__ == '__main__' 之后未定义 Python 变量

Svelte 中的环境变量 - __myapp 未定义