2015-10-06 31 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