PHP学习--做个大杂烩(用类似PetShop4.0的设计模式开发)(一)
这个BBS主要实现的功能:常用贴子发布,浏览以及回复。效果就像有名的“猫扑大杂烩”那样。用PHP5.2 + Apache2.0 + MySql(也支持Access),我使用的系统是WinXp。
PetShop最大的特点就是分层架构,各个层次之间非常清晰。在PetShop中有一个DBUtility的项目,里面有两个类:一个是针对SqlServer数据库的SQLHelper,另一个是针对Oracle数据库的OracleHelper,这是两个数据库操作辅助类,所有对数据库的操作,都是通过这两个类来完成的。今天的任务主要来完成数据库操作辅助类的开发。
在根目录下建一个文件夹Utility,再在其下建文件夹DataBaseHelper,用来存放今天的主角 MySqlHelper类与AccessHelper类,他们都实现IHelper接口。

IHelper接口定义了三个方法:ExecuteNonQuery(), ExecuteScalar(), ExecuteReader()。
其中:ExecuteNonQuery()主要执行相应的SQL语句(Delete,Update,Insert),并返回受影响记录的条数;
ExecuteScalar()执行相应SQL语句,并返回结果集中第一行的第一列
ExecuteReader() 执行SQL语句,并返回结果集(主要用于Select语句)(对于些方法,使用不同的数据库会返回不同的结果集,如:在MySqlHelper类中,返回的是一个数组,而在AccessHelper中,返回的是游标,但不影响我们使用)
系统要支持其他的数据库,都必须实现这个接口。
IHelper接口源代码如下:
//---------------------------------------------2
//---------- 数据辅助类接口 ---------3
//---------------------------------------------4
interface IHelper5
{6
public function ExecuteNonQuery($strSql);7
8
public function ExecuteScalar($strSql);9
10
public function ExecuteReader($strSql);11
}
MySqlHelper与AccessHelper都实现了IHelper接口,下面主要以MySqlHelper类为示例来讲解。
MySqlHelper类实现了IHelper接口,它有一个私有成员:conn,数据库连接标识符变量。在类的构造函数中,这个变量被初始化,并选择相应的数据库。源代码如下:
//数据库连接标识2
private $conn;3
4
//构造函数5
//初始化变量6
public function __construct()7
{8
$this->conn = mysql_connect("localhost", "root", "jld");9
if(!$this->conn)10
{11
throw new Exception("无法连接MySql"); 12
}13
mysql_select_db("MySite", $this->conn); 14
} MySqlHelper既然实现了IHelper接口,那么就必须实现接口中定义的方法:ExecuteNonQuery,ExecuteScalar,ExecuteReader。其实现的源代码如下(代码比较简单,就不用多解释了,不了解的可以查一下PHP中文手册):
//执行SQL操作,返回受影响记录条数2
public function ExecuteNonQuery($strSql)3
{4
$result = mysql_query($strSql);5
6
if(!$result)7
{8
throw new Exception("无法执行SQL操作==>MySqlHelper->ExecuteNonQuery({$strSql})"); 9
}10
11
return $result;12
}13

14
15
//将记录结果保存到数组中,以数组的形式返回16
public function ExecuteReader($strSql)17
{18
$result = mysql_query($strSql);19
20
if($result)21
{22
while($temp = mysql_fetch_array($result))23
$MyValue = $temp;24
25
mysql_free_result($result);26
27
return $MyValue;28
}29
}30
31
32
//执行SQL操作,返回第一条记录第一个字段的值33
public function ExecuteScalar($strSql)34
{35
if($result = $this->ExecuteReader($strSql))36
return $result[0][0];37
}
主体部分已经完成,这里还有一个小小的注意:在用ASP.NET的时候,每次连接数据库,执行完相应的操作之后,必须立即马上关闭连接,以避免资源的浪费。所以,我在这里添加了一个方法:Free(),用以释放数据库连接资源。在每用完相应操作后,就调用Free()方法。
//释放数据库连接2
public function Free()3
{4
try5
{ 6
mysql_close($this->conn);7
}8
catch(Exception $ex)9
{10
; 11
}12
}MySqlHelper 数据库辅助类就这样,感觉还是很简单的。
示例源代码下载

浙公网安备 33010602011771号