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 相关文章推荐
SMARTY学习手记
Jan 04 PHP
最新的php 文件上传模型,支持多文件上传
Aug 13 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
浅谈PHP中的数据传输CURL
Sep 06 PHP
php防止sql注入的方法详解
Feb 20 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
php常用的工具开发整理
Sep 26 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 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
根德YB400的电路分析
2021/03/02 无线电
刚才在简化php的库,结果发现很多东西
2006/12/31 PHP
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
php简单图像创建入门实例
2015/06/10 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
基于Jquery的简单&简陋Tabs插件代码
2010/02/09 Javascript
JS与C#编码解码
2013/12/03 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
使用svg实现动态时钟效果
2018/07/17 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
Python编程中的for循环语句学习教程
2015/10/14 Python
Python MD5加密实例详解
2017/08/02 Python
python实现用户管理系统
2018/01/10 Python
python中将一个全部为int的list 转化为str的list方法
2018/04/09 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
pandas数据集的端到端处理
2019/02/18 Python
python SVM 线性分类模型的实现
2019/07/19 Python
python 字典的打印实现
2019/09/26 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
毕业设计说明书
2014/05/07 职场文书
创文明城市标语
2014/06/16 职场文书
色戒观后感
2015/06/12 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript