原文:
使用 CodeIgniter 框架快速开发 PHP 应用(四)
使用 CI 简化数据库开发
你学习CI 是由于你想要使编程更容易和更有生产力。这一章讲述CI的Active Record类。 若是CI只提供一个Active Record类,它仍是物超所值的。固然,CI是免费的,只不过我要强调Active Record(之后简称AR)类的价值是很是高的,它是你提升生产力的主要工具。
AR使你以最小的代价得到最大的回报。 它简单,易于使用和维护。
这一章描述CI如何链接到一个数据库,你如何使用AR操纵数据库。你将会见到:
。 AR类与传统PHP/MySQL接口的比较
。 如何读取数据库并显示结果
。 如何建立,更新, 删除查询
CI保留让你用传统的方法编写数据库查询,可是我不会详细介绍这部份内容。它的知识彻底被在线手册覆盖。使用AR类后,你可能不会再用传统的方式来作数据库查询了。
配置config文件
你或许已经注意到在这本书的大多数的章节会谈到system/application/config 文件夹和里面的config文件。这些文件对控制CI按要求工做至关必要。并且你可让大部分的配置参数等于系统的默认值。数据库config文件在正常使用数据库以前须要进行设置。
基本上,你仅仅必须告诉它你的数据库在哪里、它是什么类型。 文件的默认值为:
$active_group="default";
$db['default']['hostname']="";
$db['default']['username']="";
$db['default']['password']="";
$db['default']['database']="";
$db['default']['dbdriver']="";
其余的选项能够保留为默认值。 必选项是:
hostname: 你的数据库的位置, 举例来讲, 'localhost' 或 IP 地址
username和password: 使用者名称和密码必须有充分的权限,容许你的网站存取数据库中的数据。
database: 你的数据库的名字, 举例来讲, 'websits'
dbdriver: 你正在使用的数据库的类型 - CI可受的有选项有MySQL、MySQLi、 Postgre SQL、ODBC和MS SQL
以个人经验来看, 最困难的事情之一就是把新的CI网站链接到数据库。你可能须要查询你的ISP-有时他们的数据库运行在与他们的web server IP地址不一样的地方。若是你正在使用 MySQL, 他们可能提供 phpMyAdmin, 一般告诉你 hostname-这多是 'localhost' 或者它多是一个 IP 住址。
你可能注意到 config 文件的内容其实是一个多维数组。在 $db数组里包含一个叫作default的数组,你所作的设置就是往里增长键/值对,例如 hostname = 127.0.0.1 。你还能够增长其余的数据库设置, 经过改变$active_group的设置能够容易地更改数据据库。
这为网站链接到数个数据库提供了可能性-举例来讲, 一个测试数据库和一个产品数据库-你能够很容易地在他们之间切换。 或者你能够在二个数据库之间交换数据。
为咱们的网站设计数据库
我想表达的是 CI 能用来开发正式的网站。 我如今正在维护客户的一些网站,并且我想要监控他们,用我设计的方法测试它们, 用数据库保存我想要的数据, 并且能够获得这些网站的分析报告。 所以让咱们试着建立它。 先让咱们肯定一些目标。 它们是:
1. 用最少的人工干预管理一个或更多的远程网站
2. 对远程网站进行按期的测试
3. 生成符合要求的分析报告, 提供网站的细节和测试结果
所以, 第一件事情是咱们将会须要一个网站的数据库。 创建一个名为websites的MySQL数据库,你也可使用别的数据库产品。
如今,咱们须要增长一些表来保存各类数据。让咱们为网站增长一张表,字段有URL,他们的名字和密码/用户名, 和他们的类型。咱们也将会为每一个网站创建一个ID字段-并且在 MySQL数据库中,至少,须要为实体生成一个惟一标识符,可使用自动增量类型来达到这一目的。
每一个网站必须有一个不一样的主机,咱们须要另外一表来保存主机信息。通常有一个域名与主机相关联,因此咱们须要一个域名表来保存有关域名的信息,还须要一我的员表来记录这些人的姓名,密码,邮件地址,备用邮件地址,手机号码,曾至宠物的名字,可能还有其它的一些什么。
所以咱们的网站表须要包括这样一些字段:domain ID, host ID, 两个people ID,一个存放网站站长的ID一个存放网站管理人的ID(管理人为网站提供技术支持,保证网站正常运行.)
你能见到,这是一个完整的关系型数据库,让咱们来创建它!
完整的建表文档,SQL文件格式:
websites.sql:
php
SQL
DROP
TABLE
IF
EXISTS
`ci_sessions`
;
CREATE
TABLE
IF
NOT EXISTS
`ci_sessions`
(
`session_id`
varchar
(
40
)
NOT
NULL
default
'0'
,
`peopleid`
int
(
11
)
NOT
NULL
,
`ip_address`
varchar
(
16
)
NOT
NULL
default
'0'
,
`user_agent`
varchar
(
50
)
NOT
NULL
,
`last_activity`
int
(
10
)
unsigned
NOT
NULL
default
'0'
,
`left`
int
(
11
)
NOT
NULL
,
`name`
varchar
(
25
)
NOT
NULL
,
`status`
tinyint
(
4
)
NOT
NULL
default
'0'
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
;
DROP
TABLE
IF
EXISTS
`domains`
;
CREATE
TABLE
IF
NOT EXISTS
`domains`
(
`id`
int
(
10
)
NOT
NULL
auto_increment
,
`url`
varchar
(
100
)
NOT
NULL
,
`name`
varchar
(
100
)
NOT
NULL
,
`registrar`
varchar
(
100
)
NOT
NULL
,
`dateregd`
int
(
11
)
NOT
NULL
default
'0'
,
`cost`
float
NOT
NULL
default
'0'
,
`regdfor`
int
(
11
)
NOT
NULL
default
'0'
,
`notes`
blob
NOT
NULL
,
`pw`
varchar
(
25
)
NOT
NULL
,
`un`
varchar
(
25
)
NOT
NULL
,
`lastupdate`
int
(
11
)
NOT
NULL
default
'0'
,
`submit`
varchar
(
25
)
NOT
NULL
,
PRIMARY KEY
(
`id`
)
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
AUTO_INCREMENT
=
10
;
DROP
TABLE
IF
EXISTS
`events`
;
CREATE
TABLE
IF
NOT EXISTS
`events`
(
`id`
int
(
10
)
NOT
NULL
auto_increment
,
`name`
varchar
(
50
)
NOT
NULL
default
'not set'
,
`type`
enum
(
'test'
,
'alert'
,
'report'
)
NOT
NULL
,
`testid`
int
(
10
)
NOT
NULL
,
`siteid`
int
(
10
)
NOT
NULL
,
`userid`
int
(
10
)
NOT
NULL
,
`reported`
int
(
11
)
NOT
NULL
,
`result`
blob
NOT
NULL
,
`time`
int
(
11
)
NOT
NULL
,
`timetaken`
float
NOT
NULL
,
`isalert`
varchar
(
2
)
NOT
NULL
,
`emailid`
int
(
11
)
NOT
NULL
,
`submit`
varchar
(
25
)
NOT
NULL
,
PRIMARY KEY
(
`id`
)
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
AUTO_INCREMENT
=
69
;
DROP
TABLE
IF
EXISTS
`frequencies`
;
CREATE
TABLE
IF
NOT EXISTS
`frequencies`
(
`id`
int
(
10
)
NOT
NULL
,
`name`
varchar
(
16
)
NOT
NULL
,
`submit`
varchar
(
25
)
NOT
NULL
,
PRIMARY KEY
(
`id`
)
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
;
DROP
TABLE
IF
EXISTS
`hosts`
;
CREATE
TABLE
IF
NOT EXISTS
`hosts`
(
`id`
int
(
11
)
NOT
NULL
auto_increment
,
`cost`
float
NOT
NULL
,
`name`
varchar
(
100
)
NOT
NULL
,
`hosturl`
varchar
(
100
)
NOT
NULL
,
`un`
varchar
(
50
)
NOT
NULL
,
`pw`
varchar
(
50
)
NOT
NULL
,
`ns1url`
varchar
(
36
)
NOT
NULL
,
`ns1ip`
varchar
(
36
)
NOT
NULL
,
`ns2url`
varchar
(
36
)
NOT
NULL
,
`ns2ip`
varchar
(
36
)
NOT
NULL
,
`ftpurl`
varchar
(
100
)
NOT
NULL
,
`ftpserverip`
varchar
(
36
)
NOT
NULL
,
`ftpun`
varchar
(
50
)
NOT
NULL
,
`ftppw`
varchar
(
50
)
NOT
NULL
,
`cpurl`
varchar
(
36
)
NOT
NULL
,
`cpun`
varchar
(
36
)
NOT
NULL
,
`cppw`
varchar
(
36
)
NOT
NULL
,
`pop3server`
varchar
(
36
)
NOT
NULL
,
`servicetel`
varchar
(
50
)
NOT
NULL
,
`servicetel2`
varchar
(
50
)
NOT
NULL
,
`serviceemail`
varchar
(
100
)
NOT
NULL
,
`webroot`
varchar
(
48
)
NOT
NULL
,
`absoluteroot`
varchar
(
48
)
NOT
NULL
,
`cgiroot`
varchar
(
48
)
NOT
NULL
,
`booked`
int
(
11
)
NOT
NULL
,
`duration`
int
(
11
)
NOT
NULL
,
`lastupdate`
int
(
11
)
NOT
NULL
default
'0'
,
`submit`
varchar
(
25
)
NOT
NULL
,
PRIMARY KEY
(
`id`
)
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
AUTO_INCREMENT
=
6
;
DROP
TABLE
IF
EXISTS
`people`
;
CREATE
TABLE
IF
NOT EXISTS
`people`
(
`id`
int
(
11
)
NOT
NULL
auto_increment
,
`uname`
varchar
(
25
)
NOT
NULL
,
`pw`
varchar
(
25
)
NOT
NULL
,
`status`
smallint
(
3
)
NOT
NULL
default
'1'
,
`name`
varchar
(
50
)
NOT
NULL
,
`firstname`
varchar
(
50
)
NOT
NULL
,
`surname`
varchar
(
50
)
NOT
NULL
,
`email`
varchar
(
120
)
NOT
NULL
,
`lastupdate`
int
(
11
)
NOT
NULL
default
'0'
,
`submit`
varchar
(
25
)
NOT
NULL
,
PRIMARY KEY
(
`id`
)
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
AUTO_INCREMENT
=
5
;
DROP
TABLE
IF
EXISTS
`sites`
;
CREATE
TABLE
IF
NOT EXISTS
`sites`
(
`id`
int
(
10
)
NOT
NULL
auto_increment
,
`name`
varchar
(
100
)
NOT
NULL
,
`url`
varchar
(
100
)
NOT
NULL
,
`un`
varchar
(
50
)
NOT
NULL
,
`pw`
varchar
(
50
)
NOT
NULL
,
`client1`
int
(
10
)
NOT
NULL
default
'0'
,
`client2`
int
(
10
)
NOT
NULL
default
'0'
,
`admin1`
int
(
10
)
NOT
NULL
default
'0'
,
`admin2`
int
(
10
)
NOT
NULL
default
'0'
,
`domainid`
int
(
10
)
NOT
NULL
default
'0'
,
`hostid`
int
(
10
)
NOT
NULL
default
'0'
,
`webroot`
varchar
(
50
)
NOT
NULL
,
`files`
text
NOT
NULL
,
`filesdate`
int
(
11
)
NOT
NULL
default
'0'
,
`lastupdate`
int
(
11
)
NOT
NULL
default
'0'
,
`submit`
varchar
(
25
)
NOT
NULL
,
PRIMARY KEY
(
`id`
)
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
AUTO_INCREMENT
=
15
;
DROP
TABLE
IF
EXISTS
`tests`
;
CREATE
TABLE
IF
NOT EXISTS
`tests`
(
`id`
int
(
11
)
NOT
NULL
auto_increment
,
`siteid`
int
(
11
)
NOT
NULL
default
'0'
,
`name`
varchar
(
250
)
NOT
NULL
,
`type`
varchar
(
25
)
NOT
NULL
,
`url`
varchar
(
120
)
NOT
NULL
,
`regex`
varchar
(
250
)
NOT
NULL
,
`p1`
varchar
(
250
)
NOT
NULL
,
`p2`
varchar
(
250
)
NOT
NULL
,
`p3`
varchar
(
250
)
NOT
NULL
,
`p4`
varchar
(
250
)
NOT
NULL
,
`p5`
varchar
(
250
)
NOT
NULL
,
`p6`
varchar
(
250
)
NOT
NULL
,
`frequency`
int
(
10
)
NOT
NULL
default
'0'
,
`lastdone`
int
(
10
)
NOT
NULL
default
'0'
,
`isalert`
varchar
(
2
)
NOT
NULL
,
`setup`
int
(
10
)
NOT
NULL
default
'0'
,
`lastupdate`
int
(
10
)
NOT
NULL
default
'0'
,
`notes`
varchar
(
250
)
NOT
NULL
,
`submit`
varchar
(
25
)
NOT
NULL
,
PRIMARY KEY
(
`id`
)
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
AUTO_INCREMENT
=
11
;
DROP
TABLE
IF
EXISTS
`types`
;
CREATE
TABLE
IF
NOT EXISTS
`types`
(
`id`
varchar
(
7
)
NOT
NULL
,
`name`
varchar
(
50
)
NOT
NULL
,
PRIMARY KEY
(
`id`
)
)
ENGINE
=MyISAM
DEFAULT
CHARSET
=latin1
;
复制代码
咱们如今要用一个更简单容易的方法来实现这一切。 因此,让咱们看看CI
框架为咱们提供了什么功能,咱们要重点介绍AR类。
Active Record
AR是一个'设计模式'-又一个高度抽象的东西,就象 MVC。 它自己不是代码, 只是一个模式。对于代码。 有一些不一样的解释。它的核心是把你的数据库和PHP对象创建一个对应关系。每次,当你执行一个QUERY
语句。每一张数据库里的表是一个类,每一行是一个对象。全部你须要作的只是建立它,修改它或者删除它。例如,“方法”,是从类继承而来。Ruby on Rails 是使用AR模式的,CI也是,尽管这两种框架实现AR的方式有一点不一样。
理论的东西够多了-可是这是什么意思呢?好吧, 用代码简单和清楚地描述一下吧。
使用AR类的优势
AR节约你的
时间,自动运做,使SQL语句方便易懂。
节约时间
当你在PHP编程时,每写一个数据库查询的时候,你每次必定要与数据库创建链接。 对CI来讲,第一次链接数据库时,你在每一个
控制器或
模型的构造
函数里放入这样一行语名:
$this->load->database();
一旦你这样作了,你不须要重复链接, 在那个控制器或模型就能够作任意屡次的查询。
你已经在 config文件中设置了关于数据库的参数,就象咱们在这一章开始时看到的同样。 再一次,这使更新你的网站比较容易,若是你想要改变数据库名字、密码或位置的话。
自动机制
一经你已经链接到数据库, CI 的AR生成隐含的代码。 举例来讲, 若是你进行下列的插入操做:
PHP
$data
=
array
(
'title'
=>
$title
,
'name'
=>
$name
,
'date'
=>
$date
)
;
$this
->
db
->
insert
(
'mytable'
,
$data
)
;
复制代码
你正在插入的数据据已经被在幕后转换成这样一行代码:
PHP
function escapte
(
$str
)
{
switch
(
gettype
(
$str
)
)
{
case
'string'
:
$str
=
"'"
.
$this
->
escape_str
(
$str
)
.
"'"
;
break
;
case
'boolean'
:
$str
=?
(
$str
===
FALSE
)
0
:
1
;
break
;
default
:
$str
=?
(
$str
===
NULL
)
'NULL'
:
$str
;
break
;
}
return
$str
;
}
复制代码
换句话说, CI框架使你的代码变得更强健。 如今,让咱们看看它是如何工做的。
第一,链接数据库很是简单。 在传统的PHP编程时,你多是这样作的:
PHP
$connection
=
mysql_connect
;
(
" localhost" ,
" fred"
,
"12345"
)
mysql_select_db
(
"websites"
,
$connection
)
;
$result
=
mysql_query
;
(
"select * from sites"
,
$connection
)
;
while
(
$row
=
mysql_fetch_array
(
$result
,MYSQL_NUM
)
)
{
foreach
(
$row
as
$attribute
)
{
print
"{$attribute[1]}"
;
}
}
复制代码
换句话说,你必须重复地输入host、username和password,创建一个链接,而后选择一个链接的数据库。 你必须每次都这样作,而后再开始一个查询。 CI以一条命令替换链接工做:
$this->load->database();
在每一个控制器或者模型中或者其它类的构造函数里放入这条命令。 在这以后,你就能够直接开始查询了。 链接数据被保存在你的数据库 config 文件中,CI每次都会去那里查询它。
所以, 在每一个CI函数中,你能够直接进行数据库查询。上面的query在CI中被转换成:
PHP
$query
=
$this
->
db
->
get
(
'sites'
)
;
foreach
(
$query
->
result
(
)
as
$row
)
{
print
$row
->
url
}
复制代码
很简单, 不是吗?
这一个章的余下部分给出不一样query的用法。
读取查询
经常使用的查询是取回来自数据库的数据。等同于select的查询是:
PHP
$query
=
$this
->
db
->
get
(
'sites'
)
;
复制代码
这是一个'select *' 查询,目标是site表-换句话说,它取回全部的行。 若是你偏心分开来写,你能这样作:
PHP
$this
->
db
->
from
(
'sites'
)
;
$query
=
$this
->
db
->
get
(
)
;
复制代码
若是你想要获得特定的列, 而不是所有列, 这样作:
PHP
$this
->
db
->
select
(
'url'
,
'name'
,
'clientid'
)
;
$query
=
$this
->
db
->
get
(
'sites'
)
;
复制代码
你可能要对结果排序,你能够在get语句前插入:
PHP
$this
->
db
->
orderby
(
"name"
,
"desc"
)
;
复制代码
desc是降序的意思。 你也能选择asc(升序) 或
rand(random).
你也可能想要限制返回的行数,好比你想要最初五个结果。你能够在get语句前插入:
PHP
$this
->
db
->
limit
(
5
)
;
复制代码
固然,在大多数的查询,你不可能在表中返回全部记录。 数据库的具备按给定条件过滤返回结果的能力。 这一般使用where子句来实现, CI 这样表达:
PHP
$this
->
db
->
where
(
'clientid'
,
'1'
)
;
复制代码
这条语句会查找客户号是 1 的客户相连的全部的网站。 可是这对咱们并非颇有帮助,咱们并不会记住人员表的ID号。对人来讲,用姓名是比较合理的办法,所以咱们须要链接到people表:
PHP
$this
->
db
->
from
(
'sites'
)
;
$this
->
db
->
join
(
'people'
,
'sites.peopleid=people.id'
)
;
复制代码
有SQL知识的人都知道,这至关于:
注意 SQL 的约定,若是一个列名在二张表中是重复的, 你须要在列名前加上表名和一个“."号。 所以 sites.peopleid 在位置桌子中意谓 peopleid 所在的表是sites.在进行SQL多表查询时,最好把列名进行惟一性的标识,这样能够避免产生岐义,也可让你本身明了。
你能够增长更多的where子句的操做符。 举例来讲,增长否认操做符:
或比较操做符:
PHP
$this
->
db
->
where
(
'id >'
,
'3'
)
;
复制代码
或联合陈述: ("where ...and..."):
PHP
$this
->
db
->
where
(
'url!='
,
' www.mysite.com'
)
;
$this
->
db
->
where
(
'id >'
,
'3'
)
;
复制代码
或使用 $this->db->orwhere()来表示: ("where …or "):
如今让咱们创建一个完整的查询:
PHP
$this
->
db
->
select
(
'url'
,
'name'
,
'clientid'
,
'people.surname as client'
)
;
$this
->
db
->
where
(
'clientid'
,
'3'
)
;
$this
->
db
->
limit
(
5
)
;
$this
->
db
->
from
(
'sites'
)
;
$this
->
db
->
join
(
'people'
,
'sites.clientid=people.id'
)
;
$this
->
db
->
orderby
(
"name"
,
" desc"
)
;
$query
=
$this
->
db
->
get
(
)
;
复制代码
这应该给咱们前五个 (用姓名排序)网站,这些网站属于 3 号客户, 并且还显示客户的姓和他或她的身份证数字!
使用AR的潜在好处是已经进行了自动的转义,所以,你没必要关心转义的问题。 这适用于这样的函数象$this->db->where(), 以及在下一个段中被描述的数据插入和修改语句。(安全警告: 这不一样于阻止交叉脚本攻击-对付这个你须要 CI 的 xss_clean() 函数。它也不相同于验证你的数据-对付这个你须要 CI 的验证类。 见第 5 章。)
显示查询结果
在CI显示查询结果至关简单。假定咱们定义了上述的查询语句, 最后一句是:
PHP
$query
=
$this
->
db
->
get
(
)
;
复制代码
而后,若是有多个结果,他们被保存在$row对象中,你能够用一个 foreach 循环:
PHP
foreach
(
$query
->
result
(
)
as
$row
)
{
print
$row
->
url
;
print
$row
->
name
;
print
$row
->
client
;
}
复制代码
或若是咱们只想要一个结果,它能够做为一个对象被返回, 或在这里当作一个
$row数组:
PHP
if
(
$query
->
num_rows
(
)
>
0
)
{
$row
=
$query
->
row_array
(
)
;
print
$row
[
'url'
]
;
print
$row
[
'name'
]
;
print
$row
[
'client'
]
;
}
复制代码
我比较喜欢对象语法赛过数组-更简洁!
若是你遵照 MVC 模式,你将会在模型中保存你的查询和数据库交互, 而后经过
视图显示数据。
生成和更新查询
AR有三个函数帮助你在数据库内生成新的实体,它们是$this->db->insert(),$this->db->update,$this->db->set().
“create"和“update"的不一样之处是“create"是向表中插入一条全新的记录,而"update"是修改表中已经存在的记录。所以对“update",你必须首先定位须要修改的记录。
CI 用数组来保存数据,或是使用$this->db->set(); 你能够任选一种。
所以, 若是要在websites数据库中加入一行。首先,确保在咱们的控制器中的构造函数加入:
PHP
$this
->
load
->
database
(
)
;
复制代码
咱们想要增长一个新的网站,包含有一个网址,一个名字,一个类型和一个客户ID。 若是用数组的方式,这多是:
PHP
$data
=
array
(
'url'
=>
'www.mynewclient.com'
,
'name'
=>
'BigCo Inc'
,
'clientid'
=>
'33'
,
'type'
=>
'dynamic'
)
;
复制代码
把这些信息增长到sites表,咱们使用:
PHP
$this
->
db
->
insert
(
'sites'
,
$data
)
;
复制代码
咱们更可使用$this->db->set():
PHP
$this
->
db
->
set
(
'url'
,
'www.mynewclinet.com'
)
;
$this
->
db
->
set
(
'name'
,
'BigCo Inc'
)
;
$this
->
db
->
set
(
'clientid'
,
'33'
)
;
$this
->
db
->
set
(
'type'
,
'dynamic'
)
;
$this
->
db
->
insert
(
'sites'
)
;
复制代码
若是咱们正在更新一笔现有的记录, 咱们也能够建立一个数组, 或使用 $this->db->set(), 可是如今有二个不一样。
第一, 咱们必须定位咱们想要更新的记录; 其次,咱们须要使用$this->db->update(). 若是我想要在sites中更新一笔记录(针对'id'列的值1的那行记录),使用数组的方式是这样处理的:
PHP
$this
->
db
->
where
(
'id'
,
'1'
)
;
$this
->
db
->
update
(
'sites'
,
$data
)
;
复制代码
你也可使用$this->db->set()方式, 就象前面作过的那样。
CI 提供几个函数检查数据库是否成功执行了相关操做。 最有用的:
PHP
$this
->
db
->
affected_rows
(
)
;
复制代码
在执行insert或update后应该返回 '1'-可是若是我正在update一批记录的话,可能返回更大的一个整数。
你已经注意到当我insert一笔新的记录时,我没有设定ID这一列。这是由于ID这列被设定为自动插入类型。可是当我update一笔现有的记录时候,我必须引用ID属性,不然数据库不知道该改变哪一笔记录。
若是我正在insert一笔新的记录, 在实际产生它以前,咱们并不知道ID具体的值。若是我须要引用新的记录的ID, 使用下列语句:
PHP
$new_id_number
=
$this
->
db
->
insert_id
(
)
;
复制代码
(这一行代码必须跟在insert语句以后,不然可能获得错误的结果.)
还有一点须要知道,CI的AR操做, 包括 $this->db->insert() 和 $this->db->update()会被本身地转义。
从 1.5 版, CI 也包含了对事务的支持,即指定的一批SQL操做要么全成功,要么全失败,换句话说,要么提交,要么回滚。这在复式记账
应用和许多商业应用中是很重要的。举例来讲,说你正在卖电影票。 你须要接受付款, 同时分配座位。 若是你的系统收费成功但分配座位失败,这个客户确定是要光火的。
CI 如今也让事务处理变得很简单,即要么“提交”,要么回滚。你能够参考用户手册以获得更多关于事务的信息。
删除操做
删除操做也许是最简单的。你只要定位好须要删除记录,好比咱们要删除ID为2的记录:
PHP
$this
->
db
->
where
(
'id'
,
'2'
)
;
$this
->
db
->
delete
(
'sites'
)
;
复制代码
要当心使用删除操做,由于若是你不注意where中的条件,可能会误操做,甚至最坏的结果是删除整张表。
AR和传统SQL编程的结合
CI 不要求你只能使用AR,你也能用CI直接发送SQL查询。好比:假定你已在构造函数里已链接了数据库,你能够在须要的地方直接使用相似的SQL查询:
PHP
$this
->
db
->
query
(
"select id, name, url from sites where 'type'='dynamic'"
)
;
复制代码
我我的以为AR更容易使用。借助数组为AR准备数据更直观,更容易理解,虽然可能须要更多的代码。AR还能自动转义,对不熟悉SQL语法的程序员会更有吸引力。 还有须要介绍的一个使用AR的技巧是关于where函数的,当咱们须要在where中放入这样一个比较复要的语句时: client='3' and (type = 'dynamic' or type = 'static') 因为使用了左右括号,所以不能直接放入where函数,你能够把这分红两行: $c; $this->db->where($condition); 在一些复杂的状况下,你可能须要直接使用SQL语法创建查询而不是使用AR,好比要使用复杂的表链接,子查询,左链接等等。无论怎样,CI框架确保你能作到传统PHP能作到的一切,而带来更多的好处。 须要指出的是,若是你试着混合使用AR和直接的SQL查询,你可能会有麻烦。 摘要 咱们已经介绍了CI的Active Record类,并且见到,它是多么容易使用: 。创建和一或较多的数据库的链接 。使用AR从数据库读取数据或插入,更新,删除信息 。或直接使用SQL的标准语法执行查询 CI 的AR功能是概念清晰又容易使用, 并且使代码很是易读。它自动化数据库链接,并把链接数据保存至一个 config 文件。