分享
 
 
 

用PHP开始你的MVC (二)抽象数据库接口

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

二、抽象数据库接口(利用数据操作管理类)

在用mvc模式开发的时候,model层负责数据库的所有操作,为了对数据库的操作进行统一的管理,我们需要定义一个数据库操作管理类,由他来接替所有的数据库操作,也就是整个系统中只有这个数据库操作管理类,可以直接对数据库进行操作,如果其他的类需要对数据库进行操作,那它就必须调用和通过这个类来实现。

下面的Db类就是一个这样的类。

<?php

/**************************************************************

* descript : mysql数据库操作管理类

*

* author : 大龄青年

* Email :wenadmin@sina.com

* qq : 303015292

* msn : wenguangqing@hotmail.com

*************************************************************/

/*

* example 1: 获取序列

* <?

* $db = new Db();

* $result = $db->getSeq('art_id', 2, 1);

* ?>

*/

/*

* example 2: 分页查询

* <?

* $db = new Db();

* $result = $db->&queryPage('select id,name from table', 2, 10, DB_FETCH_ASSOC);

* foreach($result as $row)

* echo $row['id'],'------'.$row['name'].'<br>';

* ?>

*/

/*

* example 3: 插入数据

* <?

* $db = new Db();

* $result = $db->execute("insert into table (id, name) values(1,'name')");

* if($result>0) echo '插入数据成功';

* else echo '插入数据失败';

* ?>

*/

/*

* 定义数据库联接选项

* @var DB_HOST string 数据库主机名称或地址

* @var DB_NAME string 数据库名称

* @var DB_USER string 数据库用户名称

* @var DB_PWD string 数据库用户的密码

* @var DB_PCONNECT boolean 是否建立持久连接

*/

define('DB_HOST', 'localhost');

define('DB_NAME', 'test');

define('DB_USER', 'root');

define('DB_PWD', '');

define('DB_PCONNECT', true);

/*

*定义返回数据查询结果的类型

* @var DB_FETCH_ASSOC int 结果调用方式:$result['name']

* @var DB_FETCH_NUM int 结果调用方式:$result[0]

* @var DB_FETCH_BOTH int 结果调用方式:$result['name'] 或 $result[0]

* @var DB_FETCH_OBJECT int 结果调用方式:$result->name

*/

define('DB_FETCH_ASSOC', 0);

define('DB_FETCH_NUM', 1);

define('DB_FETCH_BOTH', 2);

define('DB_FETCH_OBJECT', 3);

/*

*定义默认序列发生器的名称

*/

define('DB_SEQUENCE_TABLENAME', 'sequences');

