[原创]构建支持Master/Slave读写分离的数据库操作类


一般对于访问量比较大的网站来说,采用基本的MySQL Master/Slave 结构是很正常,而且一般都是一台Master,多台Slave的情况,但是一般在进行这个访问的时候问题比较多,因为读写操作必须分离,所以今天没事就构造了这个数据库操作类。

数据库操作类基本特点:
1. 支持一台Master,多台Slave的情况,所有SQL能够强制调用Master来处理
2. 能够自动识别是写入还是读取操作,然后自动连接到需要的Master/Slave服务器。 操作过程中能够自动识别,如果没有Slave,则所有操作都是指向Master的,如果当前连接的Slave无法工作则自动连接其他Slave。对于Slave读取数据采用随机挑选Slave服务器的方式来读取数据
3. 在同一个PHP程序中能够重用连接,不会重复去连接数据库,减少因为反复连接带来的资源消耗

缺点:
1. 对于Slave是采取随机选择Slave来进行读取数据,所以不是真正意义上的负载均衡
2. 每次初始化都是连接好所有的数据库,比较浪费连接资源和时间。 在多个PHP程序中无法保持数据库连接,每次启动都需要连接到远程数据库,浪费了很多连接处理的时间,但是这个跟PHP是脚本程序有关。
3. 无法支持多个Master的情况,同时可定制性比较差,很多东西都是固定的,必须按照固有模式来执行查询

相关:
代码中注释不是很全,部分注释而且不一定正确,所以如果自己使用,最好进行二次修改。
本数据库类参考了我之前写的《简单快速有趣的MySQL数据库操作类:SimpleDB》,可以对照着看。
(类库中的接口我大部分都经过了测试,都正常使用,如果发现不正常或者有更好的想法,请留言)

 
文件:db_common.class.php

<? php
// ----------------------------------------------------
//      Master/Slave数据库读写分开操作类
//
// 作者: heiyeluren <http://blog.csdn.net/heiyeshuwu>
// 时间: 2007-7-30
// 描述:支持所有写操作在一台Master执行,所有读操作在
//         Slave执行,并且能够支持多台Slave主机
//----------------------------------------------------

    
    
