原创 [原创]简单快速有趣的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);
    }
}
?>

发表于 @ 2006年09月21日 13:37:00|评论(loading...)

新一篇: [转]如何用数据库保存多级结构的数据 | 旧一篇: [转]追MM与Java的23种设计模式

用户操作
[即时聊天] [发私信] [加为好友]
heiyeluren
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
heiyeluren的公告

联系方式:


访问统计: free hit counter code
FeedSky订阅:
FeedSky订阅
文章分类
收藏
    ::eYou::
    kevin world
    lewis - 老吕
    qyb - BT的花
    Realzay的blog
    叶金荣
    天堂地狱鬼-dulao5's Blog
    沙漠之周
    狐狸糊涂
    老韩
    與子觀化
    鞋门
    ::Yahoo::
    glemir’s blog
    happy_fish - 分布式文件系统FastDFS
    LinZi's Blog
    Rainx
    stauren
    互联网,请记住我 - 162同学的技术博客
    冰的河
    北冥之鱼-张彪同学
    天韵之星
    小蚂蚁同学滴测试博客
    随网之舞 - kaven的DHTML博客
    风雪之隅
    ::朋友::
    【推荐】中文分类网
    DDR的博客
    kevin world
    miky
    PHPCup.cn论坛
    俺兄弟的blog
    冰河的技术博客:心随风动
    好旅网
    小少的技术博客
    无尘居
    晋陵路人的Blog
    李天华同学滴技术博客
    沙狐部落
    轻量级的editor
    ::网友::
    blankyao同学
    Code & Stock.
    Hello, Willko
    LionD8的Blog
    magiclab.cn
    MooPHP - 轻量级PHP框架
    Phzzy
    Xhttpd.cn
    张贺同学的博客
    技术大牛老余的博客
    抚琴居
    旋木木同学滴博客
    流水孟春
    矛盾网
    程序人生
    邢红瑞的blog
    阿健的博客
    :PHP博客:
    .: Easy style :.
    [琴剑楼]
    CoolCode.cn
    Haohappy的Blog
    Hightman
    iwind的blog
    Javascript开发站
    JD Space
    Nio's Weblog
    Open Source PHP
    PHP面对对象
    SourceForge.net
    trip的专栏
    UGIA.cn
    windix's blog
    Windix's Weblog
    一个藏袍
    俊麟 Michael`s blog
    偶然的blog
    刘敏的blog
    大龄青年的Blog
    廖宇雷的blog
    懒猫开始新生活blog
    某人的栖息地
    王春生的博客
    神仙
    :牛人blog:
    DBA notes
    http://blog.csdn.net/tingya/
    侯捷网站
    孟岩
    搜索引擎研究
    方舟
    王咏刚的BLOG
    竹笋炒肉
    荣耀
    车东[Blog^2]
    透明思考
    陈硕的Blog
    DHTML
    DHTMLGoodies
    FCKEditor
    Google Code
    Google Web Toolkit
    HTML Goodies
    HTML.it
    HTMLAre
    HTMLdog
    JavaScript Kit
    jQuery
    KindEditor
    Prototype
    TinyMCE
    W3 Schools
    Yahoo JavaScript Developer Center
    Yahoo! Developer Network
    Yahoo! UI Library (YUI)
    网页设计师Web标准
    Java国内站
    ChinaJavaWorld.com技术论坛
    IBM developerWorks 中国: Java
    Java中文站
    Java开源大全
    Java爱好者
    JR - Java翻译站
    J道-JDON
    Matrix: 与Java共舞
    中国Java开发网
    中文java技术网
    PHP国内站点
    CSDN PHP论坛
    Discuz!
    FleaPHP
    Google--PHP用户组
    IBM DeveloperWorks
    JavsScript技术讨论
    Nirvana Studio
    OpenPHP.cn
    PHPChina
    TiM Club
    中文 PFC 1.0 手册--PHP5的开发包
    中文 PFC 1.0 手册--PHP5的开发包
    中文PHP网
    太平洋--PHP开发区
    爱MySQL
    超越PHP
    PHP国外站点
    ADOdb
    Agavi Framework
    Cake PHP
    MySQL Performance Blog
    MySQL Performance Blog
    Nonaweb
    PEAR
    PECL
    PECL Windows
    PHP Builder
    PHP Classes
    PHP Classes
    PHP New Download
    PHP Security Consortium
    php.MVC
    php.MVC
    PHPkitchen(OO & MVC)
    phpPatterns
    PHP国外图书下载
    smart template
    Smarty
    SourceForge.net
    Symfony Framework
    Zend
    Zend Framework
    Unix C/C++
    Free Gentux
    周立发的blog(Linux C)
    Unix/Linux
    BSD智库
    ChinaUnix
    FreeBSDChina
    FreeLAMP
    IBM开发者Linux专区
    Linux Byte
    LinuxKit
    LinuxTS
    Linux伊甸园
    Linux技术中坚站
    Linux非常空间
    Love Unix
    NetBSD&OpenBSD中文用户组
    NetBSD中国社区
    Oracle中国用户讨论组
    OurLinux
    Unix中文
    Unix中文
    Unix中文宝库
    中国Linux公社
    中国Unix用户技术论坛
    中文FreeBSD用户组
    永远的Unix
    炎黄角马
    程序设计
    CSDN
    IBM开发者中心
    Microsoft TechNet: 主页
    MSDN 中文网站
    PHP中文站
    Sun技术社区
    中国IT认证实验室--企业应用技术
    中国协议分析网
    喜悦国际村
    太平洋电脑网---开发特区
    实用网站
    veBook(国外大量免费图书下载网站)
    Whois.net
    中国Web信息博物馆
    中国互联网络信息中心whois查询
    服务器系统信息查看
    网络安全
    AnySide.com
    CGI Secutiry
    K-OTik Security Monitoring
    Linux Security
    Packet Storm Security
    PHP Secure
    RFC中文文档索引
    Safemode.org
    SecuriTeam.com
    Security Corporation
    SecurityFocus
    SecurityTracker
    Zone-h (区域黑客,每天公布各国被黑的网站)
    中华安全网
    中国信息安全组织
    国家计算机网络应急处理中心
    安全天使
    安全焦点
    幻影旅团
    绿盟科技
    网络安全评估中心(cnns )
    在线手册
    Apache2.0中文文档
    Beyond Linux From Scratch
    Debian参考手册
    FreeBSD Porter 手册
    FreeBSD使用手册
    Linux C函数中文参考手册
    MySQL 4.1.0 中文参考手册
    NetBSD在线手册
    OpenBSD在线FAQ
    PHP ADODB 1.99版手册中文翻译(Tripc)
    PHP中文手册(国内)
    PHP中文手册(国外)
    PostgreSQL中文文档
    Red Hat Linux 9入门指南
    Red Hat Linux 9安装指南
    Red Hat Linux 9定制手册
    中国OSS技术手册中心
    技术文档手册中心-ChinaUnix
    存档
    Csdn Blog version 3.1a
    Copyright © heiyeluren