【问题标题】:CakePHP - Session being written, then lost on page refreshCakePHP - 会话被写入,然后在页面刷新时丢失
【发布时间】:2012-09-07 15:39:48
【问题描述】:

这是 CakePHP 1.3

我有一个 5 步的订单表格,在每个步骤之后存储新的会话数据。在用户完成订单的最后一步之前,这每一步都能完美运行。

在最后一步,我保存了订单,然后设置了一个会话标志来表示它已经完成。这样,如果用户刷新页面,它就不会再次下订单。

问题是,我在会话中设置了标志,如果我调试会话,它就在那里。在页面刷新时,会话已完全恢复到以前的状态,没有新值。

// Controller action for step 5 of the form

public function step5() {

    // FIRST DEBUG
    debug($this->Session->read('order'));

    // Load from session so that the view can display the order information
    $this->data = $this->Session->read('order');

    // Save order if not already completed
    if (!$this->Session->check('order.complete')) {

        // Adds to the database
        if ($this->_saveOrder($this->data)) {

            // Set flag so if the user refreshes, it won't save again
            $this->Session->write('order.complete', true);

            // SECOND DEBUG
            debug($this->Session->read('order'));

        }
    }
}

在页面加载的第一次调试中,会话如下所示:

Array
(
    [Order] => Array
        (
            [value1] => 4566
            [value2] => 'test'
            [value3] => 0
            [value4] => 0
        )
    [Customer] => Array
        (
            [fname] => test
            [sname] => test
            [email] => test@torg.co.uk
            [tel] => 0123456789
        )

)

然后第二次调试显示新的会话标志已经写入会话:

 Array
(
    [Order] => Array
        (
            [value1] => 4566
            [value2] => 'test'
            [value3] => 0
            [value4] => 0
        )
    [Customer] => Array
        (
            [fname] => test
            [sname] => test
            [email] => test@torg.co.uk
            [tel] => 0123456789
        )
    ['complete'] => true

)

但是,如果我刷新页面,complete 标志消失了,会话完全恢复到以前的状态,并且保存再次运行,因为标志不存在。标志写入后没有代码,因此不会被删除。

Array
(
    [Order] => Array
        (
            [value1] => 4566
            [value2] => 'test'
            [value3] => 0
            [value4] => 0
        )
    [Customer] => Array
        (
            [fname] => test
            [sname] => test
            [email] => test@torg.co.uk
            [tel] => 0123456789
        )

)

会话编写在所有其他步骤上都可以正常工作。我可以在页面之间添加/更新会话变量,它们可以正常工作并在页面和页面刷新之间持续存在。

我不知道这是否与我的配置设置或什么有关。我不知道为什么仅在此页面上会发生这种情况。我还注意到有时,非常罕见,在为 AGES 撕掉头发并清除缓存几次等之后,它似乎会短暂工作一次,然后再次停止工作。

这可能与我的配置设置有关吗?这是我的Config/core.php,没有 cmets:

Configure::write('debug', 2);

Configure::write('log', true);

Configure::write('App.encoding', 'UTF-8');

Configure::write('App.baseUrl', 'components/com_cake/app');

//Configure::write('Routing.prefixes', array('admin'));

//Configure::write('Cache.disable', true);

//Configure::write('Cache.check', true);

define('LOG_ERROR', 2);

Configure::write('Session.save', 'php');

//Configure::write('Session.model', 'Session');

//Configure::write('Session.table', 'cake_sessions');

//Configure::write('Session.database', 'default');

Configure::write('Session.cookie', 'CAKEPHP');

Configure::write('Session.timeout', '120');

Configure::write('Session.start', true);

Configure::write('Session.checkAgent', true);

Configure::write('Security.level', 'medium');

Configure::write('Security.salt', 'd1a4bfb8a3cxxxxx47173663e9e2e9ea5');

Configure::write('Security.cipherSeed', '1269383xxxxxxxxxx3672219');

Configure::write('Asset.timestamp', 'force');

//Configure::write('Asset.filter.css', 'css.php');

//Configure::write('Asset.filter.js', 'custom_javascript_output_filter.php');

Configure::write('Acl.classname', 'DbAcl');
Configure::write('Acl.database', 'default');

//date_default_timezone_set('UTC');

Cache::config('default', array('engine' => 'File'));

【问题讨论】:

  • 你能把$this->_saveOrder的代码贴出来吗?
  • 老实说,这非常史诗,并且不包含与会话有关的任何内容。启动一个数据库事务,然后将表单数据保存到各种模型中,如果一切正常,则提交并返回 true,否则回滚并返回 false。
  • 问题是order.complete 没有被正确保存,或者你不小心覆盖了它。如果您在order.complete 旁边设置badger.complete(或任何未使用的变量)并且刷新后这两个值不同,则您会遇到后一个问题。如果您的会话在许多其他情况下都有效,那么前者似乎很奇怪。

标签: cakephp cakephp-1.3


【解决方案1】:

我花了很长时间才弄明白,但问题实际上是我在 Joomla 框架中使用了 CakePHP 组件,我不得不使用 PHP 的原生 mysqli 函数而不是 Cake 的数据库抽象层来选择不同的数据库。

发生的事情是我更改了所选的 MySQL 数据库,这导致了许多微妙且看似无法解释的问题,这些问题来自 Joomla,但只在 Cake 中表现出来。

解决方案是确保我在 AppController::beforeRender() 方法中切换回 Joomla 所需的数据库。

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 2014-12-31
    • 2019-05-16
    • 2023-03-25
    • 2014-08-16
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多