未定义的变量:$ _SESSION

时间:2012-03-10 20:52:32

标签: php session cakephp e-notices

我在核心CakePHP文件中尝试引用永不设置或未设置的会话(E_NOTICE)时出现cake/libs/cake_session.php line 372错误:

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

4 个答案:

答案 0 :(得分:69)

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

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

你忘记了Session HELPER。

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

答案 1 :(得分:3)

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

<{1}}和beforeFind中的

afterFind

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

答案 2 :(得分:1)

对于在 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;
}

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

答案 3 :(得分:0)

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

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

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

session.auto_start = 1

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