版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第二章第三章第四章 使用CI簡化數(shù)據(jù)庫開發(fā) David Upton翻譯:CodeIgniter中國你學(xué)習(xí)CI是因為你想要使編程更容易和更有生產(chǎn)力。本章講述CI的Active Record類。 如果CI只提供了一個Active Record類,那么它也是物超所值的。當然,CI是免費的,只不過我要強調(diào)Active Record類的價值是非常高的,它是你提高生產(chǎn)力的主要工具。Active Record使你以最小的代價獲得最大的回報。它簡單、易于使用和維護。本章描述CI如何連接到一個數(shù)據(jù)庫,你如何使用Active Record操縱數(shù)據(jù)庫。你將會見到:l Active Record類與傳統(tǒng)PHP/MyS
2、QL接口的比較l 如何編寫“讀取”查詢,并顯示結(jié)果l 如何做創(chuàng)建、更新和刪除的查詢CI保留讓你用傳統(tǒng)的方法編寫數(shù)據(jù)庫查詢,但是我不會詳細介紹這部分內(nèi)容。它的知識完全被在線用戶指南所包括。使用Active Record類后,你可能不會再用傳統(tǒng)的方式來做數(shù)據(jù)庫查詢了。配置設(shè)置你或許已經(jīng)注意到在這本書的大多數(shù)的章節(jié)會談到system/application/config 文件夾和里面的配置文件。這些文件對控制CI按要求工作相當必要。而且你可以讓大部分的配置參數(shù)等于系統(tǒng)的默認值。database配置文件在正常使用數(shù)據(jù)庫之前需要進行設(shè)置?;旧希銉H僅必須告訴它你的數(shù)據(jù)庫在哪里、它是什么類型。文件的默認
3、值為:代碼如下:$active_group = "default"$db'default''hostname' = ""$db'default''username' = ""$db'default''password' = ""$db'default''database' = ""$db'default''dbdriver' = &quo
4、t;"(譯注:到CodeIgniter 版時又多了如下一些內(nèi)容)代碼如下:$db'default''db_debug' = TRUE;$db'default''cache_on' = FALSE;$db'default''cachedir' = ""$db'default''char_set' = "utf8"$db'default''dbcollat' = "utf8_gen
5、eral_ci"其他的選項可以保留為默認值。 必選項是:l hostname:你的數(shù)據(jù)庫的位置,例如,'localhost' 或一個IP地址l username和password:數(shù)據(jù)庫用戶的用戶名和密碼必須有充分的權(quán)限,允許你的網(wǎng)站存取數(shù)據(jù)庫中的數(shù)據(jù)。這不同于(通常)你的網(wǎng)站或ISP控制面板的用戶名和密碼。l database:你的數(shù)據(jù)庫的名字,例如,'websites'l dbdriver:你正在使用的數(shù)據(jù)庫的類型,CI可接受的選項有MySQL、MySQLi、PostgreSQL、ODBC和MSSQL。以我的經(jīng)驗來看,最困難的事情之一就是把新的CI
6、網(wǎng)站連接到數(shù)據(jù)庫。你可能需要查詢你的ISP。有時他們的數(shù)據(jù)庫運行在與他們的Web服務(wù)器的IP地址不同的地方。如果你正在使用MySQL,他們可能提供phpMyAdmin,通常告訴你hostname這可能是'localhost'或者它可能是一個IP地址。你可能注意到config文件的內(nèi)容實際上是一個多維數(shù)組。在$db數(shù)組里包含一個叫做default的數(shù)組,你所做的設(shè)置就是往里增加鍵/值對,例如hostname = 127.0.0.1。你還可以增加其他的數(shù)據(jù)庫設(shè)置,通過改變$active_group的設(shè)置可以容易地更改數(shù)據(jù)庫。這為網(wǎng)站連接到多個數(shù)據(jù)庫提供了可能性舉例來說,一個測試數(shù)據(jù)
7、庫和一個產(chǎn)品數(shù)據(jù)庫。你可以很容易地在他們之間切換。或者你可以在兩個數(shù)據(jù)庫之間交換數(shù)據(jù)。為我們的網(wǎng)站設(shè)計數(shù)據(jù)庫我想表達的是CI能用來開發(fā)正式的網(wǎng)站。我現(xiàn)在正在維護客戶的一些網(wǎng)站,而且我想要監(jiān)控他們,用我設(shè)計的方法測試它們,用數(shù)據(jù)庫保存我想要的數(shù)據(jù),而且可以得到這些網(wǎng)站的分析報告。因此讓我們試著創(chuàng)建它。先讓我們確定一些目標。它們是:1. 用最少的人工干預(yù)管理一個或更多的遠程網(wǎng)站2. 對遠程網(wǎng)站進行定期的測試3. 生成符合要求的分析報告,提供網(wǎng)站的詳細信息和測試結(jié)果因此,首先我們將需要一個網(wǎng)站的數(shù)據(jù)庫。在MySQL中建立一個名為websites的數(shù)據(jù)庫,你也可以使用別的RDBMS。現(xiàn)在,我們需要增加
8、一些表來保存各種數(shù)據(jù)。讓我們?yōu)榫W(wǎng)站增加一張表,字段有URL,他們的名字和密碼/用戶名,和他們的類型。我們也將會為每個網(wǎng)站建立一個ID字段。而且在MySQL數(shù)據(jù)庫中,至少需要為每個實體生成一個唯一的ID,可以使用自動增量類型來達到這一目的。每個網(wǎng)站可能被放置在不同的主機上,我們需要另一個hosts表來保存這個信息。一般有一個域名與主機相關(guān)聯(lián),所以我們需要一個domains表來保存有關(guān)域名的信息,還需要一個people表來記錄這些人的姓名,密碼,郵件地址,備用郵件地址, 號碼,甚至寵物的名字,可能還有其它的一些什么。因此我們的網(wǎng)站數(shù)據(jù)庫表需要包括這樣一些字段:域名ID、主機ID、兩個人員ID,一個
9、存放網(wǎng)站站長的ID和一個存放網(wǎng)站管理人的ID(管理人為網(wǎng)站提供技術(shù)支持,保證網(wǎng)站正常運行。)你能見到,這是一個完整的關(guān)系型數(shù)據(jù)庫,讓我們來建立它!(本章的附錄中有該數(shù)據(jù)庫的詳細資料,如果你想創(chuàng)建這個數(shù)據(jù)庫,請執(zhí)行該MySQL查詢。)我們現(xiàn)在要用一個更簡單容易的方法來實現(xiàn)這一切。所以,讓我們看看CI框架為我們提供了什么功能,我們要重點介紹Active Record類。Active Record“Active Record”是一個“設(shè)計模式”。另一方面又是一個高度抽象的系統(tǒng),就像MVC,它提供一個解決公共編程問題的模板,并且也有一些枯燥無味的書籍。它本身不是代碼,只是一個代碼的模式。對于Activ
10、e Record,有一些不同的解釋。它的核心是在你每次執(zhí)行查詢時,把你的數(shù)據(jù)庫與一個對象建立一個對應(yīng)關(guān)系。每一張數(shù)據(jù)庫表是一個類,每一行是一個對象。所有你需要做的只是創(chuàng)建它、讀取它、修改它或者刪除它。例如,“方法”,是從類繼承而來。Ruby on Rails是使用Active Record模式的,CI也是,盡管這兩種框架實現(xiàn)Active Record的方式有一點不同。理論的東西夠多了這是什么意思呢?好吧,用代碼簡單和清楚地描述一下吧。使用Active Record類的優(yōu)點Active Record節(jié)約你的時間,自動運作,使SQL語句方便易懂。節(jié)約時間當你在PHP中編寫一個常規(guī)數(shù)據(jù)庫查詢時,你每
11、次一定要與數(shù)據(jù)庫建立連接。對CI來說,第一次連接數(shù)據(jù)庫時,你在每個控制器或模型的構(gòu)造函數(shù)里放入這樣一行:代碼如下:$this->load->database();一旦你這樣做了,你不需要重復(fù)連接,在那個控制器或模型中就可以執(zhí)行任意多次的查詢。你已經(jīng)在config文件中設(shè)置了關(guān)于數(shù)據(jù)庫的參數(shù),就象我們在這一章開始時看到的一樣。再一次,這使更新你的網(wǎng)站比較容易,如果你想要改變數(shù)據(jù)庫名字、密碼或位置的話。自動機制你一旦已經(jīng)連接到數(shù)據(jù)庫,CI的Active Record生成隱含的代碼。舉例來說,如果你進行下列的插入操作:代碼如下:$data = array( 'title'
12、 => $title, 'name' => $name, 'date' => $date );$this->db->insert('mytable', $data);你正在插入的數(shù)據(jù)已經(jīng)在幕后轉(zhuǎn)換成這樣一行代碼:代碼如下:function escape($str) switch (gettype($str) case 'string': $str = "'".$this->escape_str($str)."'" break; case &
13、#39;boolean': $str = ($str = FALSE) ? 0 : 1; break; default : $str = ($str = NULL) ? 'NULL' : $str; break; return $str;換句話說,CI框架使你的代碼變得更強健?,F(xiàn)在,讓我們看看它是如何工作的。第一, 連接數(shù)據(jù)庫非常簡單。在傳統(tǒng)的PHP編程時,你可能是這樣做的:代碼如下:$connection = mysql_connect("localhost","fred","12345");mysql_se
14、lect_db("websites", $connection);$result = mysql_query ("SELECT * FROM sites", $connection);while ($row = mysql_fetch_array($result, MYSQL_NUM) foreach ($row as $attribute) print "$attribute1 "換句話說,你必須重復(fù)地輸入host、username和password,建立一個連接,然后選擇一個連接的數(shù)據(jù)庫。你必須每次都這樣做,然后再開始一個查詢。C
15、I以一條命令替換連接工作:代碼如下:$this->load->database();在每個控制器、模型或者其它類的構(gòu)造函數(shù)里放入這條命令。之后,你就可以直接開始查詢了。連接數(shù)據(jù)被保存在你的database 配置文件中,CI每次都會去那里查詢它。因此,在每個CI函數(shù)中,你可以直接進行數(shù)據(jù)庫查詢。上面的查詢在CI中被轉(zhuǎn)換成:代碼如下:$query = $this->db->get('sites'); foreach ($query->result() as $row) print $row->url 很簡單,不是嗎?本章的余下部分給出不同查詢的用
16、法?!白x取”查詢常用的查詢是取回來自數(shù)據(jù)庫的數(shù)據(jù)。完成一個“讀取”查詢的基本指令是:代碼如下:$query = $this->db->get('sites');這是一個“SELECT *”查詢,目標是sites表。換句話說,它取回所有字段。如果你偏愛分開來寫,你可以這樣做:代碼如下:$this->db->from('sites');$query = $this->db->get();如果你想要“SELECT”特定的列,而不是全部列,這樣做:代碼如下:$this->db->select('url',
17、'name', 'clientid');$query = $this->db->get('sites');你可能要對結(jié)果排序,你可以在$this->db->get語句前插入:代碼如下:$this->db->orderby("name", "desc");desc是降序的意思。你也可以選擇asc(升序)或rand(隨機)。你也可能想要限制返回的行數(shù),比如你想要最初的五個結(jié)果。你可以在get語句前插入:代碼如下:$this->db->limit(5); 當然,在大
18、多數(shù)的查詢,你不喜歡返回表中的所有記錄。數(shù)據(jù)庫具有按給定條件過濾返回結(jié)果的能力。這通常使用where子句來實現(xiàn),CI這樣表達:代碼如下:$this->db->where('clientid', '1'); 這條語句會查找客戶ID是1的客戶相連的所有的網(wǎng)站。但是這對我們并不是很有幫助,我們并不會記住people表的ID。對人來說,用姓名是比較合理的辦法,因此我們需要連接到people表:代碼如下:$this->db->from('sites');$this->db->join('people',
19、'sites.peopleid = people.id');有SQL知識的人都知道,這相當于:代碼如下:SELECT * FROM sites JOIN people ON注意SQL的約定,如果一個列名在二張表中是重復(fù)的,的意思是在sites表中的peopleid字段。在進行SQL多表查詢時,最好把列名進行唯一性的標識,這樣可以避免產(chǎn)生岐義,也可以讓你自己明了。你可以增加更多的where子句的操作符。舉例來說,增加否定操作符:代碼如下:$this->db->where('url !=', ' mysite ');或比較操作符:代碼如下
20、:$this->db->where('id >', '3');或組合語句(“WHEREAND”):代碼如下:$this->db->where('url !=', ' mysite ');$this->db->where('id >', '3');或使用$this->db->orwhere()來表示(“WHEREOR”):代碼如下:$this->db->where('url !=', ' mysite
21、39;);$this->db->orwhere('url !=', ' anothersite ');現(xiàn)在讓我們建立一個完整的查詢:代碼如下:$this->db->select('url','name','clientid','people.surname AS client');$this->db->where('clientid', '3');$this->db->limit(5);$this->db->
22、from('sites');$this->db->join('people', 'sites.clientid = people.id');$this->db->orderby("name", "desc");$query = $this->db->get();這應(yīng)該取得前五個(用姓名排序)網(wǎng)站,這些網(wǎng)站屬于3號客戶,而且還顯示客戶的姓和他(她)的ID號!使用Active Record的潛在好處是已經(jīng)進行了自動的轉(zhuǎn)義,因此,你不必關(guān)心轉(zhuǎn)義的問題。這適用于這樣的函數(shù)像$th
23、is->db->where(),以及在下一段中描述的數(shù)據(jù)插入和修改語句。(安全警告:這不同于阻止跨站腳本攻擊對付這個你需要CI的xss_clean()函數(shù)。它也不相同于驗證你的數(shù)據(jù)對付這個你需要CI的驗證類,詳見第五章。)顯示查詢結(jié)果在CI顯示查詢結(jié)果相當簡單。假定我們定義了上述的查詢語句,最后一句是:代碼如下:$query = $this->db->get();然后,如果有多個結(jié)果,他們被保存在$row對象中,你可以用一個foreach循環(huán):代碼如下:foreach($query->result() as $row) print $row->url; pr
24、int $row->name; print $row->client;或如果我們只想要一個結(jié)果,它可以作為一個對象被返回,或在這里當做一個$row數(shù)組:代碼如下:if ($query->num_rows()>0) $row =$query->row_array(); print $row'url' print $row'name' print $row'client'相比數(shù)組而言,我更喜歡對象語法,因為它更簡潔!如果你遵守MVC模式,你將會在模型中保存你的查詢和數(shù)據(jù)庫交互,然后通過視圖顯示數(shù)據(jù)?!皠?chuàng)建”和“更新”查詢
25、Active Record有三個函數(shù)幫你在數(shù)據(jù)庫內(nèi)生成新的實體,它們是$this->db->insert()、$this->db->update和$this->db->set()?!癱reate”和“update”的不同之處是“create”是向表中插入一條全新的記錄,而“update”是修改表中已經(jīng)存在的記錄。因此對“update”,你必須首先定位需要修改的記錄。CI用數(shù)組來保存數(shù)據(jù),或是使用$this->db->set();你可以任選一種。因此,如果要在websites數(shù)據(jù)庫的sites表中加入一行。首先,確保在我們的控制器中的構(gòu)造函數(shù)加入:
26、代碼如下:$this->load->database();我們想要增加一個新的網(wǎng)站,包含有一個網(wǎng)址,一個名字,一個類型和一個客戶ID。如果用數(shù)組的方式,這可能是:代碼如下:$data = array( 'url' => ' mynewclient ', 'name' => 'BigCo Inc', 'clientid' => '33', 'type' => 'dynamic' );把這些信息增加到sites表,我們使用:代碼如下:$
27、this->db->insert('sites', $data);或者,我們也可以使用$this->db->set()設(shè)置每一個值:代碼如下:$this->db->set('url',' mynewclinet ');$this->db->set('name','BigCo Inc');$this->db->set('clientid', '33');$this->db->set('type',&
28、#39;dynamic');$this->db->insert('sites');如果我們正在更新一條現(xiàn)有的記錄,我們也可以創(chuàng)建一個數(shù)組或使用$this->db->set(),但是現(xiàn)在有兩點不同。第一,我們必須定位我們想要更新的記錄;其次,我們需要使用$this->db->set(),如果我想要在sites表中更新一條記錄(針對“id”字段的值為1的那行記錄),使用數(shù)組的方式是這樣處理的:代碼如下:$this->db->where('id', '1');$this->db->up
29、date('sites', $data);你也可以使用$this->db->set()方式,就像前面做過的那樣。CI提供了幾個函數(shù)檢查數(shù)據(jù)庫是否成功執(zhí)行了相關(guān)操作。最有用的:代碼如下:$this->db->affected_rows(); 在執(zhí)行insert或update后應(yīng)該返回 '1'-但是如果我正在update一批記錄的話,可能返回更大的一個整數(shù)。你已經(jīng)注意到當我insert一筆新的記錄時,我沒有設(shè)定ID這一列。這是因為ID這列被設(shè)定為自動插入類型。但是當我update一筆現(xiàn)有的記錄時候,我必須引用ID屬性,否則數(shù)據(jù)庫不知道該改變哪
30、一筆記錄。如果我正在insert一筆新的記錄, 在實際產(chǎn)生它之前,我們并不知道ID具體的值。如果我需要引用新的記錄的ID, 使用下列語句:$new_id_number = $this->db->insert_id(); (這一行代碼必須跟在insert語句之后,否則可能得到錯誤的結(jié)果.)還有一點需要知道,CI的Active Record操作,包括$this->db->insert_id()和$this->db->update_id()會自己轉(zhuǎn)義。從 1.5 版,CI也包含了對事務(wù)的支持,即指定的一批SQL操作要么全成功,要么全失敗,換句話說,要么提交,要么回滾。這在復(fù)式記帳應(yīng)用和許多商業(yè)應(yīng)用中是很重要的。舉例來說,說你正在賣電影票。你需要接受付款,同時分配座位。如果你的系統(tǒng)收費成功但分配座位失敗,這個客戶肯定是要光火的。CI 現(xiàn)在也讓事務(wù)處理變得很簡單,即要么“提交”,要么回滾。你可以參考用戶手冊以得到更多關(guān)于事務(wù)的信息。刪除操作刪除操作也許是最簡單的。你只要定位好需要刪除記錄,比如我們要刪除ID為2的記錄:$this->db->where('id','2');$this->db->delete('sites');要小心
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 互聯(lián)網(wǎng)公司實習(xí)生協(xié)議
- 歐式酒店羅馬柱施工合同
- 照明工程人工費施工合同
- 會計實習(xí)生聘用合同
- 企業(yè)社會責任績效
- 糖尿病的健康管理方案設(shè)計
- 工程項目合同質(zhì)量管理情況記錄
- 電子產(chǎn)品測試顧問協(xié)議
- 工程施工轉(zhuǎn)讓合同協(xié)議
- 2022年大學(xué)工程力學(xué)專業(yè)大學(xué)物理下冊期中考試試題B卷-附解析
- 哈爾濱工業(yè)大學(xué)介紹
- 現(xiàn)代漢語漢字PPT
- 執(zhí)業(yè)藥師再次注冊申請表
- 腸易激綜合征的診斷治療課件
- 基于核心素養(yǎng)的小學(xué)語文教學(xué)評一體化課堂實踐研究課題研究階段性工作小結(jié)
- 供應(yīng)商調(diào)查表格式
- 民警職務(wù)晉升考察材料范文四篇
- PC裝配式結(jié)構(gòu)施工監(jiān)理實施細則
- 《漢字應(yīng)用水平測試題》練習(xí)試卷及其參考答案
- 《舞蹈》課程教案-站姿組合
- 臺球廳滅火和應(yīng)急疏散預(yù)案建議9篇
評論
0/150
提交評論