使用 CodeIgniter 框架快速開發 PHP 應用(四)

原文: 使用 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
select sites. *  from sites ,people
where sites.peopleid =people.id
複製代碼


注意 SQL 的約定,若是一個列名在二張表中是重複的, 你須要在列名前加上表名和一個「."號。 所以 sites.peopleid 在位置桌子中意謂 peopleid 所在的表是sites.在進行SQL多表查詢時,最好把列名進行惟一性的標識,這樣能夠避免產生岐義,也可讓你本身明瞭。

你能夠增長更多的where子句的操做符。 舉例來講,增長否認操做符:

PHP
$this -> db -> where ( 'url!=' , ' www.mysite.com' ) ;
複製代碼


或比較操做符:

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 -> where ( 'url!=' , ' www.mysite.com' ) ;
$this -> db -> orwhere ( 'url!=' , ' www.anothersite.com' ) ;
複製代碼


如今讓咱們創建一個完整的查詢:

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 文件。
相關文章
相關標籤/搜索