原文:
使用 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 文件。