[原创]简单快速有趣的MySQL数据库操作类:SimpleDB

 

自己写着玩的,代码没有测试,不过觉得思路不错,如果能够加上部分异常处理的功能,应该比较帅了,支持PHP4/PHP5,恩,虽然没有ADOdb或者PEAR::DB强,不错一般应用应该不错,恩。

喜欢的就自己拿去用吧,自己随便改,呵呵,也欢迎提意见。(注释遵循PHPDoc的标准,便于生成手册)

 注意:代码未经测试,出现问题可要自己负责哇,呵呵。

 

 

<?
// ==========================================
// 文件: SimpleDB.class.php
// 程序: MySQL数据库操作类
// 作者: heiyeluren <http://blog.csdn.net/heiyeshuwu
// 时间: 2006-09-20
//==========================================


class  SimpleDB
{
    
/* *
     * 连接标识
     * @var resource
     
*/
    
var   $dbLink ;
    
/* *
     * 数据库查询语句
     * @var string
     
*/
    
var   $dbSql ;
    
/* *
     * 查询结果
     * @var resource
     
*/
    
var   $dbResult ;
    
/* *
     * 查询记录集
     * @var array
     
*/
    
var   $dbRecord ;
    
/* *
     * 数据库字符集
     * @var string
     
*/
    
var   $dbCharset   =   ' GBK ' ;
    
/* *
     * 数据库结果集提取方式
     * @var int
     
*/
    
var   $fetchMode   =  MYSQL_ASSOC;
    
/* *
     * 日志保存路径
     * @var string
     
*/
    
var   $logPath   =   ' /tmp/mysql_log ' ;
    
    
/* *
     * 是否记录SQL查询失败的SQL日志,缺省是false
     * @var bool
     
*/
    
var   $isLog   =   false ;
    
/* *
     * 是否在SQL查询出错的时候显示错误并且终止脚本执行,缺省是true
     *
     * @var bool
     
*/
    
var   $isError   =   true ;
    
    
    
// --------------------------
    // 内部接口
    //--------------------------

     /* *
     * 构造函数
     * 
     * @param string $db_host 连接主机
     * @param string $db_user 连接用户
     * @param string $db_passwd 数据库密码
     * @param string $db_name 数据库
     * @param bool $is_pconnect 是否长连接,默认是否
     * @return SimpleDB
     
*/
    
function  SimpleDB( $db_host ,   $db_user ,   $db_passwd ,   $db_name ,   $is_pconnect = false ){
        
$this -> connect( $db_host ,   $db_user ,   $db_passwd ,   $db_name ,   $is_pconnect );
    }
    
    
/* *
     * 连接数据库
     *
     * @param string $db_host  数据库主机地址,例如:localhost,或者 localhost:3306
     * @param string $db_user 连接数据库的用户
     * @param string $db_passwd 用户密码
     * @param string $db_name 数据库名字
     * @param boo $is_pconnect 是否使用长连接
     * @return resource 返回连接资源标识符
     
*/
    
function  connect( $db_host ,   $db_user ,   $db_passwd ,   $db_name ,   $is_pconnect ){
        
if  ( $is_pconnect ){
            
return   $this -> dbLink  =  @ mysql_pconnect ( $db_host ,   $db_user ,   $db_passwd );
        }
        
$this -> dbLink  =  @ mysql_connect ( $db_host ,   $db_user ,   $db_passwd );
        @
mysql_select_db ( $db_name ,   $this -> dbLink);
        
$mysql_version   =   $this -> getOne( " SELECT VERSION() " );
        
if  ( $this -> dbCharset != ''   &&   preg_match ( " /^(5.|4.1)/ " ,   $mysql_version )){
            
$this -> query( " SET NAMES '$this->dbCharset' " ,   $this -> dbLink);
        }        
        
return   $this -> dbLink;
    }
    
    
/* *
     * 关闭数据库连接
     *
     * @return bool 是否成功关闭连接
     
*/
    
function  disconnect(){
        
$ret   =  @ mysql_close ( $this -> dbLink);
        
$this -> dbLink  =   null ;
        
return   $ret ;
    }

    
/* *
     * 设置查询结果返回数据类型
     *
     * @param int $modeType 设置查询结果返回设置,1为关联索引和数字所有都有,2为使用关联索引,3为使用数字索引
     
*/
    
function  setFetchMode( $modeType ){
        
switch  ( $modeType ){
            
case   1 :      // 数字索引和关联索引都有
                 $this -> fetchMode  =  MYSQL_BOTH;
                
break ;
            
case   2 :      // 使用关联索引
                 $this -> fetchMode  =  MYSQL_ASSOC;
                
break ;
            
case   3 :   // 使用数字索引
                 $this -> fetchMode  =  MYSQL_NUM;
                
break ;
            
default : // 缺省使用关联索引
                 $this -> fetchMode  =  MYSQL_ASSOC;
        }
    }
    
    
/* *
     * 设置数据库客户端提取结果集的字符编码
     *
     * @param string $charset 编码的字符串,比如 UTF8,GBK之类的,缺省是GBK
     
*/
    
function  setCharset( $charset ){
        
if  ( $charset   !=   '' ){
            
$this -> dbCharset  =   $charset ;
        }
    }
    
    
/* *
     * 设置日志存储路径
     *
     * @param string $log_path 日志路径,该必须是可写的
     
*/
    
function  setLogPath( $log_path ){
        
if  ( $log_path   !=   '' ){
            
$this -> logPath  =   $log_path ;
        }
    }
    
    
/* *
     * 写SQL执行日志
     *
     * @param string $sql 查询的SQL语句
     * @param string $file 当前执行查询的文件
     
*/
    
function  writeLog( $sql ,   $file ){
        
if  ( ! file_exists ( $this -> logPath)){
                @
mkdir ( $this -> logPath);
        }
        
$log_file   =   $this -> logPath  . " /mysql_ " . date ( " Y-m-d " ) . " .log " ;
        
$log_msg   =   " [ " . date ( " Y-m-d H:i:s " ) . " ] -  " . $file . " " . $sql . " " ;
        
error_log ( $log_msg ,   3 ,   $log_file );                
    }
    
    
/* *
     * 显示上依次SQL执行错误的错误信息
     
*/
    
function  showError(){
        
$errMessage   =   " MySQL query error  " .   mysql_errno ( $this -> dbLink)  . " " .   mysql_error ( $this -> dbLink);
        
die ( $errMessage );
    }
    
    
/* *
     * 返回MySQL的版本信息
     *
     * @return string Mysql的版本
     
*/
    
function  getVersion(){
        
return   $this -> getOne( " SELECT VERSION() " );
    }    

    
/* *
     * 查询操作的底层接口
     *
     * @param string $sql 要执行查询的SQL语句
     * @return bool 执行成功返回true,失败返回false
     
*/
    
function  query( $sql ){
        
$this -> dbSql  =   $sql ;
        
$this -> dbResult  =   null ;
        
$this -> dbResult  =  @ mysql_query ( $sql ,   $this -> dbLink);
        
if  ( $this -> dbResult  ===   false ){
            
if  ( $this -> isLog){
                
$this -> writeLog( $sql ,   __FILE__ );
            }
            
if  ( $this -> isError){
                
$this -> showError();
            }
            
return   false ;
        }
        
return   true ;    
    }    
    

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

