CodeIgniter用户指南——数据库类



1、数据库配置

CodeIgniter 有一个配置文件让你存放数据库连接值(username:用户名,password:密码,database name:数据库名,等等..). 该配置文件位于application/config/database.php. 你也可以通过放置不同的database.php文件到特定的环境配置文件夹里来设置特定环境的数据库连接值.

配件文件存放在一个如下格式的一个多维数组里:

 $db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$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;

我们使用多维数组的原因是为了让你随意的存储多个连接值的设置。举例:如果你运行多个环境(development:开发、production:生产、 test:测试 等等..),你能为每个环境建立独立的连接组,并在组直接进行切换。举例,设置一个"test"环境,你可以这样做:

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

那么,告诉系统使用"test"组,你可以设置位于配置文件中的变量$active_group:

 $active_group = "test";

注意: "test"的名字是任意的,这可以让你自由设置,我们的主要连接默认使用"default"这个名字,当然,您可以基于您的项目为它起一个更有意义的名字。

参数解析

 1 hostname - 数据库的主机名,通常位于本机,可以表示为 "localhost".
2 username - 需要连接到数据库的用户名.
3 password - 登陆数据库的密码.
4 database - 你需要连接的数据库名.
5 dbdriver - 数据库类型。如:mysql、postgres、odbc 等。必须为小写字母。
6 dbprefix - 当运行Active Record查询时数据表的前缀,它允许在一个数据库上安装多个CodeIgniter程序.
7 pconnect - TRUE/FALSE (boolean) - 使用持续连接.
8 db_debug - TRUE/FALSE (boolean) - 显示数据库错误信息.
9 cache_on - TRUE/FALSE (boolean) - 数据库查询缓存是否开启,详情请见数据库缓存类。
10 cachedir - 数据库查询缓存目录所在的服务器绝对路径。
11 char_set - 与数据库通信时所使用的字符集。
12 dbcollat - 与数据库通信时所使用的字符规则。
提示: 就MYSQL或MYSQLi数据库而言,如果服务器运行环境PHP版本小于5.2.3、MYSQL版本小于5.0.7,那么该项设置仅被用来备份(由数据库维护类DB Forge所创建查询)。如果使用多字节字符集并且使用低版本PHP环境中不兼容的mysql_real_escape_string()函数,它将使网站更容易受到SQL注入的危险。
14 swap_pre - 替换默认的dbprefix表前缀,该项设置对于分布式应用是非常有用的,你可以在查询中使用由最终用户定制的表前缀。
15 注: 如果设置了 $db['default']['dbprefix'] 的值 同时也设置了 $db['default']['swap_pre'] 的值,则会将查询代码中和$db['default']['swap_pre'] 的值一致的字符替换成 $db['default']['dbprefix'] 的值,如果没有设置 $db['default']['swap_pre'] 值,就直接在数据库表名前面加上 $db['default']['dbprefix'] 值。
16 autoinit - 当数据库类库(database library)被载入的时候是否需要自动连接数据库,如果设置为FALSE,将在首次查询前进行连接。
17 stricton - TRUE/FALSE (boolean) - 是否强制使用 "Strict Mode" 连接, 在开发程序时,使用 strict SQL 是一个好习惯。
18 port - 数据库端口号. 要使用这个值,你应该添加一行代码到数据库配置数组。
19 $db['default']['port'] = 5432;
提示: 并不是所有的值都是必须的,这取决与您所使用的数据库平台,如(MySQL, Postgres, 等.) 例如, 当你使用SQLite时,你不需要提供username 或 4444, 数据库名字就是您数据库文件的路径. 以上内容假定您使用的是 MySQL 数据库.

2、Active Record类

Active Record 类 可以通过数据库配置文件里的$active_record变量进行全局的设定(允许/禁止 TRUE/FALSE (boolean)). 如果你不用这个类,那么你可以通过将这个变量值设置成FALSE来减少在数据库类初始化时对电脑资源的消耗。

 $active_record = TRUE;
注意: 一些CodeIgniter的类,例如Sessions,在执行一些函数的时候需要Active Records的支持。

应用

CodeIgniter 使用的是修改过的 Active Record 数据库模式。 这种模式是以较少的程序代码来实现信息在数据库中的获取,插入,更改。 有时只用一两行的代码就能完成对数据库的操作。 CodeIgniter 不需要每一个数据库表拥有自己的类。它提供了一个更简单的接口。

不只是简单,使用 Active Record 的一个主要的优点是允许你创建独立的数据库应用程序,因为查询语法是由数据库的适配器来产生的。它可以进行更安全的查询,因为系统会自动的对所有的输入值进行转义。

3、连接数据库——手动+自动、one+more

(1)自动连接

“自动连接” 功能将在每一个页面加载时被自动实例化数据库类。要启用“自动连接”,可在application/config/autoload.php中的 library 数组里添加 database

$autoload['libraries'] = array('database');

(2)手动连接

