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 mysql数据库操作类
Jun 04 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
常见的PHP五种设计模式小结
Mar 23 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
隐性调用php程序的方法
Jun 13 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 PHP
PHP使用Redis实现Session共享的实现示例
May 12 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绘图技术
2013/07/03 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
js尾调用优化的实现
2019/05/23 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
Python常用模块用法分析
2014/09/08 Python
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
python中reader的next用法
2018/07/24 Python
python实现动态数组的示例代码
2019/07/15 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
小学防溺水制度
2014/01/29 职场文书
专业技术职务聘任书
2014/03/29 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
mysql insert 存在即不插入语法说明
2022/03/25 MySQL