《PHP设计模式介绍》第十四章 动态记录模式(2)_PHP教程
推荐:《PHP设计模式介绍》第十三章 适配器模式接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。我孩子的无数玩具中有一个简要地描
更进一步,你应做一些对setup()方法的较为全面的测试(并多学习一些关于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()方法在成功执行后将返回一个ADORecordSet 对象,这个对象有一个recordCount()方法,这个方法可以验证表是否为空。记录集对象还有一些方法去浏览记录集元数据和fetchField()方法来效验表结构。
记录建立
在连接到数据库后,您的“创建,读取,更新,删除”(CRUD)程序就能在数据库中进行相关的行操作。
CRUD
CRUD 是创建,读取,更新,删除的缩写. 这些都是数据库交互式应用系统的基础
许多PHP WEB使用都是CRUD界面应用的示例
(http://c2.com/cgi/wiki?CrudScreen).
下面的示例应用是将一些书签存入数据库,因此我们将这个动态记录类命名为Bookmark。要建立一个新的书签,可使用new方法建立一个该类的实例,并设定实例的相关属性。当所有的属性都已设定(强制性),我们使用save()方法将其存入到数据库中。
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()方法。当实例被保存到数据库后,getid()方法可以返回指定给它的数据库记录号(ID)。
下面是Bookmark类的属性定义
class Bookmark { public $url; public $name; public $description; public $tag; } |
让我们转向研究save()方法。它需要一个数据库连接,因此我们在构造函数中用DB::conn()连接工厂实现。
class Bookmark { protected $id; protected $conn; // ... public function __construct() { $this->conn = DB::conn(); } } |
$conn 现在就成为适合save()方法的数据库连接了。
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 驱动支持按位置的参数替换功能,并且能正确的引用(按类型加引号)参数。SQL的形参以问号(?)的形式指定,你可以在execute()方法的第二个参数的位置,以数组的形式传递实参值到SQL语句中来替换以问号点位的形参。
Insert_ID()方法可能已引起你的注意:它返回最后一次执行插入操作时自增长列的值。
分享:《PHP设计模式介绍》第十二章 装饰器模式若你从事过面向对象的php开发,即使很短的时间或者仅仅通过本书了解了一些,你会知道,你可以 通过继承改变或者增加一个类的功能,这是所有面向对象语言的一个基本特性。如果已经存在的一个php
- 相关链接:
- 教程说明:
PHP教程-《PHP设计模式介绍》第十四章 动态记录模式(2)。