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 相关文章推荐
PHP 命令行参数详解及应用
May 18 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
使用PHP编写发红包程序
Jul 22 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
PHP实现文件上传功能实例代码
May 18 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 PHP
PHP数组实际占用内存大小原理解析
Dec 11 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
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
php字符串截取的简单方法
2013/07/04 PHP
PHP系统命令函数使用分析
2013/07/05 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
浅谈Python基础之I/O模型
2017/05/11 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
自定义django admin model表单提交的例子
2019/08/23 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
基于python操作ES实例详解
2019/11/16 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
小学英语教学反思
2014/01/30 职场文书
小班上学期评语
2014/05/05 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
三年级作文之趣事作文
2019/11/04 职场文书