CodeIgniter配置之database.php用法实例分析


Posted in PHP onJanuary 20, 2016

本文实例分析了CodeIgniter配置之database.php用法。分享给大家供大家参考,具体如下:

CodeIgniter的数据库配置文件位于application/config/database.php, 该文件中定义了$db的二维数组,参考文件如下:

$active_group = 'default';
$active_record = TRUE;
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '123456';
$db['default']['database'] = 'test';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

配置说明

$active_group 为$db中的一维键名,表示默认使用的数据库配置,即$this->load->database()不传入参数时,将默认使用$db[$active_group]来连接数据库。

$active_record 是否开启AR模式,开启后将可以使用AR类中的方法,该值可通过$this->load->database()的第三个参数传入。

$db数组需要注意的地方

1、port 默认只列出了主机、帐号、密码等,未配置端口号,如果需要特别指定端口号则需要配置该值。

2、pconnect 长连接的问题,值默认为TRUE表示默认使用长连接。长连接的使用需要特别小心,数据库可能会出现大量的sleep的进程而导致更多的请求执行不成功,这里不建议开启长连接。

3、db_debug 为TRUE时SQL执行出错则会直接在错误页面打印,开发环境可以打开,生产环境需关闭。

4、autoinit 是否自动初始化数据库,为true时则$this->load->database()就会连接数据库,否则在查询时连接数据库。CI的类都做了单例,所以不用担心多次链接。

5、stricton 当该值为TRUE时,初始化时会执行这样一条语句,会对不规范的数据,比如字符超过长度、自增主键传入‘'等将会直接抛错。

SET SESSION sql_mode="STRICT_ALL_TABLES"

如何连接数据库?

可通过Loader中的database方式调用,即$this->load->database(); 函数的定义如下:

/**
 * Database Loader
 *
 * @param  string 数据库连接值,数组或DSN字符串传递。
 * @param  bool  是否返回数据库对象,否则将数据库对象赋值给控制器的db属性
 * @param  bool  是否使用AR,这里的设置会覆盖database.php中设置
 * @return  object
 */
function database($params = '', $return = FALSE, $active_record = NULL){}

$params的值有3种情况,分别是:

1、字符串,传入$db数组一维键名,如 default test等,为空则默认$active_group定义的值

2、数组,可以直接传入类似$db的一维数组,如:

$this->load->database(array(
  'hostname' => 'localhost',
  'username' => 'root',
  'password' => '123456',
  'database' => 'test',
  'dbdriver' => 'mysql',
  'pconnect' => FALSE,
  'db_debug' => TRUE,
  'char_set' => 'utf8',
  'dbcollat' => 'utf8_general_ci',
));

3、DSN 字符串,如:

$dsn = 'mysql://root:123456@localhost/test?charset=utf8&dbcollat=utf8_general_ci';
$this->load->database($dsn);

PDO的初始化需要使用DSN字符串,那么在CI中该如何配置呢,可参考如下配置:

//当前版本2.x.x
$active_group = 'default';
$active_record = TRUE;
$db['default']['hostname'] = 'mysql:host=localhost;dbname=test';
$db['default']['username'] = 'root';
$db['default']['password'] = '123456';
$db['default']['database'] = 'test';
$db['default']['dbdriver'] = 'pdo';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

如何连接多个数据库?

$this->load->database()时会将数据库对象赋值给CI_Controller的db属性,如果已经存在了db则不会重新连接。也就是执行$this->load->database()之后再次$this->load->database('test')时则第二次load不会执行。

但load的第二个参数允许返回,所以可以返回并赋值给变量,达到连不同库的目的。

$DB1 = $this->load->database('default', TRUE);
$DB2 = $this->load->database('test', TRUE);

但这种方式需要使用的时候主动去load,使用不太方便,我们可以在MY_Model的构造函数中实现,将返回的$DB1重新赋值给CI_Controller的一个属性,并将该属性赋值或者clone给$this->db,例如:

public function __construct($group_name = '')
{
  parent::__construct();
  if($group_name == '') {
    $db_conn_name = 'db';
  } else {
    $db_conn_name = 'db_'.$group_name;
  }
  $CI = & get_instance();
  if(isset($CI->{$db_conn_name}) && is_object($CI->{$db_conn_name})) {
    $this->db = $CI->{$db_conn_name};
  } else {
    $CI->{$db_conn_name} = $this->db = $this->load->database($group_name, TRUE);
  }
}

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php4的session功能评述(三)
Oct 09 PHP
PHP 递归效率分析
Nov 24 PHP
Windows下XDebug 手工配置与使用说明
Jul 11 PHP
将时间以距今多久的形式表示,PHP,js双版本
Sep 25 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
PHP实现的多进程控制demo示例
Jul 22 PHP
PHP的Trait机制原理与用法分析
Oct 18 PHP
CodeIgniter多语言实现方法详解
Jan 20 #PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 #PHP
教你php如何实现验证码
Jan 20 #PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 #PHP
CodeIgniter扩展核心类实例详解
Jan 20 #PHP
CodeIgniter视图使用注意事项
Jan 20 #PHP
CodeIgniter读写分离实现方法详解
Jan 20 #PHP
You might like
资料注册后发信小技巧
2006/10/09 PHP
php addslashes 函数详细分析说明
2009/06/23 PHP
php set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
基于jquery实现多选下拉列表
2017/08/02 jQuery
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
十分钟教你上手ES2020新特性
2020/02/12 Javascript
python实现的jpg格式图片修复代码
2015/04/21 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
比较基础的php面试题及答案-填空题
2014/04/26 面试题
解释一下钝化(Swap out)
2016/12/26 面试题
医学专业大学生求职的自我评价
2013/11/27 职场文书
环保建议书
2014/03/12 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android