<?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_no, null, COOKIE_PATH, COOKIE_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($sql, 1, true)) {
return false;
}
$row = $this->fetch($rs, self::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, $limit, true)) {
return false;
}
$result = array();
while ($rows = $this->fetch($rs, self::DB_FETCH_ROW)) {
$result[] = $rows[0];
}
$this->free($rs);
return $result;
}
/**
* 返回SQL语句执行结果中的第一行数据
*
* @param string $sql 需要执行的SQL语句
* @param const $fetch_mode 返回
分享到:
相关推荐
DB类通常是指一个自定义的Java类,用于封装数据库连接、查询和其他操作,以提高代码的可重用性和可维护性。下面我们将深入探讨如何在JSP中实现数据库连接以及创建DB类的相关知识点。 首先,我们需要引入JDBC(Java ...
db类from 51aspx
经二次修改的TP框架DB类
PHP简单好用的DB类
本人在做客服聊天系统的时候,用的原声的php编写,操作数据库的时候找了很久没有找到一个合适的链式的Db类,即便有但是没有用到单例模式,老是实例化耗资源,后来便萌生了自己编写一个好用的Db类,于是开始了封装,...
仿照tp写的db操作类相关操作,现在正在完善中...可参考
db 类封装,常用核心技术,如获得所有记录,获得一条记录、获得第一条记录的第一个字段等,以及连接数据库等
基于php的mysql数据库的封装,包含数据库连接,以及基本的增删改查操作。
本文实例讲述了PHP封装类似thinkphp连贯操作数据库Db类与简单应用。分享给大家供大家参考,具体如下: <?php header(Content-Type:text/html;charset=utf-8); /** *php操作mysql的工具类 */ class Db{ ...
DB 数据库处理类DB 数据库处理类DB 数据库处理类DB 数据库处理类
计算机后端-PHP视频教程. laravel-el21 DB类之删除.wmv
本文主要介绍了关于php封装db类连接sqlite3的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 示例代码: <?php class dbManager{ public $db; function __construct()
在PHP开发中,数据库操作是不可或缺的一部分,而DbClass是一个常用的PHP数据库操作类,它封装了常见的数据库查询、增删改查等操作,使得开发者能够更高效、安全地与数据库进行交互。DbClass通常会支持多种数据库系统...
主要介绍了zf框架的Db类select查询器join链表使用示例,需要的朋友可以参考下
Python DB 类通常指的是用于操作数据库的自定义类,它封装了数据库连接、查询和其他数据库操作。在本例中,我们看到一个名为 `DB` 的类,它使用 `pymysql` 模块来连接和操作 MySQL 数据库。下面将详细解释这个类的...
"Postgresql-DB的访问PHP类.zip"是一个压缩包,包含了一个由外国开发者编写的PHP类,用于方便地连接、查询和管理PostgreSQL数据库。这个类库对于那些想要简化PHP与PostgreSQL之间数据交互的开发者来说是非常有价值的...
加强版的PHPLib DB类是为了提供一个轻量级的数据库操作解决方案,它在原始的PHPLib DB类基础上进行了扩展和优化,同时也借鉴了PEAR::DB类的设计思想,但比这两个大型数据库抽象层更加简洁易用。这个类主要用于与...
ASP.NET完整版DB数据访问类是一个专为ASP.NET平台设计的高效、可靠的数据访问组件。这个组件的主要目标是简化数据库操作,提供一个统一的接口来处理各种数据访问任务,包括执行SQL查询、返回数据集和数据流、以及...