mysql new类_使用php编写一个带读写分离功能的MySQL类

使用php编写一个带读写分离功能的MySQL类

发布时间:2021-02-11 13:09:23

来源:亿速云

阅读:64

作者:Leah

今天就跟大家聊聊有关使用php编写一个带读写分离功能的MySQL类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

概述:

1. 根据sql语句判断是连接读库还是写库

2. 链式调用$this->where()->get()

3. 不同的主机对应不同的实例, 不再多次new

具体代码如下:<?php

class DBRWmysql

{

private static $Instance = null;

private $links = array();//链接数组

private $link = null; //当前连接

public $dbType = 'read';

public $_host=''; //数据库所在主机名

public $_database = '';//当前数据库名

public $_tablename = '';//当前表的表名

public $_dt ='';//database.tablename

public $isRelease = 0; //查询完成后是否释放

public $fields = '*';

public $arrWhere = [];

public $order = '';

public $arrOrder = [];

public $limit = '';

public $sql = '';

public $rs;//结果集

private function __construct($database='', $tablename='', $isRelease=0)

{

$this->_database = $database;//database name

$this->_tablename = $tablename;//table name

$this->_dt = "`{$this->_database}`.`{$this->_tablename}`";

$this->isRelease = $isRelease;

}

public static function getInstance($database='', $tablename='', $isRelease=0)

{

if (self::$Instance == null) {

self::$Instance = new DBRWmysql($database, $tablename, $isRelease);

}

self::$Instance->_database = $database;

self::$Instance->_tablename = $tablename;

self::$Instance->_dt    = "`{$database}`.`{$tablename}`";

self::$Instance->isRelease = $isRelease;

return self::$Instance;

}

//如果主机没变,并且已经存在MYSQL连接,就不再创建新的连接

//如果主机改变,就再生成一个实例创建一个连接

//type == 'write'或'read'

public function getLink($type)

{

$this->dbType = $$type;

//随机选取一个数据库连接(区分读写)

$dbConfig = DBConfig::$$type;

$randKey = array_rand($dbConfig);

$config = $dbConfig[$randKey];

//链接数据库

$host = $config['host'];

$username = $config['username'];

$password = $config['password'];

if (empty($this->links[$host])) {

$this->_host = $host;

$this->links[$host] = new mysqli($host, $username, $password);

if($this->links[$host]->connect_error) {

$this->error($this->links[$host]->connect_error);

}

}

//初始化链接

$this->link = $this->links[$host];

$this->link->query("set names utf8mb4;"); //支持emoji表情

$this->link->query("use {$this->_database};");

}

public function getCurrentLinks()

{

return $this->links;

}

//析构函数

public function __destruct()

{

foreach ($this->links as $v) {

$v->close();

}

}

//查询封装

public function query($sql)

{

$this->sql = $sql;

if (strpos($sql, 'select') !== false) {

$this->getLink('read');//读库

} else {

$this->getLink('write');//写库

}

$this->rs = $this->link->query($sql);

($this->rs === false) && $this->error('sql error: '.$sql.PHP_EOL.$this->link->error);

//查询完成后释放链接, 并删除链接对象

if ($this->isRelease) {

$this->link->close();

unset($this->links[$this->_host]);

}

return $this->rs;

}

//增

public function insert($arrData)

{

foreach ($arrData as $key=>$value) {

$fields[] = $key;

$values[] = "'".$value."'";

// $fields[] = '`'.$key.'`';

// $values[] = "'".$value."'";

}

$strFields = implode(',', $fields);

$strValues = implode(',', $values);

$sql = "insert into {$this->_dt} ($strFields) values ($strValues)";

$this->query($sql);

$insert_id = $this->link->insert_id;

return $insert_id;

}

//增

public function replace($arrData)

{

foreach ($arrData as $key=>$value) {

$fields[] = $key;

$values[] = "'{$value}'";

}

$strFields = implode(',', $fields);

$strValues = implode(',', $values);

$sql = "replace into {$this->_dt} ($strFields) values ($strValues)";

$this->query($sql);

return $this->link->insert_id;

}

//增

//每次插入多条记录

//每条记录的字段相同,但是值不一样

public function insertm($arrFields, $arrData)

{

foreach ($arrFields as $v) {

// $fields[] = "`{$v}`";

$fields[] = $v;

}

foreach ($arrData as $v) {

$data[] = '('.implode(',', $v).')';

}

$strFields = implode(',', $fields);

$strData = implode(',', $data);

$sql = "insert into {$this->_dt} ($strFields) values {$strData}";

$this->query($sql);

return $this->link->insert_id;

}

//删

public function delete()

{

$where = $this->getWhere();

$limit = $this->getLimit();

$sql = " delete from {$this->_dt} {$where} {$limit}";

$this->query($sql);

return $this->link->affected_rows;

}

//改

public function update($data)

{

$where = $this->getWhere();

$arrSql = array();

foreach ($data as $key=>$value) {

$arrSql[] = "{$key}='{$value}'";

}

$strSql = implode(',', $arrSql);

$sql = "update {$this->_dt} set {$strSql} {$where} {$this->limit}";

$this->query($sql);

return $this->link->affected_rows;

}

//获取总数

public function getCount()

{

$where = $this->getWhere();

$sql = " select count(1) as n from {$this->_dt} {$where} ";

$resault = $this->query($sql);

($resault===false) && $this->error('getCount error: '.$sql);

$arrRs = $this->rsToArray($resault);

$num = array_shift($arrRs);

return $num['n'];

}

//将结果集转换成数组返回

//如果field不为空,则返回的数组以$field为键重新索引

public function rsToArray($field = '')

{

$arrRs = $this->rs->fetch_all(MYSQLI_ASSOC); //该函数只能用于php的mysqlnd驱动

$this->rs->free();//释放结果集

if ($field) {

$arrResult = [];

foreach ($arrRs as $v) {

$arrResult[$v[$field]] = $v;

}

return $arrResult;

}

return $arrRs;

}

//给字段名加上反引号

public function qw($strFields)

{

$strFields = preg_replace('#\s+#', ' ', $strFields);

$arrNewFields = explode(' ', $strFields );

$arrNewFields = array_filter($arrNewFields);

foreach ($arrNewFields as $k => $v) {

$arrNewFields[$k]= '`'.$v.'`';

}

return implode(',', $arrNewFields);

}

//处理入库数据,将字符串格式的数据转换为...格式(未实现)

public function getInsertData($strData)

{

// $bmap = "jingdu,$jingdu weidu,$weidu content,$content";

}

//select in

//arrData 整数数组,最好是整数

public function select_in($key, $arrData, $fields='')

{

$fields = $fields ? $fields : '*';

sort($arrData);

$len = count($arrData);

$cur = 0;

$pre = $arrData[0];

$new = array('0' => array($arrData[0]));

for ($i = 1; $i 

if (($arrData[$i] - $pre) == 1 ) {

$new[$cur][] = $arrData[$i];

} else {

$cur = $i;

$new[$cur][] = $arrData[$i];

}

$pre = $arrData[$i];

}

$arrSql = array();

foreach ($new as $v) {

$len = count($v) - 1;

if ($len) {

$s = $v[0];

$e = end($v);

$sql = "(select $fields from {$this->_dt} where $key between $s and $e)";

} else {

$s = $v[0];

$sql = "(select $fields from {$this->_dt} where $key = $s)";

}

$arrSql[] = $sql;

}

$strUnion = implode(' UNION ALL ', $arrSql);

$res = $this->query($strUnion);

return $this->rstoarray($res);

}

//where in

public function setWhereIn($key, $arrData)

{

if (empty($arrData)) {

$str = "(`{$key}` in ('0'))";

$this->addWhere($str);

return $str;

}

foreach ($arrData as &$v) {

$v = "'{$v}'";

}

$str = implode(',', $arrData);

$str = "(`{$key}` in ( {$str} ))";

$this->addWhere($str);

return $this;

}

//where in

public function setWhere($arrData)

{

if (empty($arrData)) {

return '';

}

foreach ($arrData as $k => $v) {

$str = "(`{$k}` = '{$v}')";

$this->addWhere($str);

}

return $this;

}

//between and

public function setWhereBetween($key, $min, $max)

{

$str = "(`{$key}` between '{$min}' and '{$max}')";

$this->addWhere($str);

return $this;

}

//where a>b

public function setWhereBT($key, $value)

{

$str = "(`{$key}` > '{$value}')";

$this->addWhere($str);

return $this;

}

//where a

public function setWhereLT($key, $value)

{

$str = "(`{$key}` 

$this->addWhere($str);

return $this;

}

//组装where条件

public function addWhere($where)

{

$this->arrWhere[] = $where;

}

//获取最终查询用的where条件

public function getWhere()

{

if (empty($this->arrWhere)) {

return 'where 1';

} else {

return 'where '.implode(' and ', $this->arrWhere);

}

}

//以逗号隔开

public function setFields($fields)

{

$this->fields = $fields;

return $this;

}

// order by a desc

public function setOrder($order)

{

$this->arrOrder[] = $order;

return $this;

}

//获取order语句

public function getOrder()

{

if (empty($this->arrOrder)) {

return '';

} else {

$str = implode(',', $this->arrOrder);

$this->order = "order by {$str}";

}

return $this->order;

}

//e.g. '0, 10'

//用limit的时候可以加where条件优化:select ... where id > 1234 limit 0, 10

public function setLimit($limit)

{

$this->limit = 'limit '.$limit;

return $this;

}

//直接查询sql语句, 返回数组格式

public function arrQuery($sql, $field='')

{

$this->query($sql);

$this->clearQuery();

($this->rs===false) && $this->error('select error: '.$sql);

return $this->rsToArray($field);

}

//如果 $field 不为空, 则返回的结果以该字段的值为索引

//暂不支持join

public function get($field='')

{

$where = $this->getWhere();

$order = $this->getOrder();

$sql = " select {$this->fields} from {$this->_dt} {$where} {$order} {$this->limit} ";

return $this->arrQuery($sql, $field);

}

//获取一条记录

public function getOne()

{

$this->setLimit(1);

$rs = $this->get();

return !empty($rs) ? $rs[0] : [];

}

//获取一条记录的某一个字段的值

public function getOneField($field)

{

$this->setFields($field);

$rs = $this->getOne();

return !empty($rs[$field]) ? $rs[$field] : '';

}

//获取数据集中所有某个字段的值

public function getFields($field)

{

$this->setFields($field);

$rs = $this->get();

$result = [];

foreach ($rs as $v) {

$result[] = $v[$field];

}

unset($rs);

return $result;

}

//清除查询条件

//防止干扰下次查询

public function clearQuery()

{

$this->fields = '*';

$this->arrWhere = [];

$this->order = '';

$this->arrOrder = [];

$this->limit = '';

}

//断开数据库连接

public function close()

{

$this->link->close();

}

//事务

//自动提交开关

public function autocommit($bool)

{

$this->link->autocommit($bool);

}

//事务完成提交

public function commit()

{

$this->link->commit();

}

//回滚

public function rollback()

{

$this->link->rollback();

}

//输出错误sql语句

public function error($sql)

{

//if (IS_TEST) {}

exit($sql);

}

}

看完上述内容,你们对使用php编写一个带读写分离功能的MySQL类有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值