文档章节

用单例模式来设计一个PHP数据库类

Tony2015
 Tony2015
发布于 2015/05/18 16:49
字数 796
阅读 15
收藏 0

最近感觉网站的数据库压力比较大,造成网站的速度下降得很厉害。因为有相当一部分的页面是直接连接数据库读数据的,所以把这部分的页面也改为使用数据库单例类来实现。现在基本都统一使用下面这个类来连接数据库了

  • 需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量)

  • 构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义

  • 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用

<?php
class nmdb 
{
	private $link;
	static private $_instance;
	// 连接数据库
	private function __construct($host, $username, $password)
	{
		$this->link = mysql_connect($host, $username, $password);
		$this->query("SET NAMES 'utf8'", $this->link);
		//echo mysql_errno($this->link) . ": " . mysql_error($link). "n";
		//var_dump($this->link);
		return $this->link;
	}
	
	private function __clone(){}
	
	public static function get_class_nmdb($host, $username, $password)
	{
        //$connector = new nmdb($host, $username, $password);
        //return $connector;
		
		if( FALSE == (self::$_instance instanceof self) )
		{
			self::$_instance = new self($host, $username, $password);
		}
		return self::$_instance;
    }
	
	// 连接数据表
	public function select_db($database)
	{
		$this->result = mysql_select_db($database);
		return $this->result;
	}
	
	// 执行SQL语句
	public function query($query)
	{
		return $this->result = mysql_query($query, $this->link);
	}
	
	// 将结果集保存为数组
	public function fetch_array($fetch_array)
	{
		return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);
	}
	
	// 获得记录数目
	public function num_rows($query)
	{
		return $this->result = mysql_num_rows($query);
	}
	
	// 关闭数据库连接
	public function close()
	{
		return $this->result = mysql_close($this->link);
	}
	
}
?>

这个类的使用如下:

$connector = nmdb::get_class_nmdb($host, $username, $password);
$connector -> select_db($database);

下面的类也可以参考下:

<?php
/*
* mysql 单例
*/
class mysql{
    private $host    ='localhost'; //数据库主机
    private $user     = 'root'; //数据库用户名
    private $pwd     = ''; //数据库用户名密码
    private $database = 'imoro_imoro'; //数据库名
    private $charset = 'utf8'; //数据库编码,GBK,UTF8,gb2312
    private $link;             //数据库连接标识;
    private $rows;             //查询获取的多行数组
    static $_instance; //存储对象
    /**
     * 构造函数
     * 私有
     */
    private function __construct($pconnect = false) {
        if (!$pconnect) {
            $this->link = @ mysql_connect($this->host, $this->user, $this->pwd) or $this->err();
        } else {
            $this->link = @ mysql_pconnect($this->host, $this->user, $this->pwd) or $this->err();
        }
        mysql_select_db($this->database) or $this->err();
        $this->query("SET NAMES '{$this->charset}'", $this->link);
        return $this->link;
    }
    /**
     * 防止被克隆
     *
     */
    private function __clone(){}
    public static function getInstance($pconnect = false){
        if(FALSE == (self::$_instance instanceof self)){
            self::$_instance = new self($pconnect);
        }
        return self::$_instance;
    }
    /**
     * 查询
     */
    public function query($sql, $link = '') {
        $this->result = mysql_query($sql, $this->link) or $this->err($sql);
        return $this->result;
    }
    /**
     * 单行记录
     */
    public function getRow($sql, $type = MYSQL_ASSOC) {
        $result = $this->query($sql);
        return @ mysql_fetch_array($result, $type);
    }
    /**
     * 多行记录
     */
    public function getRows($sql, $type = MYSQL_ASSOC) {
        $result = $this->query($sql);
        while ($row = @ mysql_fetch_array($result, $type)) {
            $this->rows[] = $row;
        }
        return $this->rows;
    }
    /**
     * 错误信息输出
     */
    protected function err($sql = null) {
        //这里输出错误信息
        echo 'error';
        exit();
    }
}
//用例
$db = mysql::getInstance();
$db2 = mysql::getInstance();
$data = $db->getRows('select * from blog');
//print_r($data);
//判断两个对象是否相等
if($db === $db2){
    echo 'true';
}
?>

下面的也可以参考

<?php

class Db {
	static private $_instance;
	static private $_connectSource;
	private $_dbConfig = array(
		'host' => '127.0.0.1',
		'user' => 'root',
		'password' => '',
		'database' => 'video',
	);
     // //将构造方法私有,防止在外层直接new
	private function __construct() {
	}

	static public function getInstance() {
		if(!(self::$_instance instanceof self)) {
			self::$_instance = new self();
		}
		return self::$_instance;
	}

	public function connect() {
		if(!self::$_connectSource) {
			self::$_connectSource = @mysql_connect($this->_dbConfig['host'], $this->_dbConfig['user'], $this->_dbConfig['password']);	

			if(!self::$_connectSource) {
				throw new Exception('mysql connect error ' . mysql_error());
				//die('mysql connect error' . mysql_error());
			}
			
			mysql_select_db($this->_dbConfig['database'], self::$_connectSource);
			mysql_query("set names UTF8", self::$_connectSource);
		}
		return self::$_connectSource;
	}
}
/*$connect = Db::getInstance()->connect();

$sql = "select * from video";
$result = mysql_query($sql, $connect);
echo mysql_num_rows($result);
var_dump($result);*/



本文转载自:

共有 人打赏支持
Tony2015
粉丝 1
博文 50
码字总数 28618
作品 0
杭州
程序员
编程中的那些套路——关于工厂模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 前面我们写了简单工厂模式,《编程中的那些套路——关于简单工厂模式》,但简单工厂模式有一些不足(违反...

gzchen
08/27
0
0
编程中的那些套路——关于单例模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 在设计模式中,单例模式和工厂模式)可以说是使用的最普遍的设计模式了,所以掌握此种模式尤为重要。 单...

gzchen
08/27
0
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
09/03
0
0
TP5.0 Redis(单例模式)(原)

看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的Reis做了一次修改. 单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行实例...

豆花饭烧土豆
08/09
0
0
Python学习:19.Python设计模式-单例模式

一、单例模式存在的意义   在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什...

BD-ld-2017
07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

腾讯投资最高1.75亿美元正式进军菲律宾移动支付市场

菲律宾长途电话公司(PLDT)公司今日宣布,中国互联网巨头腾讯和私募股权公司KKR将获得该公司旗下金融科技公司Voyager Innovations的少数股权。 PLDT在一份声明中称:“腾讯和KKR最多将分别收...

linuxCool
17分钟前
1
0
正则介绍及grep/egrep用法

10月16日任务 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 扩展 把一个目录下,过滤所有*.php文档中含有eval的行 grep -r --include="*.php" 'eval' /data 正则介绍 正则就是一串有规律的字符...

hhpuppy
28分钟前
0
0
J2Cache 中使用 Lettuce 替代 Jedis 管理 Redis 连接

一直以来 J2Cache 都是使用 Jedis 连接 Redis 服务的。Jedis 是一个很老牌的 Redis 的 Java 开发包,使用很稳定,作者维护很勤勉,社区上能搜到的文章也非常非常多。算是使用范围最广的 Redi...

红薯
今天
11
0
一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
今天
1
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部