     /* *
     * 获取SQL执行的全部结果集(二维数组)
     *
     * @param string $sql 需要执行查询的SQL语句
     * @return 成功返回查询结果的二维数组,失败返回false
     
*/
    
function  getAll( $sql ){
        
if  ( ! $this -> query( $sql )){
            
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 ){
        
if  ( ! $this -> query( $sql )){
            
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 = '' ){
        
if  ( ! $this -> query( $sql )){
            
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 = '' ){
        
if  ( ! $this -> query( $sql )){
            
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 ){
        
$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 );
        }
        
return   $this -> getAll( $sql );
    }
    
    
/* *
     * 获取指点各种条件的记录(跟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  getSpecifyRecord( $table ,   $field = ' * ' ,   $where = '' ,   $order_arr = array () ,   $limit_arr = array ()){
        
$sql   =   " SELECT $field FROM $table " ;
        
$sql   .=   trim ( $where ) != ''   ?   "  WHERE $where  "   :   $where ;
        
if  ( is_array ( $order_arr &&   ! empty ( $order_arr )){
            
$arr_key   =   key ( $order_arr );
            
$sql   .=   "  ORDER BY $arr_key  "   .  ( $order_arr [ $arr_key ?   " ASC "   :   " DESC " );
        }
        
if  ( is_array ( $limit_arr &&   ! empty ( $limit_arr )){
            
$start_post   =   intval ( array_shift ( $limit_arr ));
            
$offset   =   intval ( array_shift ( $limit_arr ));
            
$sql   .=   "  LIMIT $start_post,$offset " ;
        }
        
return   $this -> getAll( $sql );
    }    
    
    
/* *
     * 获取指定条数的记录
     *
     * @param string $table 表名
     * @param int $start_pos 开始记录
     * @param int $offset 偏移量
     * @param string $field 字段名
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)
     * @param string $order 排序(按照什么字段排序,不包括ORDER BY,默认为空)
     * @return 成功返回包含记录的二维数组,失败返回false
     
*/
    
function  getLimitRecord( $table ,   $start_pos ,   $offset ,   $field = ' * ' ,   $where = '' ,   $oder = '' ){
        
$sql   =   " SELECT $field FROM $table " ;
        
$sql   .=   trim ( $where ) != ''   ?   "  WHERE $where  "   :   $where ;
        
$sql   .=   trim ( $order ) != ''   ?   "  ORDER BY $order "   :   $order ;
        
$sql   .=   " LIMIT $start_pos,$offset " ;
        
return   $this -> getAll( $sql );
    }
    
    
/* *
     * 获取排序记录
     *
     * @param string $table 表名
     * @param string $order_field 需要排序的字段(比如id)
     * @param string $order_method 排序的方式(1为顺序, 2为逆序, 默认是1)
     * @param string $field 需要提取的字段(默认是*,就是所有字段)
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)
     * @param string $limit 限制记录(需要提取多少记录,不包括LIMIT,默认为空)
     * @return 成功返回记录的二维数组,失败返回false
     
*/
    
function  getOrderRecord( $table ,   $order_field ,   $order_method = 1 ,   $field = ' * ' ,   $where = '' ,   $limit = '' ){
        
// $order_method的值为1则为顺序, $order_method值为2则2则是逆序排列
         $sql   =   " SELECT $field FROM $table " ;
        
$sql   .=   trim ( $where ) != ''   ?   "  WHERE $where  "   :   $where ;
        
$sql   .=   "  ORDER BY $order_field  "   .  (  $order_method == 1   ?   " ASC "   :   " DESC " );
        
$sql   .=   trim ( $limit ) != ''   ?   "  LIMIT $limit "   :   $limit ;
        
return   $this -> getAll( $sql );
    }
    
    
/* *
     * 分页查询(限制查询的记录条数)
     *
     * @param string $sql 需要查询的SQL语句
     * @param int $start_pos 开始记录的条数
     * @param int $offset 每次的偏移量,需要获取多少条
     * @return 成功返回获取结果记录的二维数组,失败返回false
     
*/
    
function  limitQuery( $sql ,   $start_pos ,   $offset ){
        
$start_pos   =   intval ( $start_pos );
        
$offset   =   intval ( $offset );
        
$sql   =   $sql   .   "  LIMIT $start_pos,$offset  " ;
        
return   $this -> getAll( $sql );
    }    
    
    
    
// --------------------------
    // 无数据返回操作
    //--------------------------

     /* *
     * 执行执行非Select查询操作
     *
     * @param string $sql 查询SQL语句
     * @return bool  成功执行返回true, 失败返回false
     
*/
    
function  execute( $sql ){
        
if  ( ! $this -> query( $sql )){
            
return   false ;
        }
        
$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 ,   $field_array ,   $mode ,   $where = '' ){
        
if  ( $table == ''   ||   ! is_array ( $field_array ||   empty ( $field_array )){
            
return   false ;
        }
        
// $mode为1是插入操作(Insert), $mode为2是更新操作
         if  ( $mode   ==   1 ){
            
$sql   =   " INSERT INTO $table SET  " ;
        }
else {
            
$sql   =   " UPDATE $table SET  " ;
        }
        
foreach  ( $field_array   as   $key   =>   $value ){
            
$sql   .=   " $key='$value', " ;
        }
        
$sql   =   rtrim ( $sql ,   ' , ' );
        
if  ( $mode == 2   &&   $where != '' ){
            
$sql   .=   " WHERE $where " ;
        }
        
return   $this -> execute( $sql );
    }
    
    
    
// --------------------------
    // 其他数据相关操作
    //--------------------------

     /* *
     * 获取最后一次查询的SQL语句
     *
     * @return string 返回最后一次查询的SQL语句
     
*/
    
function  getLastSql(){
        
return   $this -> dbSql;
    }
        
    
/* *
     * 获取上次插入操作的的ID
     *
     * @return int 如果没有连接或者查询失败,返回0, 成功返回ID
     
*/
    
function  getLastId(){
        
if  ( ! $this -> dbLink){
            
return   0 ;
        }
        
if  (( $last_id   =   mysql_insert_id ( $this -> dbLink))  >   0 ){
            
return   $last_id ;
        }
        
return   $this -> getOne( " SELECT LAST_INSERT_ID() " );
    }
    
    
/* *
     * 获取记录集里面的记录条数 (用于Select操作)
     *
     * @return int 如果上一次无结果集或者记录结果集为空,返回0, 否则返回结果集数量
     
*/
    
function  getNumRows(){
        
if  ( ! $this -> dbResult){
            
return   0 ;
        }
        
return   mysql_num_rows ( $this -> dbResult);
    }
    
    
/* *
     * 获取受到影响的记录数量 (用于Update/Delete/Insert操作)
     *
     * @return int 如果没有连接或者影响记录为空, 否则返回影响的行数量
     
*/
    
function  getAffectedRows(){
        
if  ( ! $this -> dbLink){
            
return   0 ;
        }
        
return   mysql_affected_rows ( $this -> dbLink);
    }
}
?>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值