《PHP設(shè)計模式介紹》第十四章 動態(tài)記錄模式(2)_PHP教程
推薦:《PHP設(shè)計模式介紹》第十三章 適配器模式接口的改變,是一個需要程序員們必須(雖然很不情愿)接受和處理的普遍問題。程序提供者們修改他們的代碼;系統(tǒng)庫被修正;各種程序語言以及相關(guān)庫的發(fā)展和進化。我孩子的無數(shù)玩具中有一個簡要地描
更進一步,你應(yīng)做一些對setup()方法的較為全面的測試(并多學(xué)習(xí)一些關(guān)于ADOConnection API的實例)
| class ActiveRecordTestCase extends UnitTestCase { // ... function testSetupLeavesTableEmptyWithCorrectStructure() { $rs = $this->conn->execute(‘select * from bookmark’); $this->assertIsA($rs, ‘ADORecordSet’); $this->assertEqual(0,$rs->recordCount()); foreach(array( ‘id’, ‘url’, ‘name’, ‘description’, ‘tag’, ‘created’, ‘updated’) as $i => $name) { $this->assertEqual($name, $rs->fetchField($i)->name); } } } |
即使你不太熟悉ADOdb,你也能正確的認識到execute()方法在成功執(zhí)行后將返回一個ADORecordSet 對象,這個對象有一個recordCount()方法,這個方法可以驗證表是否為空。記錄集對象還有一些方法去瀏覽記錄集元數(shù)據(jù)和fetchField()方法來效驗表結(jié)構(gòu)。
記錄建立
在連接到數(shù)據(jù)庫后,您的“創(chuàng)建,讀取,更新,刪除”(CRUD)程序就能在數(shù)據(jù)庫中進行相關(guān)的行操作。
CRUD
CRUD 是創(chuàng)建,讀取,更新,刪除的縮寫. 這些都是數(shù)據(jù)庫交互式應(yīng)用系統(tǒng)的基礎(chǔ)
許多PHP WEB使用都是CRUD界面應(yīng)用的示例
(http://c2.com/cgi/wiki?CrudScreen).
下面的示例應(yīng)用是將一些書簽存入數(shù)據(jù)庫,因此我們將這個動態(tài)記錄類命名為Bookmark。要建立一個新的書簽,可使用new方法建立一個該類的實例,并設(shè)定實例的相關(guān)屬性。當(dāng)所有的屬性都已設(shè)定(強制性),我們使用save()方法將其存入到數(shù)據(jù)庫中。
| class ActiveRecordTestCase extends UnitTestCase { // ... function testNew() { $link = new Bookmark; $link->url = ‘http://simpletest.org/’; $link->name = ‘SimpleTest’; $link->description = ‘SimpleTest project homepage’; $link->tag = ‘testing’; $link->save(); $this->assertEqual(1, $link->getId()); } } |
從這個實驗中我們看到,Bookmark類有一些公共的屬性與一個save()方法。當(dāng)實例被保存到數(shù)據(jù)庫后,getid()方法可以返回指定給它的數(shù)據(jù)庫記錄號(ID)。
下面是Bookmark類的屬性定義
| class Bookmark { public $url; public $name; public $description; public $tag; } |
讓我們轉(zhuǎn)向研究save()方法。它需要一個數(shù)據(jù)庫連接,因此我們在構(gòu)造函數(shù)中用DB::conn()連接工廠實現(xiàn)。
| class Bookmark { protected $id; protected $conn; // ... public function __construct() { $this->conn = DB::conn(); } } |
$conn 現(xiàn)在就成為適合save()方法的數(shù)據(jù)庫連接了。
| class Bookmark { // ... const INSERT_SQL = “ insert into bookmark (url, name, description, tag, created, updated) values (?, ?, ?, ?, now(), now()) “; protected function save() { $rs = $this->conn->execute( self::INSERT_SQL ,array($this->url, $this->name, $this->description, $this->tag)); if ($rs) { $this->id = (int)$this->conn->Insert_ID(); } else { trigger_error(‘DB Error: ‘.$this->conn->errorMsg()); } } } |
ADOdb 的 MySQL 驅(qū)動支持按位置的參數(shù)替換功能,并且能正確的引用(按類型加引號)參數(shù)。SQL的形參以問號(?)的形式指定,你可以在execute()方法的第二個參數(shù)的位置,以數(shù)組的形式傳遞實參值到SQL語句中來替換以問號點位的形參。
Insert_ID()方法可能已引起你的注意:它返回最后一次執(zhí)行插入操作時自增長列的值。
分享:《PHP設(shè)計模式介紹》第十二章 裝飾器模式若你從事過面向?qū)ο蟮膒hp開發(fā),即使很短的時間或者僅僅通過本書了解了一些,你會知道,你可以 通過繼承改變或者增加一個類的功能,這是所有面向?qū)ο笳Z言的一個基本特性。如果已經(jīng)存在的一個php
- 相關(guān)鏈接:
- 教程說明:
PHP教程-《PHP設(shè)計模式介紹》第十四章 動態(tài)記錄模式(2)
。