php实现的mysqldb读写分离操作类示例
本文实例讲述了php实现的mysqldb读写分离操作类。分享给大家供大家参考,具体如下:
/**
*phpMysqlDB读写分离类
*-----------------------------------------------------
*$Source:http://code.ilaopo.net/php.class.mysqldb$
*$Author:BevinChen$
*$Email:bevin#lifa8.cn$
*$Date:2009-10-10$
*-----------------------------------------------------
*/
classmysqldb{
var$querynum=0;
var$linkr,$linkw,$charset,$pconnect,$dbconfig;
function__constructor($dbarray){
$this->mysqldb($dbarray);
}
functionmysqldb($dbarray,$dbcharset='utf8',$pcontent=0){
if(!is_array($dbarray[0])){
echo"数据库参数错误";
returnfalse;
}
$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;
}
}
functionconnect($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("SETcharacter_set_connection=".$this->charset.",character_set_results=".$this->charset.",character_set_client=binary",$link);
}
if($this->version($link)>'5.0.1'){
@mysql_query("SETsql_mode=''",$link);
}
}
if($dbname){
@mysql_select_db($dbname,$link);
}
//print_r($link);
return$link;
}else{
returnfalse;
}
}
functionconnectM(){
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>";
}
functionconnectS(){
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;
}
}
//dbread
functionquery($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;
}
functionfetch_array($query,$result_type=MYSQL_ASSOC){
return@mysql_fetch_array($query,$result_type);
}
functionfetch_row($query){
$query=mysql_fetch_row($query);
return$query;
}
functionfetch_One($sql){
$query=$this->query($sql);
return$this->fetch_row($query);
}
/*获取分页方法*/
functionfetch_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;
}
//dbwrite
functionqueryw($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;
}
functionupdate($table,$where,$array){
$whereset=$set=$dot='';
foreach($arrayas$key=>$value){
$set.=$dot."`$key`='$value'";
$dot=',';
}
$whereset=$dot='';
foreach($whereas$k=>$v){
$whereset.=$dot."`$k`='$v'";
$dot='and';
}
$sql="update$tableset$setwhere$whereset";
return$this->queryw($sql);
}
functioninsert($table,$array){
$col=$v=$dot='';
foreach($arrayas$key=>$value){
$v.=$dot."'$value'";
$col.=$dot."`$key`";
$dot=',';
}
$sql="insertinto$table($col)values($v)";
if($this->queryw($sql)){
return$this->insert_id();
}else{
returnfalse;
}
}
functioninsert_id(){
return($id=mysql_insert_id($this->linkw))>=0?$id:$this->result($this->queryw("SELECTlast_insert_id()"),0);
}
//dbother
functionaffected_rows($link){
returnmysql_affected_rows($link);
}
functionerror($link){
return(($link)?mysql_error($link):mysql_error());
}
functionerrno($link){
returnintval(($link)?mysql_errno($link):mysql_errno());
}
functionresult($query,$row){
$query=@mysql_result($query,$row);
return$query;
}
functionnum_rows($query){
$query=mysql_num_rows($query);
return$query;
}
functionnum_fields($query){
returnmysql_num_fields($query);
}
functionfree_result($query){
returnmysql_free_result($query);
}
functionfetch_fields($query){
returnmysql_fetch_field($query);
}
functionversion($link){
returnmysql_get_server_info($link);
}
functionclose($link){
returnmysql_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=newmysqldb($dbarray,'utf8');
*$array=array('name'=>date("Y-m-dH:i:s"));
*$id=$newdb->insert("test",$array);
*$result=$newdb->fetch_page("select*fromtestorderbyiddesc",'10');
*print_r($result);
*$id=$newdb->insert("test",$array);
*echo$id;
*/
PS:为便于读者阅读源码,上述代码使用在线工具http://tools.jb51.net/code/jb51_php_format进行了格式化处理。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+mysql数据库操作入门教程》、《php+mysqli数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP网络编程技巧总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。