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 相关文章推荐
?繁体转换的class
Oct 09 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
Apr 20 PHP
Laravel中9个不经常用的小技巧汇总
Apr 16 PHP
Yii框架实现对数据库的CURD操作示例
Sep 03 PHP
laravel 解决后端无法获取到前端Post过来的值问题
Oct 22 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生成二维码的两种方法(带logo图像)
2014/03/14 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
php集成开发环境详解
2019/09/24 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
清空上传控件input file的值
2010/07/03 Javascript
jQuery 表单验证扩展(四)
2010/10/20 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
vue实现简单加法计算器
2020/10/22 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
五种Python转义表示法
2020/11/27 Python
J2EE是技术还是平台还是框架
2016/08/14 面试题
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
小学二年级评语
2014/04/21 职场文书
篮球社团活动总结
2014/06/27 职场文书
作风建设年度心得体会
2014/10/29 职场文书
2014年教育工作总结
2014/11/26 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
关于使用Redisson订阅数问题
2022/01/18 Redis
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