我是一名CodeIgniter开发新手,当我意识到我无法制作一个非常简单的点击计数器时,我的挫败感达到了新的高度。其理念是,你点击一个按钮,然后计算点击次数。这是视图simplecounter_view:
<?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 Controller:
<?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类与属性$counter,以保持其值"全局",并从控制器访问:
<?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更优雅。我遗漏了什么?我哪里搞错了?非常感谢您的帮助。
由于HTTP是无状态协议,一旦HTTP响应发送到请求浏览器,所有变量都会丢失。
在计算中,无状态协议是一种通信协议将每个请求视为与…无关的独立事务使任何先前的请求组成独立的通信请求和响应对。
需要将计数器保存在数据库中