php实现的mysqldb读写分离操作类示例


Posted in PHP onFebruary 07, 2017

本文实例讲述了php实现的mysqldb读写分离操作类。分享给大家供大家参考,具体如下:

/**
* php MysqlDB 读写分离类
* -----------------------------------------------------
* $Source: http://code.ilaopo.net/php.class.mysqldb $
* $Author: Bevin Chen $
* $Email: bevin#lifa8.cn $
* $Date: 2009-10-10 $
* -----------------------------------------------------
*/
class mysqldb {
  var $querynum = 0;
  var $linkr,$linkw,$charset,$pconnect,$dbconfig;
  function __constructor($dbarray) {
    $this->mysqldb($dbarray);
  }
  function mysqldb($dbarray,$dbcharset='utf8',$pcontent=0) {
    if(!is_array($dbarray[0])) {
      echo "数据库参数错误";
      return false;
    }
    $this->charset = $dbcharset;
    $this->pconnect = $pconnect;
    $this->dbconfig['master'] = $dbarray[0];
    $dbServerNum = count($dbarray);
    if($dbServerNum > 1) {
      /*
  * 当x=1 时,$dbarray[0]不作slave
  * 当x=0 时,$dbarray[0]作slave
  */
      $x = 1;
      $rand = rand($x,$dbServerNum-1);
      $this->dbconfig['slave'] = $dbarray[$rand];
    } else {
      $this->dbconfig['slave'] = false;
    }
  }
  function connect($dbhost,$dbuser,$dbpw,$dbname) {
    if($this->pconnect) {
      $link = @mysql_pconnect($dbhost, $dbuser, $dbpw);
    } else {
      $link = @mysql_connect($dbhost, $dbuser, $dbpw, 1);
    }
    if($link) {
      if($this->version($link) > '4.1') {
        if($this->charset) {
          @mysql_query("SET character_set_connection=".$this->charset.", character_set_results=".$this->charset.", character_set_client=binary", $link);
        }
        if($this->version($link) > '5.0.1') {
          @mysql_query("SET sql_mode=''", $link);
        }
      }
      if($dbname) {
        @mysql_select_db($dbname, $link);
      }
      //print_r($link);
      return $link;
    } else {
      return false;
    }
  }
  function connectM() {
    if(!$this->linkw = $this->connect($this->dbconfig['master'][0],$this->dbconfig['master'][1],$this->dbconfig['master'][2],$this->dbconfig['master'][3])) {
      exit("主数据库连接失败!");
    }
    //echo "<br>##connectM!.<br>";
  }
  function connectS() {
    if($this->dbconfig['slave']) {
      if(!$this->linkr = $this->connect($this->dbconfig['slave'][0],$this->dbconfig['slave'][1],$this->dbconfig['slave'][2],$this->dbconfig['slave'][3])) {
        $this->dbconfig['slave'] = false;
        $this->connectS();
      }
      //echo "<br>##connectS!.<br>";
    } else {
      if(!$this->linkw) {
        $this->connectM();
      }
      $this->linkr = $this->linkw;
    }
  }
  // db read
  function query($sql, $type = '') {
    if(!$this->linkr) {
      $this->connectS();
    }
    $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
      'mysql_unbuffered_query' : 'mysql_query';
    $query = $func($sql, $this->linkr);
    $this->querynum++;
    return $query;
  }
  function fetch_array($query, $result_type = MYSQL_ASSOC) {
    return @mysql_fetch_array($query, $result_type);
  }
  function fetch_row($query) {
    $query = mysql_fetch_row($query);
    return $query;
  }
  function fetch_One($sql) {
    $query = $this->query($sql);
    return $this->fetch_row($query);
  }
  /* 获取分页方法 */
  function fetch_page($sql, $pagenum) {
    $page = intval($_GET['page']);
    $query = $this->query($sql);
    $countnum = $this->num_rows($query);
    $countpage = ceil($countnum/$pagenum);
    if($page<1) {
      $page=1;
    }
    if($page>$countpage) {
      $page=$countpage;
    }
    $limitstart = ($page-1)*$pagenum;
    /* 获取数据结果集 */
    for ($i=0; $i<($limitstart+$pagenum); $i++) {
      if($i>=$countnum) {
        break;
      }
      if($i>=$limitstart) {
        $result[] = $this->fetch_array($query);
      } else {
        $this->fetch_array($query);
      }
    }
    /* 生成url */
    $url = $_SERVER['QUERY_STRING'];
    $url = preg_replace("/&?page=[0-9]+/i","",$url);
    $array['countnum'] = $countnum;
    $array['countpage'] = $countpage;
    $array['result'] = $result;
    $array['page'] = $page;
    if($page>1) {
      $array['preurl'] = "?".$url."&page=".($page-1);
      $array['prepage'] = $page-1;
    } else {
      $array['preurl'] = "?".$url."&page=1";
      $array['prepage'] = 1;
    }
    if($page<$countpage) {
      $array['nexturl'] = "?".$url."&page=".($page+1);
      $array['nextpage'] = $page+1;
    } else {
      $array['nexturl'] = "?".$url."&page=".$countpage;
      $array['nextpage'] = $countpage;
    }
    $array['firsturl'] = "?".$url."&page=1";
    $array['firstpage'] = 1;
    $array['lasturl'] = "?".$url."&page=".$countpage;
    $array['lastpage'] = $countpage;
    $array['nopage'] = "?".$url."&page=";
    return $array;
  }
  // db write
  function queryw($sql, $type = '') {
    if(!$this->linkw) {
      $this->connectM();
    }
    $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
      'mysql_unbuffered_query' : 'mysql_query';
    $query = $func($sql, $this->linkw);
    $this->querynum++;
    return $query;
  }
  function update($table,$where,$array) {
    $whereset = $set = $dot = '';
    foreach($array as $key=>$value) {
      $set .= $dot." `$key`='$value'";
      $dot = ',';
    }
    $whereset = $dot = '';
    foreach($where as $k=>$v) {
      $whereset .= $dot." `$k`='$v'";
      $dot = ' and ';
    }
    $sql = "update $table set $set where $whereset";
    return $this->queryw($sql);
  }
  function insert($table,$array) {
    $col = $v = $dot = '';
    foreach($array as $key=>$value) {
      $v .= $dot."'$value'";
      $col .= $dot."`$key`";
      $dot = ',';
    }
    $sql = "insert into $table ($col) values ($v)";
    if($this->queryw($sql)) {
      return $this->insert_id();
    } else {
      return false;
    }
  }
  function insert_id() {
    return ($id = mysql_insert_id($this->linkw)) >= 0 ? $id : $this->result($this->queryw("SELECT last_insert_id()"), 0);
  }
  // db other
  function affected_rows($link) {
    return mysql_affected_rows($link);
  }
  function error($link) {
    return (($link) ? mysql_error($link) : mysql_error());
  }
  function errno($link) {
    return intval(($link) ? mysql_errno($link) : mysql_errno());
  }
  function result($query, $row) {
    $query = @mysql_result($query, $row);
    return $query;
  }
  function num_rows($query) {
    $query = mysql_num_rows($query);
    return $query;
  }
  function num_fields($query) {
    return mysql_num_fields($query);
  }
  function free_result($query) {
    return mysql_free_result($query);
  }
  function fetch_fields($query) {
    return mysql_fetch_field($query);
  }
  function version($link) {
    return mysql_get_server_info($link);
  }
  function close($link) {
    return mysql_close($link);
  }
}
/* 测试例子 //
* $dbarray[] = array('localhost','bevin','password','test');
* $dbarray[] = array('ilaopo.net','root','password','test');
* $dbarray[] = array('192.168.1.77','cxh','password','test');
* $newdb = new mysqldb($dbarray,'utf8');
* $array = array('name' => date("Y-m-d H:i:s"));
* $id = $newdb->insert("test",$array);
* $result = $newdb->fetch_page("select * from test order by id desc",'10');
* print_r($result);
* $id = $newdb->insert("test",$array);
* echo $id;
*/

PS:为便于读者阅读源码,上述代码使用在线工具http://tools.3water.com/code/3water_php_format进行了格式化处理。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
PHP 编写的 25个游戏脚本
May 11 PHP
php修改时间格式的代码
May 29 PHP
php+js实现图片的上传、裁剪、预览、提交示例
Aug 27 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
Jan 30 PHP
php防止伪造的数据从URL提交方法
Jun 27 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
Jul 04 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 #PHP
PHP实现多级分类生成树的方法示例
Feb 07 #PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 #PHP
php实现图片按比例截取的方法
Feb 06 #PHP
php实现的中文分词类完整实例
Feb 06 #PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 #PHP
php使用变量动态创建类的对象用法示例
Feb 06 #PHP
You might like
也谈 PHP 和 MYSQL
2006/10/09 PHP
COM in PHP (winows only)
2006/10/09 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
javascript工厂方式定义对象
2014/12/26 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
python计算auc的方法
2020/09/09 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
招商专员岗位职责
2014/02/08 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
企业总经理任命书
2014/06/05 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript
python绘图subplots函数使用模板的示例代码
2021/04/30 Python