`
rewop998
  • 浏览: 37401 次
  • 来自: ...
社区版块
存档分类
最新评论

DB类

    博客分类:
  • PHP
阅读更多

<?php
/**
 * 数据库类
 *
 * Copyright(c) 2005-2008 by 陈毅鑫(深空). All rights reserved
 *
 * To contact the author write to {@link mailto:shenkong@php.net}
 *
 * @author 陈毅鑫(深空)
 * @version $Id: DB.class.php 2018 2008-07-28 03:37:35Z skchen $
 * @package common
 */

defined('FW') || header('HTTP/1.0 400 Bad Request'
);

/**
 * DB 抽象类
 * 其中主要是创建了一个静态变量$db,所有集成类的对象实例化到$db中方便调用
 * 该抽象类初始化时候根据配置文件存入$db变量,并调用子类进行DB实例化,使用DB::init()进行调用
 * 本类只实现了一个静态方法,并规定了其子类必须实现的一些方法。
 *
 */
abstract class DB 
{
    const 
DB_FETCH_ASSOC    1
;
    const 
DB_FETCH_ARRAY    3
;
    const 
DB_FETCH_ROW      2
;
    const 
DB_FETCH_DEFAULT  self::DB_FETCH_ASSOC
;

    public static 
$db
;
    protected static 
$db_type = array('mysqli' => 'MySQLi''oracle' => 'Oracle'
);

    protected 
$u_conn
;
    protected 
$q_conn
;
    protected 
$dsn
;
    protected 
$db_key
;
    protected 
$fecth_mode
;
    protected 
$sql
;
    protected 
$sqls
;
    protected 
$qrs
;
    protected 
$urs
;
    protected 
$u_sqls
;
    protected 
$q_sqls
;
    protected 
$query_num
;
    protected 
$update_num
;

    protected function 
__construct
() {
    }

    
/**
     * DB初始化
     *
     * @param array $dsn 配置文件中的DB信息
     * @param string $db_key 配置中的数据库KEY名
     * @param const $fetch_mode 返回数据的KEY类型
     * @return array|DB DB对象
     */
    
public static function &init(& $dsn$db_key$fetch_mode self::DB_FETCH_ASSOC
) {
        
$key explode('.'$db_key
);
        
$key "['" implode("']['" $key) . "']"
;
        eval(
'$flag = isset(self::$db' $key ');'
);
        eval(
"\$db_info = \$dsn" $key ";"
);
        if (!
$flag
) {
            
$class_name 'DB_' self::$db_type[strtolower($db_info['db_type'
])];
            
$obj = new $class_name($db_info$db_key$fetch_mode
);
            eval(
'self::$db' $key ' =& $obj;'
);
            unset(
$obj
);
        }
        return 
self::$db
;
    }

    public abstract function 
connect($type "slave"
);
    public abstract function 
close
();
    public abstract function 
query($sql$limit null$quick false
);
    public abstract function 
update($sql
);
    public abstract function 
getOne($sql
);
    public abstract function 
getCol($sql$limit null
);
    public abstract function 
getRow($sql$fetch_mode self::DB_FETCH_DEFAULT
);
    public abstract function 
getAll($sql$limit null$fetch_mode self::DB_FETCH_DEFAULT
);
}

class 
DB_MySQLi extends DB 
{
    
/**
     * MySQLi构造函数
     *
     * @param array $db_info 数据库配置信息
     * @param string $db_key db的key
     * @param 返回的数据格式 $fetch_mode
     */
    
public function __construct(& $db_info$db_key$fetch_mode
) {
        
$this->db_key $db_key
;
        
$this->dsn =& $db_info
;
        
$this->fecth_mode $fetch_mode
;
    }

    
/**
     * 连接数据库
     *
     * 连接数据库之前可能需要改变DSN,一般不建议使用此方法
     *
     * @param string $type 选择连接主服务器或者从服务器
     * @return boolean
     */
    
public function connect($type "slave"
) {
        if (
$type == "master" || !isset($this->dsn["slave"
])) {
            
$db_host = isset($this->dsn["master"]) ? $this->dsn["master"]["db_host"] : $this->dsn["db_host"
];
            
$db_name = isset($this->dsn["master"]) ? $this->dsn["master"]["db_name"] : $this->dsn["db_name"
];
            
$db_user = isset($this->dsn["master"]) ? $this->dsn["master"]["db_user"] : $this->dsn["db_user"
];
            
$db_pass = isset($this->dsn["master"]) ? $this->dsn["master"]["db_pass"] : $this->dsn["db_pass"
];
            
$this->u_conn mysqli_connect($db_host$db_user$db_pass
);
            if (!
$this->u_conn
) {
                throw new 
DB_Exception('更新数据库连接失败'
);
            }
            if (!
mysqli_select_db($this->u_conn$db_name
)) {
                throw new 
DB_Exception('更新数据库选择失败'
);
            }
            if (!isset(
$this->dsn["slave"
])) {
                
$this->q_conn =& $this->u_conn
;
            }
        } else {
            if (empty(
$this->dsn["slave"
])) {
                
$this->connect('master'
);
                return 
$this->q_conn =& $this->u_conn
;
            }
            if (empty(
$_COOKIE[COOKIE_PREFIX $this->db_key '_db_no'
])) {
                
$db_no array_rand($this->dsn["slave"
]);
                
setcookie(COOKIE_PREFIX $this->db_key '_db_no'$db_nonullCOOKIE_PATHCOOKIE_DOMAIN
);
            } else {
                
$db_no $_COOKIE[COOKIE_PREFIX $this->db_key '_db_no'
];
            }
            
$db_info $this->dsn["slave"][$db_no
];
            
$db_host $db_info["db_host"
];
            
$db_name $db_info["db_name"
];
            
$db_user $db_info["db_user"
];
            
$db_pass $db_info["db_pass"
];
            
$this->q_conn mysqli_connect($db_host$db_user$db_pass
);

            if (!
$this->q_conn
) {
                if (!
$this->u_conn
) {
                    
$this->connect('slave'
);
                }
                
$this->q_conn =& $this->u_conn
;
                if (!
$this->q_conn
) {
                    throw new 
DB_Exception('查询数据库连接失败'
);
                }
            } else {
                if (!
mysqli_select_db($this->q_conn$db_name
)) {
                    throw new 
DB_Exception('查询数据库选择失败'
);
                }
            }
        }
        return 
true
;
    }

    
/**
     * 关闭数据库连接
     *
     * 一般不需要调用此方法
     */
    
public function close
() {
        if (
$this->u_conn === $this->q_conn
) {
            if (
is_object($this->u_conn
)) {
                
mysqli_close($this->u_conn
);
            }
        } else {
            if (
is_object($this->u_conn
)) {
                
mysqli_close($this->u_conn
);
            }
            if (
is_object($this->q_conn
)) {
                
mysqli_close($this->q_conn
);
            }
        }
    }

    
/**
     * 执行一个SQL查询
     *
     * 本函数仅限于执行SELECT类型的SQL语句
     *
     * @param string $sql SQL查询语句
     * @param mixed $limit 整型或者字符串类型,如10|10,10
     * @param boolean $quick 是否快速查询
     * @return resource 返回查询结果资源句柄
     */
    
public function query($sql$limit null$quick false
) {
        if (
$limit != null
) {
            
$sql $sql " LIMIT " $limit
;
        }
        
$this->sqls[] = $sql
;
        
$this->q_sqls[] = $sql
;
        
$this->sql $sql
;

        if (!
$this->q_conn
) {
            
$this->connect("slave"
);
        }

        
$this->qrs mysqli_query($this->q_conn$sql$quick MYSQLI_USE_RESULT MYSQLI_STORE_RESULT
);
        if (!
$this->qrs
) {
            throw new 
DB_Exception('查询失败:' mysqli_error($this->q_conn
));
        } else {
            
$this->query_num
++;
            return 
$this->qrs
;
        }
    }

    
/**
     * 获取结果集
     *
     * @param resource $rs 查询结果资源句柄
     * @param const $fetch_mode 返回的数据格式
     * @return array 返回数据集每一行,并将$rs指针下移
     */
    
public function fetch($rs$fetch_mode self::DB_FETCH_DEFAULT
) {
        switch (
$fetch_mode
) {
            case 
1
:
                
$fetch_mode self::DB_FETCH_ASSOC
;
                break;
            case 
2
:
                
$fetch_mode self::DB_FETCH_ROW
;
                break;
            case 
3
:
                
$fetch_mode self::DB_FETCH_ARRAY
;
                break;
            default:
                
$fetch_mode self::DB_FETCH_DEFAULT
;
                break;
        }
        return 
mysqli_fetch_array($rs$fetch_mode
);
    }

    
/**
     * 执行一个SQL更新
     *
     * 本方法仅限数据库UPDATE操作
     *
     * @param string $sql 数据库更新SQL语句
     * @return boolean
     */
    
public function update($sql
) {
        
$this->sql $sql
;
        
$this->sqls[] = $this->sql
;
        
$this->u_sqls[] = $this->sql
;
        if (!
$this->u_conn
) {
            
$this->connect("master"
);
        }

        
$this->urs mysqli_query($this->u_conn$sql
);

        if (!
$this->urs
) {
            throw new 
DB_Exception('更新失败:' mysqli_error($this->u_conn
));
        } else {
            
$this->update_num
++;
            return 
$this->urs
;
        }
    }

    
/**
     * 返回SQL语句执行结果集中的第一行第一列数据
     *
     * @param string $sql 需要执行的SQL语句
     * @return mixed 查询结果
     */
    
public function getOne($sql
) {
        if (!
$rs $this->query($sql1true
)) {
            return 
false
;
        }
        
$row $this->fetch($rsself::DB_FETCH_ROW
);
        
$this->free($rs
);
        return 
$row[0
];
    }

    
/**
     * 返回SQL语句执行结果集中的第一列数据
     *
     * @param string $sql 需要执行的SQL语句
     * @param mixed $limit 整型或者字符串类型,如10|10,10
     * @return array 结果集数组
     */
    
public function getCol($sql$limit null
) {
        if (!
$rs $this->query($sql$limittrue
)) {
            return 
false
;
        }
        
$result 
= array();
        while (
$rows $this->fetch($rsself::DB_FETCH_ROW
)) {
            
$result[] = $rows[0
];
        }
        
$this->free($rs
);
        return 
$result
;
    }

    
/**
     * 返回SQL语句执行结果中的第一行数据
     *
     * @param string $sql 需要执行的SQL语句
     * @param const $fetch_mode 返回

分享到:
评论

相关推荐

    jsp连接数据库 DB类

    DB类通常是指一个自定义的Java类,用于封装数据库连接、查询和其他操作,以提高代码的可重用性和可维护性。下面我们将深入探讨如何在JSP中实现数据库连接以及创建DB类的相关知识点。 首先,我们需要引入JDBC(Java ...

    db类

    db类from 51aspx

    php二次开发的TP框架DB类

    经二次修改的TP框架DB类

    PHP简单好用的DB类

    PHP简单好用的DB类

    封装类似thinkphp连贯操作数据库的Db类,单例模式,完全遵守tp写法的三方类,使用超级简单!

    本人在做客服聊天系统的时候,用的原声的php编写,操作数据库的时候找了很久没有找到一个合适的链式的Db类,即便有但是没有用到单例模式,老是实例化耗资源,后来便萌生了自己编写一个好用的Db类,于是开始了封装,...

    仿Thinkphp Db类

    仿照tp写的db操作类相关操作,现在正在完善中...可参考

    php 封装db类

    db 类封装,常用核心技术,如获得所有记录,获得一条记录、获得第一条记录的第一个字段等,以及连接数据库等

    php 数据库db类封装

    基于php的mysql数据库的封装,包含数据库连接,以及基本的增删改查操作。

    PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例

    本文实例讲述了PHP封装类似thinkphp连贯操作数据库Db类与简单应用。分享给大家供大家参考,具体如下: &lt;?php header(Content-Type:text/html;charset=utf-8); /** *php操作mysql的工具类 */ class Db{ ...

    DB 数据库处理类DB 数据库处理类

    DB 数据库处理类DB 数据库处理类DB 数据库处理类DB 数据库处理类

    计算机后端-PHP视频教程. laravel-el21 DB类之删除.wmv

    计算机后端-PHP视频教程. laravel-el21 DB类之删除.wmv

    php封装db类连接sqlite3数据库的方法实例

    本文主要介绍了关于php封装db类连接sqlite3的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 示例代码: &lt;?php class dbManager{ public $db; function __construct()

    php数据库操作类 DbClass

    在PHP开发中,数据库操作是不可或缺的一部分,而DbClass是一个常用的PHP数据库操作类,它封装了常见的数据库查询、增删改查等操作,使得开发者能够更高效、安全地与数据库进行交互。DbClass通常会支持多种数据库系统...

    zf框架的db类select查询器join链表使用示例(zend框架)

    主要介绍了zf框架的Db类select查询器join链表使用示例,需要的朋友可以参考下

    python db类用法说明

    Python DB 类通常指的是用于操作数据库的自定义类,它封装了数据库连接、查询和其他数据库操作。在本例中,我们看到一个名为 `DB` 的类,它使用 `pymysql` 模块来连接和操作 MySQL 数据库。下面将详细解释这个类的...

    Postgresql-DB的访问PHP类.zip

    "Postgresql-DB的访问PHP类.zip"是一个压缩包,包含了一个由外国开发者编写的PHP类,用于方便地连接、查询和管理PostgreSQL数据库。这个类库对于那些想要简化PHP与PostgreSQL之间数据交互的开发者来说是非常有价值的...

    加强版phplib的DB类

    加强版的PHPLib DB类是为了提供一个轻量级的数据库操作解决方案,它在原始的PHPLib DB类基础上进行了扩展和优化,同时也借鉴了PEAR::DB类的设计思想,但比这两个大型数据库抽象层更加简洁易用。这个类主要用于与...

    ASP.NET完整版DB数据访问类

    ASP.NET完整版DB数据访问类是一个专为ASP.NET平台设计的高效、可靠的数据访问组件。这个组件的主要目标是简化数据库操作,提供一个统一的接口来处理各种数据访问任务,包括执行SQL查询、返回数据集和数据流、以及...

Global site tag (gtag.js) - Google Analytics