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

转载 2004年09月23日 08:56:00

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

在用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");
    }
}
?>

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

用PHP开始你的MVC (二)抽象数据库接口 二、抽象数据库接口(利用数据操作管理类)在用mvc模式开发的时候,model层负责数据库的所有操作,为了对数据库的操作进行统一的管理,我们需要定义一个数据...
  • bjbs_270
  • bjbs_270
  • 2004年11月26日 14:01
  • 1046

php--连接数据库【不懂php也能写接口】

写一个php文件,就是配置数据库的,可以直接把下面的代码复制到一个php文件中,让后改一下数据库的路径以及用户名,密码这段代码就可以使用了。 返回的是json数据 一下为代码,当然了也可以根据这些...
  • jijunyuan_11109
  • jijunyuan_11109
  • 2014年04月29日 16:40
  • 1608

PHP的数据库接口和技术详解

1、php支持哪些数据库(拥有哪些数据库接口) Adabas D ,InterBase ,PostgreSQL ,dBase ,FrontBase ,SQLite ,Empress ,mSQL ,So...
  • wlzx120
  • wlzx120
  • 2016年12月02日 16:18
  • 941

本人菜鸟 零基础学习MVC

1.什么是M V C? MVC 是用于构建 web 应用程序的一种框架,使用 MVC (Model View Controller) 设计: Model(模型)表示应用程序核心(比...
  • qq_31520903
  • qq_31520903
  • 2017年05月14日 21:54
  • 188

浅谈PHP面向对象的几个抽象概念

本人专攻PHP+大数据集群,利用课余时间想巩固一下底层的C++和LINUX课程。写博客,一方面可以以博客的方式记录自己的程序猿之路,另一方面也可以起到前人种树后人乘凉的作用。计算机中这些概念有的时候很...
  • php_wyl
  • php_wyl
  • 2016年10月22日 01:02
  • 555

PHP7 的抽象语法树(AST)带来的变化

转载自:http://0x1.im/blog/php/changes-of-php7-because-of-ast.html 本文大部分内容参照 AST 的 RFC 文档而成:https://w...
  • ivan820819
  • ivan820819
  • 2015年12月09日 20:50
  • 1050

用PHP开始你的MVC (四)实现View层

MVC模式的view层的主要任务是进行页面的和结果的显示工作,在php的实现过程中,主要是体现为一个模板(使用模板,可以达到php代码和html代码分离的目的,这样代码和页面的维护就方便多了,便于管理...
  • wssxy
  • wssxy
  • 2008年03月06日 11:46
  • 456

我能抽象出整个世界,但是我不能抽象你

我能抽象出整个世界,但是我不能抽象你... 想让你成为私有常量,外部函数无法访问你... 又想让你成为全局常量,在整个生命周期随时都可以调用你... 因为世界上没有这样的常量... ...
  • guojing3625
  • guojing3625
  • 2013年06月20日 18:31
  • 1125

用PHP开始你的MVC (四)实现View层

用PHP开始你的MVC (四)实现View层 MVC模式的view层的主要任务是进行页面的和结果的显示工作,在php的实现过程中,主要是体现为一个模板(使用模板,可以达到php代码和html代码分离的...
  • bjbs_270
  • bjbs_270
  • 2004年11月26日 14:03
  • 1662

用PHP开始你的MVC (四)实现View层

MVC模式的view层的主要任务是进行页面的和结果的显示工作,在php的实现过程中,主要是体现为一个模板(使用模板,可以达到php代码和html代码分离的目的,这样代码和页面的维护就方便多了,便于管理...
  • caaclxf
  • caaclxf
  • 2004年09月23日 08:57
  • 456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用PHP开始你的MVC (二)抽象数据库接口
举报原因:
原因补充:

(最多只允许输入30个字)