class Db{

/*

* 当前数据库联接选项

*/

var $dbHost = DB_HOST;

var $dbName = DB_NAME;

var $dbType = 'Mysql';

var $dbUser = DB_USER;

var $dbPwd = DB_PWD;

var $pcnn = DB_PCONNECT;

/*

* 当前数据库连接

*/

var $cnn = '';

/*

* 数据查询结果的返回类型

*/

var $queryFetchType = DB_FETCH_ASSOC;

/*

* 初始化函数

*/

function Db(){

$this->cnn = ($this->pcnn? mysql_connect($this->dbHost, $this->dbUser, $this->dbPwd):

mysql_connect($this->dbHost, $this->dbUser, $this->dbPwd)) or

$this->_halt('数据库连接错误');

mysql_select_db($this->dbName, $this->cnn) or $this->_halt('数据库选择错误');

}

/*

* 数据查询函数

*

* @param $sql string 数据查询语句

* @param $fetchType int 数据查询结果的返回类型

*

* @return array 数据查询结果

*/

function &query($sql, $fetchType=DB_FETCH_ASSOC){

$data = array();

$rs = &mysql_query($sql, $this->cnn) or $this->_halt('数据查询错误', $sql);

$exe = $this->_getCommand($fetchType);

while($row=&$exe($rs))

$data[] = &$row;

return $data;

}

/*

* 分页数据查询函数

*

* @param $sql string 数据查询语句

* @param $page int 当前预查询页码

* @param $pageSize int 每页显示多少条纪录

* @param $fetchType int 数据查询结果的返回类型

*

* 数据查询结果,以及数据的分页信息

* @return array('pageSize' => 每页显示的条数

* 'recordCount' => 总纪录数

* 'pageCount' => 总页数

* 'page' => 当前页码

* 'isFirst' => 是否第一页

* 'isLast' => 是否最后一页

* 'start' => 返回结果的第一条纪录的序号

* 'sql' => 查询的sql语句

* 'data' => 查询得到的数据结果

* )

* 数据查询结果,以及数据的分页信息

*/

function &queryPage($sql, $page=1, $pageSize=20, $fetchType=DB_FETCH_ASSOC){

$countSql = preg_replace('|SELECT.*FROM|i','SELECT COUNT(*) count FROM', $sql);

$data['pageSize'] = (int)$pageSize<1? 20: (int)$pageSize;

$data['recordCount'] = $this->getOne($countSql, 'count');

$data['pageCount'] = ceil($data['recordCount']/$data['pageSize']);

$data['page'] = $data['pageCount']==0? 0: ((int)$page<1? 1: (int)$page);

$data['page'] = $data['page']>$data['pageCount']? $data['pageCount']:$data['page'];

$data['isFirst'] = $data['page']>1? false: true;

$data['isLast'] = $data['page']<$data['pageCount']? false: true;

$data['start'] = ($data['page']==0)? 1: ($data['page']-1)*$data['pageSize']+1;

$data['sql'] = $sql.' LIMIT '.($data['start']-1).','.$data['pageSize'];

$data['data'] = &$this->query($data['sql'], $fetchType);

return $data;

}

/*

* 进行数据查询只返回第 1 行的数据

*

* @param $sql string 数据查询语句

* @param $fetchType int 数据查询结果的返回类型

*

* @return array 数据查询结果

*/

function &queryRow($sql, $fetchType=DB_FETCH_ASSOC){

$rs = &mysql_query($sql, $this->cnn) or $this->_halt('单行数据查询错误', $sql);

$exe = $this->_getCommand($fetchType);

return $exe($rs);

}

/*

* 进行数据查询只返回第 1 行第 n 列的数据

*

* @param $sql string 数据查询语句

* @param $field int 返回数据列的名称 或 数字序号

*

* @return string 返回单个字段的值

*/

function &getOne($sql, $field = 0){

$rs = &mysql_query($sql, $this->cnn) or $this->_halt('单个数据查询错误', $sql);

$row = mysql_fetch_array($rs);

return $row[$field];

}

/*

* 进行sql语句,包含 DELECT / INSERT / UPDATE.....的执行语句

*

* @param $sql string 数据查询语句

*

* @return string 返回该语句影响的数据行数

*/

function execute($sql){

$rs = mysql_query($sql) or $this->_halt('语句执行错误', $sql);

return mysql_affected_rows($this->cnn);

}

/*

* 得到最后一次插入数据的编号

*/

function getInsertId(){

return mysql_insert_id($this->cnn);

}

/*

* 序列发生器,用来生成不重复的序列值

*

* @param $fieldName string 序列的名称

* @param $step int 序列号间隔

* @param $start int 序列号的起始数值

*

* @return int 新的序列值

*/

function getSeq($fieldName, $step=1, $start=1){

$table = DB_SEQUENCE_TABLENAME;

$step = (int)$step;

$start = (int)$start;

$rs = mysql_query("UPDATE $table SET seq_num=seq_num+($step) WHERE seq_name='$fieldName'");

if(!$rs || mysql_affected_rows($this->cnn)<1){

$rs = mysql_query('SELECT * FROM '.DB_SEQUENCE_TABLENAME, $this->cnn);

if(!$rs){

$sql = "CREATE TABLE $table (

seq_name VARCHAR( 20 ) NOT NULL ,

seq_num BIGINT( 20 ) DEFAULT 1 NOT NULL ,

PRIMARY KEY (seq_name))";

$rs = mysql_query($sql) or $this->_halt('创建序列发生器表失败', $sql);

}

$rs = mysql_query("INSERT INTO $table VALUES('$fieldName', $start)") or

$this->_halt('添加新序列错误', $sql);

$seq = $start;

}else{

$seq = &$this->getOne("SELECT seq_num FROM $table WHERE seq_name='$fieldName'");

}

return $seq;

}

function _getCommand($fetchType){

switch($fetchType){

case DB_FETCH_ASSOC: $exe = 'mysql_fetch_assoc'; break;

case DB_FETCH_NUM: $exe = 'mysql_fetch_row'; break;

case DB_FETCH_BOTH: $exe = 'mysql_fetch_array'; break;

case DB_FETCH_OBJECT: $exe = 'mysql_fetch_object'; break;

default: $exe = 'mysql_fetch_array'; break;

}

return $exe;

}

function _halt($msg){

$errNo = mysql_errno($this->cnn);

$errStr = mysql_error($this->cnn);

die("数据库错误:$msg<br> $errNo : $errStr");

}

}

?>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有