分离并独立使用CodeIgniter数据库和Active Record类
作为CodeIgniter的特色功能,数据库类异常的强大,尤其是Active Record,这个数据库模式使得用PHP原生代码需要投入大量精力的工程只需写上一两行代码就可以解决。
之前Kaijia用CodeIgniter编写过几个网站,里面就大量使用了Active Record,这次Kaijia要编写的是一个简单的PHP命令行程序,但是要用到大量SQL脚本,于是考虑使用CodeIgniter的数据库功能。但是由于程序只有一个文件,却为了使用Active Record功能而加入了整个CodeIgniter框架,有点说不过去了。
于是Kaijia尝试将CodeIgniter的数据库类和Active Record类分离出来单独使用,Google了一下后找到了Hasin Hayder的博文《Using ActiveRecord Library Separately from CodeIgniter》和gisanfu发布在Github上的脚本。尝试之后Kaijia发现这两个方法都不好,前者只支持MySQL并且部分功能不可用,后者虽然可行但引用了太多不必要的内容。于是决定自己研究,经过很多次测试Kaijia终于尝试出了一个更加简洁的方法。
首先下载在CI官网下载最新版本的CodeIgniter。解压缩后将system/database文件夹复制到你的根目录下,同时在根目录下新建core文件夹,复制system/core/Common.php文件到新建的文件夹中。然后将以下代码复制到你的脚本的最开始:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!--?php <br ?-->define('BASEPATH', realpath(dirname(__FILE__)).'/'); define('APPPATH', realpath(dirname(__FILE__)).''); include_once('core/Common.php'); include_once('database/DB.php'); function get_config(){} function &load_database($params = '', $active_record_override = false) { $database =& DB($params, $active_record_override); return $database; } $db =& load_database("driver://username:password@hostname/dbname", true); |
将“driver://username:password@hostname/dbname”替换为你自己的DSN,例如“mysql://root:password@localhost/mydatabase”就可以想在CI项目中一样使用Active Record了。注意由于脱离了CodeIgniter大实例,所有的$this->db都需要改成$db才能运行。
Kaijia已经把整理之后的代码发布在Github上,你可以访问此页面查看或者直接下载代码。
为什么没人回复,我用了一下,报错Strict Standards: Only variables should be assigned by reference in D:\website\elanmay\library\core\Common.php on line 277,但是mysql能取到记录
好像是sample.php中function get_config(){}为空的问题,但是没法解决,没有配置文件,也不知道怎么去设定数据表前缀,用过CI不是很熟悉
这个库去掉了设定表前缀的功能(因为那样需要使用CI的Config类),直接定义一个例如DB_PREFIX的常量,然后选择表名时改成DB_PREFIX.’table’就可以了。
定义常量就不太好使了,特别是使用->join的时候
我也是和你一样觉得ci的数据库连接类很好用所以想抽离出来,但是实力有限,所以看到你这篇文章的时候很诧异没人评论。
非常感谢你的共享&回复