/* *
 * 常量定义
 
*/
define ( " _DB_INSERT " ,   1 );
define ( " _DB_UPDATE " ,   2 );
    
    
/* *
 * DB Common class
 *
 * 描述:能够分别处理一台Master写操作,多台Slave读操作
 
*/
class  DBCommon
{
    
/* *
     * 数据库配置信息
     
*/
    
var   $wdbConf   =   array ();
    
var   $rdbConf   =   array ();
    
/* *
     * Master数据库连接
     
*/
    
var   $wdbConn   =   null ;
    
/* *
     * Slave数据库连接
     
*/
    
var   $rdbConn   =   array ();
    
/* *
     * 数据库结果
     
*/
    
var   $dbResult ;
    
/* *
     * 数据库查询结果集
     
*/
    
var   $dbRecord ;

    
/* *
     * SQL语句
     
*/
    
var   $dbSql ;
    
/* *
     * 数据库编码
     
*/
    
var   $dbCharset   =   " UTF8 " ;
    
/* *
     * 数据库版本
     
*/
    
var   $dbVersion   =   " 4.1 " ;


    
/* *
     * 初始化的时候是否要连接到数据库
     
*/
    
var   $isInitConn   =   false ;
    
/* *
     * 是否要设置字符集
     
*/
    
var   $isCharset   =   true ;
    
/* *
     * 数据库结果集提取方式
     
*/
    
var   $fetchMode   =  MYSQL_ASSOC;
    
/* *
     * 执行中发生错误是否记录日志
     
*/
    
var   $isLog   =   true ;
    
/* *
     * 是否查询出错的时候终止脚本执行
     
*/
    
var   $isExit   =   false ;



    
// ------------------------
    //
    //  基础的DB操作
    //
    //------------------------


    
/* *
     * 构造函数
     * 
     * 传递配置信息,配置信息数组结构:
     * $masterConf = array(
     *        "host"    => Master数据库主机地址
     *        "user"    => 登录用户名
     *        "pwd"    => 登录密码
     *        "db"    => 默认连接的数据库
     *    );
     * $slaveConf = array(
     *        "host"    => Slave1数据库主机地址|Slave2数据库主机地址|...
     *        "user"    => 登录用户名
     *        "pwd"    => 登录密码
     *        "db"    => 默认连接的数据库
     *    );
     
*/
    
function  DBCommon( $masterConf ,   $slaveConf = array ()){
        
// 构造数据库配置信息
         if  ( is_array ( $masterConf &&   ! empty ( $masterConf )){
            
$this -> wdbConf  =   $masterConf ;
        }
        
if  ( ! is_array ( $slaveConf ||   empty ( $slaveConf )){
            
$this -> rdbConf  =   $masterConf ;
        } 
else  {
            
$this -> rdbConf  =   $slaveConf ;
        }
        
// 初始化连接(一般不推荐)
         if  ( $this -> isInitConn){
            
$this -> getDbWriteConn();
            
$this -> getDbReadConn();
        }
    }

    
/* *
     * 获取Master的写数据连接
     
*/
    
function  getDbWriteConn(){
        
// 判断是否已经连接
         if  ( $this -> wdbConn  &&   is_resource ( $this -> wdbConn)) {
            
return   $this -> wdbConn;
        }
        
// 没有连接则自行处理
         $db   =   $this -> connect( $this -> wdbConf[ ' host ' ] ,   $this -> wdbConf[ ' user ' ] ,   $this -> wdbConf[ ' pwd ' ] ,   $this -> wdbConf[ ' db ' ]);
        
if  ( ! $db   ||   ! is_resource ( $db )) {
            
return   false ;
        }
        
$this -> wdbConn  =   $db ;
        
return   $this -> wdbConn;
    }

    
/* *
     * 获取Slave的读数据连接
     
*/
    
function  getDbReadConn(){
        
// 如果有可用的Slave连接,随机挑选一台Slave
         if  ( is_array ( $this -> rdbConn)  &&   ! empty ( $this -> rdbConn)) {
            
$key   =   array_rand ( $this -> rdbConn);
            
if  ( isset ( $this -> rdbConn[ $key ])  &&   is_resource ( $this -> rdbConn[ $key ])) {
                
return   $this -> rdbConn[ $key ];
            }
        }
        
// 连接到所有Slave数据库,如果没有可用的Slave机则调用Master
         $arrHost   =   explode ( " | " ,   $this -> rdbConf[ ' host ' ]);
        
if  ( ! is_array ( $arrHost ||   empty ( $arrHost )){
            
return   $this -> getDbWriteConn();
        }
        
$this -> rdbConn  =   array ();
        
foreach ( $arrHost   as   $tmpHost ){
            
$db   =   $this -> connect( $tmpHost ,   $this -> rdbConf[ ' user ' ] ,   $this -> rdbConf[ ' pwd ' ] ,   $this -> rdbConf[ ' db ' ]);
            
if  ( $db   &&   is_resource ( $db )){
                
$this -> rdbConn[]  =   $db ;
            }
        }
        
// 如果没有一台可用的Slave则调用Master
         if  ( ! is_array ( $this -> rdbConn)  ||   empty ( $this -> rdbConn)){
            
$this -> errorLog( " Not availability slave db connection, call master db connection " );
            
return   $this -> getDbWriteConn();
        }
        
// 随机在已连接的Slave机中选择一台
         $key   =   array_rand ( $this -> rdbConn);
        
if  ( isset ( $this -> rdbConn[ $key ])   &&   is_resource ( $this -> rdbConn[ $key ])){
            
return   $this -> rdbConn[ $key ];
        }
        
// 如果选择的slave机器是无效的,并且可用的slave机器大于一台则循环遍历所有能用的slave机器
         if  ( count ( $this -> rdbConn)  >   1 ){
            
foreach ( $this -> rdbConn  as   $conn ){
                
if  ( is_resource ( $conn )){
                    
return   $conn ;
                }
            }
        }
        
// 如果没有可用的Slave连接,则继续使用Master连接
         return   $this -> getDbWriteConn();
    }

    
/* *
     * 连接到MySQL数据库公共方法
     
*/
    
function  connect( $dbHost ,   $dbUser ,   $dbPasswd ,   $dbDatabase ){
        
// 连接数据库主机
         $db   =   mysql_connect ( $dbHost ,   $dbUser ,   $dbPasswd );
        
if  ( ! $db ) {
            
$this -> errorLog( " Mysql connect  " .   $dbHost   . "  failed " );
            
return   false ;
        }
        
// 选定数据库
         if  ( ! mysql_select_db ( $dbDatabase ,   $db )) {
            
$this -> errorLog( " select db $dbDatabase failed " ,   $db );
            
return   false ;
        }
        
// 设置字符集
         if  ( $this -> isCharset){
            
if  (  $this -> dbVersion  ==   ''  ){
                
$res   =   mysql_query ( " SELECT VERSION() " );
                
$this -> dbVersion  =   mysql_result ( $res ,   0 );
            }
        
            
if  ( $this -> dbCharset != ''   &&   preg_match ( " /^(5.|4.1)/ " ,   $this -> dbVersion)){
                
if  ( mysql_query ( " SET NAMES ' " . $this -> dbCharset . " ' " ,   $db ===   false ){
                    
$this -> errorLog( " Set db_host '$dbHost' charset= " .   $this -> dbCharset  . "  failed. " ,   $db );
                    
return   false ;
                }
            }
        }
        
return   $db ;
    }

    
/* *
     * 关闭数据库连接
     
*/
    
function  disconnect( $dbConn = null ,   $closeAll = false ){
        
// 关闭指定数据库连接
         if  ( $dbConn   &&   is_resource ( $dbConn )){
            
mysql_close ( $dbConn );
            
$dbConn   =   null ;
        }
        
// 关闭所有数据库连接
         if  ( $closeAll ){
            
if  ( $this -> rdbConn  &&   is_resource ( $this->rdbConn )){
                
mysql_close ( $this->rdbConn );
                
$this -> rdbConn  =   null ;
            }
            
if  ( is_array ( $this -> rdbConn)  &&   ! empty ( $this -> rdbConn)){
                
foreach ( $this -> rdbConn  as   $conn ){
                    
if  ( $conn   &&   is_resource ( $conn )){
                        
mysql_close ( $conn );
                    }
                }
                
$this -> rdbConn  =   array ();
            }
        }
        
return   true ;
    }

    
/* *
     * 选择数据库
     
*/
    
function  selectDb( $dbName ,   $dbConn = null ){
        
// 重新选择一个连接的数据库
         if  ( $dbConn   &&   is_resource ( $dbConn )){
            
if  ( ! mysql_select_db ( $dbName ,   $dbConn )){
                
$this -> errorLog( " Select database:$dbName failed. " ,   $dbConn );
                
return   false ;
            }
            
return   true ;
        }
        
// 重新选择所有连接的数据库
         if  ( $this -> wdbConn  &&   is_resource ( $this -> wdbConn)){
            
if  ( ! mysql_select_db ( $dbName ,   $this -> wdbConn)){
                
$this -> errorLog( " Select database:$dbName failed. " ,   $this -> wdbConn);
                
return   false ;
            }
        }
        
if  ( is_array ( $this -> rdbConn  &&   ! empty ( $this -> rdbConn))){
            
foreach ( $this -> rdbConn  as   $conn ){
                
if  ( $conn   &&   is_resource ( $conn )){
                    
if  ( ! mysql_select_db ( $dbName ,   $conn )){
                        
$this -> errorLog( " Select database:$dbName failed. " ,   $conn );
                        
return   false ;
                    }
                }
            }
        }
        
return   true ;
    }

    
/* *
     * 执行SQL语句(底层操作)
     
*/
    
function  query( $sql ,   $isMaster = false ){
        
if  ( trim ( $sql ==   "" ){
            
$this -> errorLog( " Sql query is empty. " );
            
return   false ;
        }
        
// 获取执行SQL的数据库连接
         if  ( ! $isMaster ){
            
$optType   =   trim ( strtolower ( array_shift ( explode ( "   " ,   ltrim ( $sql )))));
        }
        
if  ( $isMaster   ||   $optType != " select " ){
            
$dbConn   =   $this -> getDbWriteConn();
        } 
else  {
            
$dbConn   =   $this -> getDbReadConn();
        }
        
if  ( ! $dbConn   ||   ! is_resource ( $dbConn )){
            
$this -> errorLog( " Not availability db connection. Query SQL: " .   $sql );
            
if  ( $this -> isExit) {
                
exit ;
            }
            
return   false ;
        }
        
// 执行查询
         $this -> dbSql  =   $sql ;
        
$this -> dbResult  =   null ;
        
$this -> dbResult  =  @ mysql_query ( $sql ,   $dbConn );
        
if  ( $this -> dbResult  ===   false ){
            
$this -> errorLog( " Query sql failed. SQL: " . $sql ,   $dbConn );
            
if  ( $this -> isExit) {
                
exit ;
            }
            
return   false ;
        }
        
return   true ;
    }

    
/* *
     * 错误日志
     
*/
    
function  errorLog( $msg = '' ,   $conn = null ){
        
if  ( ! $this -> isLog){
            
return ;
        }
        
if  ( $msg == ''   &&   ! $conn ) {
            
return   false ;
        }
        
$log   =   " MySQL Error: $msg " ;
        
if  ( $conn   &&   is_resource ( $conn )) {
            
$log   .=   "  mysql_msg: " .   mysql_error ( $conn );
        }
        
$log   .=   "  [ " .   date ( " Y-m-d H:i:s " . " ] " ;
        
error_log ( $log );
        
return   true ;
    }




    
// --------------------------
    //
    //       数据获取接口
    //
    //--------------------------

     /* *
     * 获取SQL执行的全部结果集(二维数组)
     *
     * @param string $sql 需要执行查询的SQL语句
     * @return 成功返回查询结果的二维数组,失败返回false
     
*/
    
function  getAll( $sql ,   $isMaster = false ){
        
if  ( ! $this -> query( $sql ,   $isMaster )){
            
return   false ;
        }
        
$this -> dbRecord  =   array ();
        
while  ( $row   =  @ mysql_fetch_array ( $this -> dbResult ,   $this -> fetchMode)) {
            
$this -> dbRecord[]  =   $row ;
        }
        @
mysql_free_result ( $this -> dbResult);
        
if  ( ! is_array ( $this -> dbRecord)  ||   empty ( $this -> dbRecord)){
            
return   false ;
        }
        
return   $this -> dbRecord;
    }

    
/* *
     * 获取单行记录(一维数组)
     *
     * @param string $sql 需要执行查询的SQL语句
     * @return 成功返回结果记录的一维数组,失败返回false
     
*/
    
function  getRow( $sql ,   $isMaster = false ){
        
if  ( ! $this -> query( $sql ,   $isMaster )){
            
return   false ;
        }
        
$this -> dbRecord  =   array ();
        
$this -> dbRecord  =  @ mysql_fetch_array ( $this -> dbResult ,   $this -> fetchMode);
        @
mysql_free_result ( $this -> dbResult);
        
if  ( ! is_array ( $this -> dbRecord)  ||   empty ( $this -> dbRecord)){
            
return   false ;
        }
        
return   $this -> dbRecord;
    }

    
/* *
     * 获取一列数据(一维数组)
     *
     * @param string $sql 需要获取的字符串
     * @param string $field 需要获取的列,如果不指定,默认是第一列
     * @return 成功返回提取的结果记录的一维数组,失败返回false
     
*/
    
function  getCol( $sql ,   $field = '' ,   $isMaster = false ){
        
if  ( ! $this -> query( $sql ,   $isMaster )){
            
return   false ;
        }
        
$this -> dbRecord  =   array ();
        
while ( $row   =  @ mysql_fetch_array ( $this -> dbResult ,   $this -> fetchMode)){
            
if  ( trim ( $field ==   '' ){
                
$this -> dbRecord[]  =   current ( $row );
            } 
else  {
                
$this -> dbRecord[]  =   $row [ $field ];
            }
        }
        @
mysql_free_result ( $this -> dbResult);
        
if  ( ! is_array ( $this -> dbRecord)  ||   empty ( $this -> dbRecord)){
            
return   false ;
        }
        
return   $this -> dbRecord;
    }

    
/* *
     * 获取一个数据(当条数组)
     *
     * @param string $sql 需要执行查询的SQL
     * @return 成功返回获取的一个数据,失败返回false
     
*/
    
function  getOne( $sql ,   $field = '' ,   $isMaster = false ){
        
if  ( ! $this -> query( $sql ,   $isMaster )){
            
return   false ;
        }
        
$this -> dbRecord  =   array ();
        
$row   =  @ mysql_fetch_array ( $this -> dbResult ,   $this -> fetchMode);
        @
mysql_free_result ( $this -> dbResult);
        
if  ( ! is_array ( $row ||   empty ( $row )){
            
return   false ;
        }
        
if  ( trim ( $field !=   '' ){
            
$this -> dbRecord  =   $row [ $field ];
        }
else {
            
$this -> dbRecord  =   current ( $row );
        }
        
return   $this -> dbRecord;
    }

    
/* *
     * 获取指定各种条件的记录
     *
     * @param string $table 表名(访问的数据表)
     * @param string $field 字段(要获取的字段)
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)
     * @param string $order 排序(按照什么字段排序,不包括ORDER BY,默认为空)
     * @param string $limit 限制记录(需要提取多少记录,不包括LIMIT,默认为空)
     * @param bool $single 是否只是取单条记录(是调用getRow还是getAll,默认是false,即调用getAll)
     * @return 成功返回记录结果集的数组,失败返回false
     
*/
    
function  getRecord( $table ,   $field = ' * ' ,   $where = '' ,   $order = '' ,   $limit = '' ,   $single = false ,   $isMaster = false ){
        
$sql   =   " SELECT $field FROM $table " ;
        
$sql   .=   trim ( $where ) != ''   ?   "  WHERE $where  "   :   $where ;
        
$sql   .=   trim ( $order ) != ''   ?   "  ORDER BY $order  "   :   $order ;
        
$sql   .=   trim ( $limit ) != ''   ?   "  LIMIT $limit  "   :   $limit ;
        
if  ( $single ){
            
return   $this -> getRow( $sql ,   $isMaster );
        }
        
return   $this -> getAll( $sql ,   $isMaster );
    }

    
/* *
     * 获取指点各种条件的记录(跟getRecored类似)
     *
     * @param string $table 表名(访问的数据表)
     * @param string $field 字段(要获取的字段)
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)
     * @param array $order_arr 排序数组(格式类似于: array('id'=>true), 那么就是按照ID为顺序排序, array('id'=>false), 就是按照ID逆序排序)
     * @param array $limit_arr 提取数据的限制数组()
     * @return unknown
     
*/
    
function  getRecordByWhere( $table ,   $field = ' * ' ,   $where = '' ,   $arrOrder = array () ,   $arrLimit = array () ,   $isMaster = false ){
        
$sql   =   "  SELECT $field FROM $table  " ;
        
$sql   .=   trim ( $where ) != ''   ?   "  WHERE $where  "   :   $where ;
        
if  ( is_array ( $arrOrder &&   ! empty ( $arrOrder )){
            
$arrKey   =   key ( $arrOrder );
            
$sql   .=   "  ORDER BY $arrKey  "   .  ( $arrOrder [ $arrKey ?   " ASC "   :   " DESC " );
        }
        
if  ( is_array ( $arrLimit &&   ! empty ( $arrLimit )){
            
$startPos   =   intval ( array_shift ( $arrLimit ));
            
$offset   =   intval ( array_shift ( $arrLimit ));
            
$sql   .=   "  LIMIT $startPos,$offset  " ;
        }
        
return   $this -> getAll( $sql ,   $isMaster );
    }

    
/* *
     * 获取指定条数的记录
     *
     * @param string $table 表名
     * @param int $startPos 开始记录
     * @param int $offset 偏移量
     * @param string $field 字段名
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)
     * @param string $order 排序(按照什么字段排序,不包括ORDER BY,默认为空)
     * @return 成功返回包含记录的二维数组,失败返回false
     
*/
    
function  getRecordByLimit( $table ,   $startPos ,   $offset ,   $field = ' * ' ,   $where = '' ,   $oder = '' ,   $isMaster = false ){
        
$sql   =   "  SELECT $field FROM $table  " ;
        
$sql   .=   trim ( $where ) != ''   ?   "  WHERE $where  "   :   $where ;
        
$sql   .=   trim ( $order ) != ''   ?   "  ORDER BY $order  "   :   $order ;
        
$sql   .=   "  LIMIT $startPos,$offset  " ;
        
return   $this -> getAll( $sql ,   $isMaster );
    }

    
/* *
     * 获取排序记录
     *
     * @param string $table 表名
     * @param string $orderField 需要排序的字段(比如id)
     * @param string $orderMethod 排序的方式(1为顺序, 2为逆序, 默认是1)
     * @param string $field 需要提取的字段(默认是*,就是所有字段)
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)
     * @param string $limit 限制记录(需要提取多少记录,不包括LIMIT,默认为空)
     * @return 成功返回记录的二维数组,失败返回false
     
*/
    
function  getRecordByOrder( $table ,   $orderField ,   $orderMethod = 1 ,   $field = ' * ' ,   $where = '' ,   $limit = '' ,   $isMaster = false ){
        
// $order_method的值为1则为顺序, $order_method值为2则2则是逆序排列
         $sql   =   "  SELECT $field FROM $table  " ;
        
$sql   .=   trim ( $where ) != ''   ?   "  WHERE $where  "   :   $where ;
        
$sql   .=   "  ORDER BY $orderField  "   .  (  $orderMethod == 1   ?   " ASC "   :   " DESC " );
        
$sql   .=   trim ( $limit ) != ''   ?   "  LIMIT $limit  "   :   $limit ;
        
return   $this -> getAll( $sql ,   $isMaster );
    }

    
/* *
     * 分页查询(限制查询的记录条数)
     *
     * @param string $sql 需要查询的SQL语句
     * @param int $startPos 开始记录的条数
     * @param int $offset 每次的偏移量,需要获取多少条
     * @return 成功返回获取结果记录的二维数组,失败返回false
     
*/
    
function  limitQuery( $sql ,   $startPos ,   $offset ,   $isMaster = false ){
        
$start_pos   =   intval ( $startPos );
        
$offset   =   intval ( $offset );
        
$sql   =   $sql   .   "  LIMIT $startPos,$offset  " ;
        
return   $this -> getAll( $sql ,   $isMaster );
    }


    
// --------------------------
    //
    //     无数据返回操作
    //
    //--------------------------

     /* *
     * 执行执行非Select查询操作
     *
     * @param string $sql 查询SQL语句
     * @return bool  成功执行返回true, 失败返回false
     
*/
    
function  execute( $sql ,   $isMaster = false ){
        
if  ( ! $this -> query( $sql ,   $isMaster )){
            
return   false ;
        }
        return true;
//        
$count   =  @ mysql_affected_rows ( $this -> dbLink);
//        
if  ( $count   <=   0 ){
//            
return   false ;
//        }
//        
return   true ;
    }

    
/* *
     * 自动执行操作(针对Insert/Update操作)
     *
     * @param string $table 表名
     * @param array $field_array 字段数组(数组中的键相当于字段名,数组值相当于值, 类似 array( 'id' => 100, 'user' => 'heiyeluren')
     * @param int $mode 执行操作的模式 (是插入还是更新操作, 1是插入操作Insert, 2是更新操作Update)
     * @param string $where 如果是更新操作,可以添加WHERE的条件
     * @return bool 执行成功返回true, 失败返回false
     
*/
    
function  autoExecute( $table ,   $arrField ,   $mode ,   $where = '' ,   $isMaster = false ){
        
if  ( $table == ''   ||   ! is_array ( $arrField ||   empty ( $arrField )){
            
return   false ;
        }
        
// $mode为1是插入操作(Insert), $mode为2是更新操作
         if  ( $mode   ==   1 ){
            
$sql   =   "  INSERT INTO `$table` SET  " ;
        } 
elseif  ( $mode   ==   2 ) {
            
$sql   =   "  UPDATE `$table` SET  " ;
        } 
else  {
            
$this -> errorLog( " Operate type '$mode' is error, in call DB::autoExecute process table $table. " );
            
return   false ;
        }
        
foreach  ( $arrField   as   $key   =>   $value ){
            
$sql   .=   " `$key`='$value', " ;
        }
        
$sql   =   rtrim ( $sql ,   ' , ' );
        
if  ( $mode == 2   &&   $where != '' ){
            
$sql   .=   " WHERE $where " ;
        }
        
return   $this -> execute( $sql ,   $isMaster );
    }

    
/* *
     * 锁表表
     *
     * @param string $tblName 需要锁定表的名称
     * @return mixed 成功返回执行结果,失败返回错误对象
     
*/
    
function  lockTable( $tblName ){
        
return   $this -> query( " LOCK TABLES $tblName " ,   true );
    }

    
/* *
     * 对锁定表进行解锁
     *
     * @param string $tblName 需要锁定表的名称
     * @return mixed 成功返回执行结果,失败返回错误对象
     
*/
    
function  unlockTable( $tblName ){
        
return   $this -> query( " UNLOCK TABLES $tblName " ,   true );
    }

    
/* *
     * 设置自动提交模块的方式(针对InnoDB存储引擎)
     * 一般如果是不需要使用事务模式,建议自动提交为1,这样能够提高InnoDB存储引擎的执行效率,如果是事务模式,那么就使用自动提交为0
     *
     * @param bool $autoCommit 如果是true则是自动提交,每次输入SQL之后都自动执行,缺省为false
     * @return mixed 成功返回true,失败返回错误对象
     
*/
    
function  setAutoCommit( $autoCommit   =   false ){
        
$autoCommit   =  (  $autoCommit   ?   1   :   0  );
        
return   $this -> query( " SET AUTOCOMMIT = $autoCommit " ,   true );
    }

    
/* *
     * 开始一个事务过程(针对InnoDB引擎,兼容使用 BEGIN 和 START TRANSACTION)
     *
     * @return mixed 成功返回true,失败返回错误对象
     
*/
    
function  startTransaction(){
        
if  ( ! $this -> query( " BEGIN " )){
            
return   $this -> query( " START TRANSACTION " ,   true );
        }
    }

    
/* *
     * 提交一个事务(针对InnoDB存储引擎)
     *
     * @return mixed 成功返回true,失败返回错误对象
     
*/
    
function  commit(){
        
if  ( ! $this -> query( " COMMIT " ,   true )){
            
return   false ;
        }
        
return   $this -> setAutoCommit(  true  );
    }

    
/* *
     * 发生错误,会滚一个事务(针对InnoDB存储引擎)
     *
     * @return mixed 成功返回true,失败返回错误对象
     
*/

    
function  rollback(){
        
if  ( ! $this -> query( " ROLLBACK " ,   true )){
            
return   false ;
        }
        
return   $this -> setAutoCommit(  true  );
    }


    
// --------------------------
    //
    //    其他数据相关操作
    //
    //--------------------------

     /* *
     * 获取最后一次查询的SQL语句
     *
     * @return string 返回最后一次查询的SQL语句
     
*/
    
function  getLastSql(){
        
return   $this -> dbSql;
    }

    
/* *
     * 获取上次插入操作的的ID
     *
     * @return int 如果没有连接或者查询失败,返回0, 成功返回ID
     
*/
    
function  getLastId(){
        
$dbConn   =   $this -> getDbWriteConn();
        
if  (( $lastId   =   mysql_insert_id ( $dbConn ))  >   0 ){
            
return   $lastId ;
        }
        
return   $this -> getOne( " SELECT LAST_INSERT_ID() " ,   '' ,   true );
    }

    
/* *
     * 获取记录集里面的记录条数 (用于Select操作)
     *
     * @return int 如果上一次无结果集或者记录结果集为空,返回0, 否则返回结果集数量
     
*/
    
function  getNumRows( $res = null ){
        
if  ( ! $res   ||   ! is_resource ( $res )){
            
$res   =   $this -> dbResult;
        }
        
return   mysql_num_rows ( $res );
    }

    
/* *
     * 获取受到影响的记录数量 (用于Update/Delete/Insert操作)
     *
     * @return int 如果没有连接或者影响记录为空, 否则返回影响的行数量
     
*/
    
function  getAffectedRows(){
        
$dbConn   =   $this -> getDbWriteConn();
        
if  ( ( $affetedRows   =   mysql_affected_rows ( $dbConn ))  <=   0 ){
            
return   $affetedRows ;
        }
        
return   $this -> getOne( " SELECT ROW_COUNT() " ,   "" ,   true );        
    }

}

?>

 

 测试代码文件:

<? php
/* *
 * 测试代码
 
*/
 
 
// 构造数据库配置信息
$masterConf   =   array ( " host " => " localhost " ,   " user " => " root " ,   " pwd " => "" ,   " db " => " db " );
$slaveConf   =   array ( " host " => " localhost|localhost " ,   " user " => " root " ,   " pwd " => "" ,   " db " => " db " );

// 初始化类
$db   =   new  DBCommon( $masterConf ,   $slaveConf );
print_r ( $db );

// 创建表
$db -> execute( " CREATE TABLE `tbl1` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT,  `name` CHAR(32) DEFAULT NULL,  `email` CHAR(64) DEFAULT NULL,  PRIMARY KEY (`id`))ENGINE=MyISAM; " );

// 插入数据
$arrInsert   =   array ( " name "   =>   " heiyeluren " ,   " email " => " heiyeluren@125.com " );
$db -> autoExecute( " tbl1 " ,   $arrInsert ,  _DB_INSERT);
$arrInsert   =   array ( " name "   =>   " heiyeluren2 " ,   " email " => heiyeluren@128.com );
$db -> autoExecute( " tbl1 " ,   $arrInsert ,  _DB_INSERT);
$s   =   $db -> getAffectedRows();
echo   $s ;

// 获取数据
$s   =   $db -> getAll( " select * from tbl1 " );
print_r ( $s );

// 选择其他数据库
$db -> selectDb( " test " );

// 关闭所有连接
$db -> disconnect( null ,   true );

?>

 

测试输出结果:

DBCommon Object
(
    
[ wdbConf ]   = > Array
        (
            
[ host ]   = > localhost
            
[ user ]   = > root
            
[ pwd ]   = >
            
[ db ]   = > db
        )

    
[ rdbConf ]   = > Array
        (
            
[ host ]   = > localhost|localhost
            
[ user ]   = > root
            
[ pwd ]   = >
            
[ db ]   = > db
        )

    
[ wdbConn ]   = >
    
[ rdbConn ]   = > Array
        (
        )

    
[ dbResult ]   = >
    
[ dbRecord ]   = >
    
[ dbSql ]   = >
    
[ dbCharset ]   = > UTF8
    
[ dbVersion ]   = 4.1
    
[ isInitConn ]   = >
    
[ isCharset ]   = 1
    
[ fetchMode ]   = 1
    
[ isLog ]   = 1
    
[ isExit ]   = >
)
1
Array
(
    
[ 0 ]   = > Array
        (
            
[ id ]   = 1
            
[ name ]   = > heiyeluren
            
[ email ]   = > heiyeluren@ 125 .com
        )

    
[ 1 ]   = > Array
        (
            
[ id ]   = 2
            
[ name ]   = > heiyeluren2
            
[ email ]   = heiyeluren@
        )

)
128 .com

 

【其他数据操作方法使用代码】 

/* *
 *  示例代码
 
*/
  
    
// 构造数据库配置信息
     $masterConf   =   array (
        
" host "    =>   " 192.168.0.1 " ,  
        
" user "    =>   " root " ,  
        
" pwd "     =>   "" ,  
        
" db "      =>   " db "
    );
    
$slaveConf   =   array (
        
" host "    =>   " 192.168.0.3|192.168.0.2 " ,  
        
" user "    =>   " root " ,  
        
" pwd "     =>   "" ,  
        
" db "      =>   " db "
    );

    
// 初始化类
     $db   =   new  DBCommon( $masterConf ,   $slaveConf );

    
// 创建表
     $db -> execute( " CREATE TABLE `tbl1` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT,  `name` CHAR(32) DEFAULT NULL,  `email` CHAR(64) DEFAULT NULL,  PRIMARY KEY (`id`))ENGINE=MyISAM; " );

    
// 插入数据
     $arrInsert   =   array (
        
" name "    =>   " heiyeluren " ,  
        
" email "   =>   " heiyeluren@125.com "
    );
    
$db -> autoExecute( " tbl1 " ,   $arrInsert ,  _DB_INSERT);

    
// 更新数据
     $arrUpdate   =   array (
        
" name "    =>   " heiyeluren2 " ,
        
" email "   =>   " heiyeluren@1111.com "
    );
    
$db -> autoExecute( " tbl1 " ,   $arrUpdate ,  _DB_UPDATE ,   " id = 1 " );
    
    
// 获取操作影响的行
     $s   =   $db -> getAffectedRows();

    
// 获取数据
    
    //获取所有数据(二维数组)

     $s   =   $db -> getAll( " select * from tbl1 " );
    
// 获取一行数据(一维数组)
     $s   =   $db -> getRow( " select * from tbl1 where id = 1 " );
    
// 获取一列数据(一维数组)
     $s   =   $db -> getCol( " select id from tbl1 where name LIKE '%heiyeluren%' " );
    
// 获取一个数据(直接返回数据)
     $s   =   $db -> getOne( " select count(1) from tbl1 " );


    
// 删除数据
     $db -> execute( " delete from tbl1 where id = 1 " );

    
// 选择其他数据库
     $db -> selectDb( " test " );

    
// 关闭所有连接
     $db -> disconnect( null ,   true );

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值