如果仅仅是一部分页面要求数据库连接,你可以在你有需要的函数里手工添加如下代码或者在你的类里手工添加以供该类使用。

 $this->load->database();
如果以上函数的第一个参数没有任何信息,它将会在系统指定的数据库配置文件中寻找,对多数人而言,这是一个首选的方法。
0 可用的参数
数据库连接值,用数组或DSN字符串传递。
是否返回连接ID,TRUE/FALSE (boolean),默认值为FALSE (参阅下面的“连接多数据库”)。
是否启用 Active Record 类,TRUE/FALSE (boolean),默认值为 NULL。如有疑问,请查看/system/core/Loader.php的database()方法

(3)手动连接到一个数据库

函数的第一个参数能够从你的配置文件中自由的指定你自定义的详细的数据库配置信息。或者你甚至可以不通过指定的配置文件来提交数据库的连接属性。 样例:

要从你的配置文件中选择一个指定的数组你可以这么做:

 $this->load->database('group_name');

group_name指的是存在于你的配置文件中的带有数据库连接信息的数组的名字。

要手动连接你要求的数据库你可以通过定义以下数组来实现:

 $config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$config['cache_on'] = FALSE;
$config['cachedir'] = "";
$config['char_set'] = "utf8";
$config['dbcollat'] = "utf8_general_ci"; $this->load->database($config);

或者你可以以DSN的方式提交数据库配置信息。 DSN必然通过以下方式实现:

 $dsn = 'dbdriver://username:password@hostname/database';
$this->load->database($dsn);

当用 DSN 字符串连接时,要覆盖配置默认值,则添加配置变量为查询字符串。

$dsn = 'dbdriver://username:password@hostname/database?char_set=utf8&dbcollat=utf8_general_ci&cache_on=true&cachedir=/path/to/cache';

$this->load->database($dsn);

 注:当你的dbdriver值为mysqli来进行远程连接时,切记要指定一个参数Port为远程mysql端口

 (4)连接多个数据库

如果你需要同时连接多于一个的数据库,你可以用以下方式来实现:

 $DB1 = $this->load->database('group_one', TRUE);
$DB2 = $this->load->database('group_two', TRUE);

注意:改变 "group_one" 和 "group_two" 为你指定了连接属性的组名 (或者通过上边说过的连接数组的数组名)。

通过设置函数的第二个参数为TRUE(boolean)来返回一个数据库对象

当你使用这种方法,你将用对象名来执行操作命令而不是用户向导模式,也就是说,你将用以下方式执行数据库操作:

$DB1->query();
$DB1->result();
etc... 而不是: $this->db->query();
$this->db->result();
etc... 译注:要连接多个数据库请先设置 config/database.php 中的 $db['xxxxxx']['pconnect'] = FALSE; 这是 mysql_pconnect() 造成的问题,和 CI 无关。

 (5)重新连接/保持连接有效

当你正在进行一些重量级的PHP操作(例如处理图片)时,如果超出了数据库服务器的空闲超时限度,你应该考虑在执行更多查询之前使用reconnect()方法来向服务器发送ping命令,这样可以优雅地保持或重新建立连接。

 $this->db->reconnect();

(6)手动关闭连接

虽然CodeIgniter 可以智能的管理并自动关闭数据库连接,你仍可以用下面的方法显式的关闭掉。

 $this->db->close();

 4、DB快速入门——下面的内容将简单说明怎样使用数据库。更详细的信息请阅读各个函数的单独介绍页面。

初始化数据库类

下面的代码将依据你的数据库配置载入并初始化数据库类;

 $this->load->database();

一旦被载入,你便可以使用它。

注:如果你的所有页面均要求初始化数据库类,你可以让它自动加载(可以写到模型的构造函数里面,这样在加载模型的同时就连接了数据库)

多结果标准查询(对象形式)

 $query = $this->db->query('SELECT name, title, email FROM my_table');

 foreach ($query->result() as $row)
{
echo $row->title;
echo $row->name;
echo $row->email;
} echo 'Total Results: ' . $query->num_rows();

上面的result()函数返回一个对象的数组。例如:$row->title。

多结果标准查询(数组形式)

 $query = $this->db->query('SELECT name, title, email FROM my_table');

 foreach ($query->result_array() as $row)
{
echo $row['title'];
echo $row['name'];
echo $row['email'];
}

上面的result_array()函数返回一个带下标的数组。例如:$row['title']。

测试查询结果

如果你的查询可能不返回结果,我们建议你先使用 num_rows()函数来测试:

 $query = $this->db->query("YOUR QUERY");

 if ($query->num_rows() > 0)
{
foreach ($query->result() as $row)
{
echo $row->title;
echo $row->name;
echo $row->body;
}
}

单结果标准查询(对象形式)

 $query = $this->db->query('SELECT name FROM my_table LIMIT 1');

 $row = $query->row();
echo $row->name;

