技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> 抽离CodeIgniter的数据库访问类!

抽离CodeIgniter的数据库访问类!

浏览:2300次  出处信息

好吧,因为组织需要,最近又开始转战php了,业务逻辑都还好说,主要是老大要求在数据访问层上加上登录态验证。
其实这种要求也是合理的,互联网服务要求上层保护下层,但下层不能完全相信上层。但是问题也就来了,有如下两种方案:

1.写一个mysql proxy server,用来将调用方发来的请求拼装,然后返回给调用侧。这样做的主要难度在于:

  • a)SQL语句的拼装及序列化
  • b)数据集序列化,虽然有不少这方面的产品,但是终究还是太过复杂,而且没有时间折腾

果断放弃。
2.封装一层mysql的api,调用方直接在本地调用即可。这样的话,只需要考虑SQL语句的拼装即可。现在就有很多选择啦,

  • a)使用类似django里面Model的模型类
  • b)使用ci中的Active Record

虽然说Model的方式,对数据层的屏蔽较好,但是小组成员普遍认为这种方式过重,轻量的一点的话,最终还是选择了CodeIgniter中的AR。
OK,那么现在,考验ci模块拆分的好不好的时候到啦!
具体中间的种种辛苦就不说啦,直说我最终的实现把,拷贝system\database到一个单独的目录,x:/php/ 。
创建一个文件myconfig.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
define('BASEPATH', dirname(__FILE__).'/');
define('EXT', '.php');
require_once(BASEPATH . 'database/DB' . EXT);
 
function &instantiate_class(&$class_object)
{
    return $class_object;
}
 
function log_message($level = 'error', $message, $php_error = FALSE)
{
    echo($message);
}
function MYDB()
{
    $params = array(
        'dbdriver'  => 'mysql',
        'hostname'  => 'localhost',
        'username'  => 'root',
        'password'  => '',
        'database'  => 'dante',
        'pconnect'  => TRUE,
        'db_debug'  => TRUE,
        'cache_on'  => FALSE,
        'char_set'  => 'utf-8',
        'dbcollat'  => 'utf8_general_ci',
    );
    $db = DB($params,TRUE);    
    return $db;
}
?>

创建一个测试文件test.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
require_once('myconfig.php');
$db = MYDB();
$db->select('ID,user_login,user_email');
$query = $db->get('wp_users');
echo "\n";
foreach ($query->result() as $row)
{
    print $row->ID . "\n";
    print $row->user_login . "\n";
    print $row->user_email . "\n";
}
?>

输入结果如下:

Database Driver Class Initialized
1
admin
zny2008@gmail.com

OK啦~~~ 这样我们如果要在数据访问前需要做权限校验的话,只需要在MYDB函数中做判断即可。
另外,不得不说ci模块拆分的确实不错,instantiate_class是来自于它的system\codeigniter\Common.php。log_message我给重写了一下,因为对于每个调用者来说,希望写log的方式是不一样的。(比如我这次就直接打印在了屏幕上。。。。),最近正好在看设计模式,这种方式也是符合模版方法模式的。

ps:
《php敏捷开发框架CodeIgniter - 快速web应用开发详解》这本书中关于ar的用法中的例子居然是错的,害得我看源码才发现问题,书中的例子是这样的:

1
$this->db->select('url','name','clientid','people.surname AS client');

而实际应该是这样的:

1
$this->db->select('url,name,clientid,people.surname AS client');

代码下载(以后代码都会像这样,统一放到google code上下载):
http://vimercode.googlecode.com/svn/trunk/ci_model/

建议继续学习:

  1. mysql-proxy中Admin Plugin的使用以及读写分离的问题    (阅读:7561)
  2. socks5 proxy 折腾记    (阅读:5728)
  3. Codeigniter ACL library    (阅读:5311)
  4. Codeigniter里的无刷新上传    (阅读:4603)
  5. 在centos 5.2下安装最新的mysql proxy    (阅读:2939)
  6. 关于mysql proxy 0.7.0    (阅读:2707)
  7. OpenStack Swift源码导读之——业务整体架构和Proxy进程    (阅读:2767)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1