用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6047|回复: 12
收起左侧

[控制器] 如何解决CI重复读取数据库填充页面的问题?

[复制链接]
发表于 2013-7-9 21:45:49 | 显示全部楼层 |阅读模式
本帖最后由 seahorse 于 2013-7-30 15:01 编辑

我的导航菜单内容是从数据库中读取的:
控制器部分关键代码如下:
function index()
{
   $data['menu_content'] = $this->My_model->get_menu_content(); // 调用模型方法从数据库读取内容填充导航菜单
   ……
   ……  // 此处为实现分页的代码 ,读取出的产品列表数据量很大,进行分页  
   $data['productinfo']=$this->My_model->get_product_info();  // 调用模型从数据库读取产品列表
   $this->load->view('main.php', $data);
}

视图main.php中菜单部分相关代码如下:
<ul>
  <?php foreach($menu_content  as $row): ?>
     <li><a  href=#  ><?php echo $row->name; ?></a></li>
  <?php endforeach; ?>
</ul>
模型代码略 。

当在产品列表不同页之间导航时,每次都要从数据库读取内容来填充导航菜单。如何在首次载入页面内容后,在点击分页链接时不再从数据库读取内容来填充导航菜单? 也就是在进行翻页时,如何保持表单的状态为第一次填充时的状态?



发表于 2013-7-10 00:55:54 | 显示全部楼层
一个办法 就是用hex的hmvc
另外一个就是将其写入构造函数中,用$this->load->vars($data) 的方式载入到模板

载入分页那个方法中的 $data['menu_content'] 这个变量 应该在index 方法中值应该是固定的
如果用其他方法的话 需要再次载入
发表于 2013-7-10 08:28:47 | 显示全部楼层
一、缓存,这样就不会重复读取数据库了。
二、楼上的方法
三、AJAX只刷新要更改的区域

点评

嗯,这个很全  发表于 2013-7-10 14:44
 楼主| 发表于 2013-7-10 09:54:00 | 显示全部楼层
To:muvtou

在构造函数中写入如下代码:
function __construct(){
……
$menu_content = $this->My_model->get_menu_content();
        $this->load->vars('menu_content ', $menu_content);
}

function index()
{
  // 这里是读取产品列表,分页代码,载入视图等
  ……
}
在进行上下页导航时,还是每次重新从数据库载入菜单内容。
是$this->load->vars的写法有问题吗?
发表于 2013-7-10 15:45:23 | 显示全部楼层
seahorse 发表于 2013-7-10 09:54
To:muvtou

在构造函数中写入如下代码:

写法没问题,但是每个新页面都是重新初始化一次CI的,所以放在构造函数里还是会在此读取数据库的。

 楼主| 发表于 2013-7-10 15:55:25 | 显示全部楼层
To:kinwyb
您的意思是$this->load->vars无法实现在分页的上下页导航时,不读取数据库来填充导航菜单?
发表于 2013-7-10 16:49:03 | 显示全部楼层
用CI的session缓存数据吧,有条件的话用Memcached
把你的菜单取出来之后缓存起来,每次就读缓存就行了,但是要注意的是
当你增加或修改了菜单的时候记得顺便清理掉缓存。
发表于 2013-7-10 23:43:21 | 显示全部楼层
gogogo1027 发表于 2013-7-10 16:49
用CI的session缓存数据吧,有条件的话用Memcached
把你的菜单取出来之后缓存起来,每次就读缓存就行了,但 ...

求问怎么单独缓存菜单?可以设置单独缓存一个div层么?还是必须整个页面缓存     如果缓存了页面   数据库更新后   memcached怎么知道该重新读数据库还是提交缓存文件呢?
发表于 2013-7-11 09:56:00 | 显示全部楼层
用我写的 HMVC 吧,就是为你这个需求而生的。
发表于 2013-7-11 10:01:41 | 显示全部楼层
camrmen 发表于 2013-7-10 23:43
求问怎么单独缓存菜单?可以设置单独缓存一个div层么?还是必须整个页面缓存     如果缓存了页面   数据 ...

单独缓存菜单(Memcache为例)
适用场景:当菜单并非每个用户都一致而是根据用户权限调用菜单的情况。
应当注意:
1,当增加或修改菜单的时候,清理菜单缓存(这要求你部署Memcache的时候定义好哪个连接属于菜单缓存)。
2,当用户访问你的页面时,先判断是否存在该用户的缓存如果不存在,则读取数据库,数据读取出来之后再缓存该用户的菜单信息。(Memcache保存菜单的时候,以数据量少为目标,所以你千万不要连着div一起保存,而是从数据库取得菜单信息的数组保存为cache).再对菜单数据处理,如格式化DIV样式等等。
3,如何区分用户:可以把menu_[username|uid]作为cache的key。当然还有其他方法,自己选择。
4,当对某个用户的菜单权限修改时,首先清除缓存里menu_[username|uid]的值,这样用户重新访问的时候就会从新从数据库中读取新的数据。

本版积分规则