ホームページ >php教程 >php手册 >PHP で MVC を開始する (2) 抽象データベース インターフェイス

PHP で MVC を開始する (2) 抽象データベース インターフェイス

WBOY
WBOYオリジナル
2016-06-21 09:07:02881ブラウズ

数据|数据库

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

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

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

/**************************************************************
* 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'].'
';
 *    ?>
 */
/*
 * 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):

in($ this-> dbname、$ this-> cnn)または$ this-> _halt( 'database選択エラー'); int データクエリ結果の戻り値の型
* * $data = array();
$rs = &mysql_query($sql, $this->cnn) または $this->_halt( 'データクエリエラー', $ sql); $ exe = $ this-&gtcommand($ fetchtype); => 現在のページ番号 F *'isfired' = & gt; 最初のページかどうか*'Islast' = & gt; 最後のページかどうか
*'start' = & gt; 返された結果の最初のレコードのシリアル番号
*'data' = & gt; ; データの結果
*
$countSql = preg_replace(' |SELECT.*FROM|i','SELECT COUNT(*) count FROM', $sql);
$data['pageSize'] = (int) $pageSize<1?: (int)$pageSize; data['recordCount'] = $this->getOne($countSql, 'count');
$data['pageCount'] = ceil(' RecordCount']/$data['pageSize']);
$data['page'] = $data['pageCount']==0: ((int)$page $data['page'] = $data['page']>$data['pageCount']? $data['pageCount']:$data['page'];
$data[' isFirst'] = $data['page']> false: true;
$data['isLast'] = $data['page'] $data[' sql'] = $sql.' LIMIT '.($ data['start']-1).','.$data['pageSize'];
$data['data'] = &$this-> query($data['sql'], $fetchType) ;
return $data; Type
*
* @return array データクエリ結果
*/
function &queryRow($sql, $fetchType=DB_FETCH_ASSOC){
$rs = &mysql_query($sql, $this->cnn) または $this->_hal t('単一行データ クエリ エラー', $sql);
$exe =列データ
*/
function &getOne($ sql, $field = 0){
$rs = &mysql_query($sql, $this->cnn) または $this->_halt('単一データ クエリ エラー', $sql);
return $row[ $フィールド];
*
。     * @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& lt;br> errNo : $errStr");
}
}
?>



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。