2015-10-06 89 views
1

我是一名新手CodeIgniter開發人員,我必須說當我意識到我無法使工作成爲一個非常簡單的點擊計數器時,我的挫折感突飛猛進到新的高度。這個想法是你點擊一個按鈕,並獲得點擊次數。 這是視圖simplecounter_view:使用「全局」變量的CodeIgniter計數器

<?php if (! defined('BASEPATH')) exit('No direct script access allowed');?> 
<html> 
    <body> 
    <?php 
     echo '<form action="'. base_url().'index.php/simplecounter" method="POST">';   
     echo '<font color="blue">Click counter:' . $counter . '</font><br/><br/>';    
     echo '<input type="submit" name="myform" value="Count">'; 
     echo '</form>'; 
    ?> 
    </div> 
    </body> 
</html> 

如果您單擊窗體按鈕,它會調用SimpleCounter控制器:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
class SimpleCounter extends CI_Controller { 
    public function __construct() {    
     parent::__construct(); 
     $this->load->helper('url'); 
    } 
    public function index() { 
     $myform=$this->input->post('myform'); 
     if ($myform=='Count') { 
      Globals::setCounter(Globals::getCounter()+1); 
     } 
     $data['counter'] = Globals::getCounter(); 
     $this->load->view('simplecounter_view', $data);   
    } 
} 

最後,我使用與物業$櫃檯Globals類,以保持其值「全局」並可從控制器訪問:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
class Globals { 
    private static $initialized=false; 
    private static $counter; 

    private function __construct() {} 
    private static function initialize() { 
     if (self::$initialized) 
      return; 

     self::$counter = 0; 
     self::$initialized = true;  
    }  
    public static function setCounter($n) { 
     self::initialize(); 
     self::$counter = $n; 
    } 
    public static function getCounter() { 
     self::initialize(); 
     return self::$counter; 
    } 
} 

上述代碼無法正常工作。點擊計數器不會在每次用戶點擊時更新。在我看來,Globals類每次調用其中一個方法時都會被重新創建,因此$ counter被重置爲零,$被初始化爲false。

我知道可能有不同的方法(比如在config.php中定義$ counter),儘管我認爲使用分隔類保留$ counter是更優雅的。我在這裏錯過了什麼?我哪裏弄錯了?非常感謝您的幫助。

+1

PHP是無狀態的,所以它會被重置。如果你想堅持櫃檯,那麼你需要一些存儲它。 – Rooneyl

+1

謝謝你的回答。我完全錯過了這一點。然後我明白,我必須使用某種機制(會話,數據庫...)來存儲狀態。 –

回答

0

由於HTTP是無狀態協議,一旦http響應被髮送到請求瀏覽器,所有的變量都會丟失。

在計算中,無狀態協議是一種通信協議, 將每個請求作爲一個獨立的事務處理是無關 任何先前的請求,以使通信由獨立 對請求和響應的。

您需要將計數器保存在數據庫中。

+0

謝謝你的信息。我會按照你的建議。 –

+0

@JaapVanDiermen請隨意選擇答案,將其標記爲已解決。 :) – StudentX