2012-09-07 67 views
1

這是CakePHP的1.3CakePHP的 - 會話被寫入,然後失去了頁面刷新

我有每個步驟後存儲新的會話的數據的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] => [email protected] 
      [tel] =>
     ) 

) 

然後第二調試表明,新的會話標誌已經被寫入了會議:

Array 
(
    [Order] => Array 
     (
      [value1] => 4566 
      [value2] => 'test' 
      [value3] => 0 
      [value4] => 0 
     ) 
    [Customer] => Array 
     (
      [fname] => test 
      [sname] => test 
      [email] => [email protected] 
      [tel] =>
     ) 
    ['complete'] => true 

) 

但是,如果我刷新頁面,complete標誌消失,會話已完全恢復到以前的狀態,並且由於標誌不存在,保存會再次運行。標誌寫入後沒有代碼,因此不會被刪除。

Array 
(
    [Order] => Array 
     (
      [value1] => 4566 
      [value2] => 'test' 
      [value3] => 0 
      [value4] => 0 
     ) 
    [Customer] => Array 
     (
      [fname] => test 
      [sname] => test 
      [email] => [email protected] 
      [tel] =>
     ) 

) 

會話寫入在所有其他步驟中工作正常。我可以在頁面之間添加/更新會話變量,並且它們可以很好地工作並在頁面和頁面刷新中保持不變。

我不知道這是否與我的配置設置或什麼有關。我不知道爲什麼會發生在這個頁面上。有時候,我也很少注意到,在將我的頭髮拉出AGES並清理緩存幾次之後,它似乎暫時工作一次,然後再次停止工作。

難道這與我的配置設置有關嗎?這是我Config/core.php沒有註釋:

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')); 
+0

你可以發佈'$ this - > _ saveOrder'的代碼嗎? – Hoff

+0

說實話,這是非常史詩般的,並且不包含與會話有關的任何事情。數據庫事務啓動後,它將表單數據保存到各種模型中,然後如果一切順利,它將提交併返回true,否則它將回滾並返回false。 – BadHorsie

+0

問題是'order.complete'沒有被正確保存,或者你意外覆蓋它。如果您在'order.complete'旁邊設置了'badger.complete'(或任何未使用的變量),並且這兩個值在刷新後不同,則會出現後一個問題。如果您的會議在許多其他情況下工作,前者似乎很奇怪。 –

回答

1

這花了我絕對永遠搞清楚,但問題是實際上是我使用Joomla的骨架內部的CakePHP的組成部分,我不得不使用來選擇不同的數據庫PHP的本地mysqli函數而不是Cake的數據庫抽象層。

發生了什麼事是我改變了選定的MySQL數據庫,這導致了來自Joomla的細微的,看似無法解釋的問題,但只在Cake中很明顯。

解決方案是確保我切換回Joomla需要的數據庫,在我的AppController::beforeRender()方法中。