上面的row()函数返回一个 对象。例如:$row->name。

单结果标准查询(数组形式)

 $query = $this->db->query('SELECT name FROM my_table LIMIT 1');

 $row = $query->row_array();
echo $row['name'];

上面的row_array()函数返回一个 数组。例如:$row['name']

标准插入(insert)

 $sql = "INSERT INTO mytable (title, name)
VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")"; $this->db->query($sql); echo $this->db->affected_rows();

快捷查询

快捷查询类能为我们提供快速取得数据的途径:

 $query = $this->db->get('table_name');

 foreach ($query->result() as $row)
{
echo $row->title;
}

上面的get()函数返回数据表中所有的结果快捷查询类 提供所有数据库操作的快捷函数。

快捷插入(insert)

 $data = array(
'title' => $title,
'name' => $name,
'date' => $date
); $this->db->insert('mytable', $data); // Produces: INSERT INTO mytable (title, name, date) VALUES ('{$title}', '{$name}', '{$date}')

CodeIgniter框架——数据库类(配置+快速入门)的更多相关文章

  1. CodeIgniter底层数据库类继承关系

    1.CI_DB_mysql_driver 继承 CI_DB,  CI_DB这个类是不存在的,每次调用文件中~/CodeIgniter_2.1.3/system/database/DB.php函数&am ...

  2. UML类图快速入门篇

    1.关联 1.1双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类 ...

  3. 【python】pycharm常用配置快速入门。

    俗话说,工欲善其事必先利其器.当我们想从事一门新的语言的时候,最重要的是熟悉其常用的编辑器的配置.刚好这两天在学习python,网上看到一篇比较好的文章,转载过来自己学习一下.感谢:https://s ...

  4. UML 类图快速入门

    UML 图形 官方定义 UML 类图(Class Diagram) UML 时序图(Sequence Diagram) 领域 UML 类图和实现 UML 类图 领域 UML 类图 实现 UML 类图 ...

  5. STM32 TIM 多通道互补PWM波形输出配置快速入门

    platform:stm32f10xxx lib:STM32F10x_StdPeriph_Lib_V3.5.0 前言 在做三相逆变的时候,需要软件生成SVPWM波形,具体的算法需要产生三对互补的PWM ...

  6. STM32 TIM1高级定时器配置快速入门

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 重点内容 时基单元 计 ...

  7. STM32 时钟树配置快速入门

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 为什么要了解时钟树? ...

  8. Prometheus入门教程(三):Grafana 图表配置快速入门

    文章首发于[陈树义]公众号,点击跳转到原文:https://mp.weixin.qq.com/s/sA0nYevO8yz6QLRz03qJSw 前面我们使用 Prometheus + Grafana ...

  9. Yii2框架RESTful API教程(一) - 快速入门

    前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RE ...

随机推荐

  1. Python学习笔记(三)多线程的使用

    这节记录学习多线程的心得.   Python提供了thread模块,不过该模块的缺点很多,例如无法方便的等待线程结束,所以我们使用更加高级的threading模块.   threading模块的使用一 ...

  2. 火狐浏览器获取event

    因为各种浏览器对js文件的解析不同.加上各种浏览器的内核不一样,以及内核版本号也不一样,所以获取event的方式也不一样. 使用原始的方式获取event是 这种: document.body.oncl ...

  3. @Autowired与@Resource的使用方法和差别

    一.@Autowired: 1.Spring 2.5 引入了 @Autowired 凝视,它能够对类成员变量.方法及构造函数进行标注,完毕自己主动装配的工作. 通过 @Autowired的使用来消除 ...

  4. [Mac A]如何学习Mac编程?

    http://ourcoders.com/thread/show/5550/ @tinyfool 看了您在quora上回答的『为什么说程序员是最好的职业』,加上本来就想学编程(但是一直以来因为各种借口 ...

  5. 【Java】Java_08 字符型与布尔值

    1.字符型(2个字节) 单引号用来表示字符常量.例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串 char 类型用来表示在Unicode编码表中的字符 Unicode编码被设计 ...

  6. Eclipse githup

    1:选择对应eclipse版本的githup组件版本,详见网址: http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of ...

  7. loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式

    loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式 分类: 心得 loadrunner 我的测试 2012-04-01 12:52 2340人阅读 评论(0) 收藏 举报 脚本l ...

  8. a标签上的点击事件

    当我们在处理a标签上的点击事件时发现即使href=""里面为空,点击事件的效果也不明显,这种情况该如何处理呢?常见的处理方法有以下几种: 1.a href="javasc ...

  9. MVC的优缺点

    MVC的优点 大部分用过程语言比如ASP.PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程.例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接 ...

  10. Python课程之元组

    元组(Tuple) 一.定义: 与列表(list)不同的是,元组不支持修改,但是若元组中的元素本身是可变对象,如列表,则可以修改.元素之间用逗号隔开,并且元素的类型可以任意. 二.操作: 1.创建:直 ...