【问题标题】:CakePHP sessions not workingCakePHP 会话不起作用
【发布时间】:2013-11-19 19:18:18
【问题描述】:

我正在尝试使用 cakePHP 在会话中保存数据。我已经在线阅读了文档和许多示例,但我似乎无法在会话中保存数据。

在我的控制器中,我添加了会话写入功能:

public function take(){
    if(array_key_exists('option', $this->request->data)){
        foreach($this->request->data['option'] as $cmd => $options){
            foreach($options as $cmd => $option){
                $buildCmnd = '-1 RENDERER*'.$this->request->data['Playlist']['layer'].'*TREE*$master*SCRIPT*INSTANCE*externalCommand SET '.$this->request->data['Playlist']['el'].' '.$cmd.' text={'.$option.'}';
                $this->send($buildCmnd);
            }
        }
    }
    $this->Session->write('TakenCommand', array( $this->request->data['Playlist']['el'] ) );

    $this->autoRender = false;
}

我通过 jquery ajax 调用操作:

$("#inputTake").click(
    function()
    {                
        jQuery.ajax({
            type:'POST',
            async: true,
            cache: false,
            url: '/Controller/take',
            success: function(response) {
                jQuery('#resultField').val(response);
            },
            data:jQuery('form').serialize()
        });
        return false;
    }
);

因为我使用的是 ajax,所以我创建了一个元素,我调用它来检查会话。这是元素的内容:

<pre>
<?php print_r($this->Session->read());?>
</pre>

但是输出中没有出现会话变量“TakenCommand”。

我已将 Session 组件添加到 AppController.php 文件中:

public $components = array('Session');

我已将 core.php 文件会话默认值从“php”更改为“cake”并返回,但似乎都没有帮助。

任何建议将不胜感激!


我看到的一些答案建议在 core.php 中设置 'checkAgent' => false 但这也无济于事。 在 CakePHP 1.x 中可以将安全级别设置为 medium 以解决问题,但在 2.x 中此选项不可用。

【问题讨论】:

  • 你确定你启用了会话支持
  • 我按照 cakephp 网站上的博客教程进行操作,并且 Flash 消息有效。同样使用我正在使用的元素,我得到了配置输出。这意味着启用了会话支持吗?
  • 查看phpinfo()的输出,搜索session看是否开启
  • 在“会话”部分下,启用会话支持
  • 我认为刷新页面后会使用会话。调用 Ajax 后不能直接使用 session。之后你必须刷新页面。

标签: php ajax session cakephp


【解决方案1】:

如果控制器中的 php 打开标记之前有空格或 php 关闭标记之后有空格,将导致无法工作会话。检查您的控制器(和其他组件,如果有的话)在关闭 "?&gt; " 或打开标签 " &lt;?php" 之前有空格/新行

【讨论】:

  • 嗨 romellem,您的回答对我有帮助。很难找到空间。有什么办法可以找到空间吗?
【解决方案2】:

你提到你有这个观点

<?php print_r($this->Session->read());?>

试试这个

<?php print_r($this->Session->read('TakenCommand')); ?>

另外,请确保您添加了“SessionHelper”。

【讨论】:

    【解决方案3】:

    我在使用 Session + AJAX 时遇到了同样的问题。如果您使用 DebugKit.Toolbar,您会注意到即使在 AJAX 响应之后,Session 变量也不会显示在工具栏上。我认为这只是一个显示问题,但可能是其他问题。此外,在我的 AJAX 方法中,我根本无法从 Session 中读取数据。出于您的目的,该限制可能没问题,因为您似乎是在覆盖 Session 变量而不是添加到它上面。

    我最终只使用 POSTback 而不是 AJAX 调用,并且在 AJAX 调用中不起作用的相同代码逻辑在 POSTback 中完美运行。

    【讨论】:

    • 经过更多研究后,我发现 cakePHP 会根据 ajax 请求重置会话。一些答案建议在 core.php 中将 checkAgent 设置为 false 但这并不能解决我的问题。在 CakePHP 1.x 中尽可能降低安全级别来解决问题,但该选项在 2.x 中不可用
    • 我不知道发生了什么,因为您仍然可以在 AJAX 函数中写入 Session 并正确存储它,它只是无法由发起 AJAX 请求的视图访问,直到页面重新加载..在这种情况下,您也可以进行 POSTback。如果您从 AJAX -> POSTback 重构,我相信您的代码逻辑将完美运行,就像我的情况一样。希望 POSTback 行为对您的项目来说不是不可原谅的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多