`

[原创]构建支持Master/Slave读写分离的数据库操作类

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>


一般对于访问量比较大的网站来说,采用基本的MySQL Master/Slave 结构是很正常,而且一般都是一台Master,多台Slave的情况,但是一般在进行这个访问的时候问题比较多,因为读写操作必须分离,所以今天没事就构造了这个数据库操作类。

数据库操作类基本特点:
1. 支持一台Master,多台Slave的情况,所有SQL能够强制调用Master来处理
2. 能够自动识别是写入还是读取操作,然后自动连接到需要的Master/Slave服务器。 操作过程中能够自动识别,如果没有Slave,则所有操作都是指向Master的,如果当前连接的Slave无法工作则自动连接其他Slave。对于Slave读取数据采用随机挑选Slave服务器的方式来读取数据
3. 在同一个PHP程序中能够重用连接,不会重复去连接数据库,减少因为反复连接带来的资源消耗

缺点:
1. 对于Slave是采取随机选择Slave来进行读取数据,所以不是真正意义上的负载均衡
2. 每次初始化都是连接好所有的数据库,比较浪费连接资源和时间。 在多个PHP程序中无法保持数据库连接,每次启动都需要连接到远程数据库,浪费了很多连接处理的时间,但是这个跟PHP是脚本程序有关。
3. 无法支持多个Master的情况,同时可定制性比较差,很多东西都是固定的,必须按照固有模式来执行查询

相关:
代码中注释不是很全,部分注释而且不一定正确,所以如果自己使用,最好进行二次修改。
本数据库类参考了我之前写的《简单快速有趣的MySQL数据库操作类:SimpleDB》,可以对照着看。
(类库中的接口我大部分都经过了测试,都正常使用,如果发现不正常或者有更好的想法,请留言)


文件:db_common.class.php

php
//----------------------------------------------------
//Master/Slave数据库读写分开操作类
//
//作者:heiyeluren<http:><br>//时间:2007-7-30<br>//描述:支持所有写操作在一台Master执行,所有读操作在<br>//Slave执行,并且能够支持多台Slave主机<br>//----------------------------------------------------</http:>



/**
*常量定义
*/
define("_DB_INSERT",1);
define("_DB_UPDATE",2);


/**
*DBCommonclass
*
*描述:能够分别处理一台Master写操作,多台Slave读操作
*/
classDBCommon
{
/**
*数据库配置信息
*/
var$wdbConf=array();
var$rdbConf=array();
/**
*Master数据库连接
*/
var$wdbConn=null;
/**
*Slave数据库连接
*/
var$rdbConn=array();
/**
*数据库结果
*/
var$dbResult;
/**
*数据库查询结果集
*/
var$dbRecord;

/**
*SQL语句
*/
var$dbSql;
/**
*数据库编码
*/
var$dbCharset="UTF8";
/**
*数据库版本
*/
var$dbVersion="4.1";


/**
*初始化的时候是否要连接到数据库
*/
var$isInitConn=false;
/**
*是否要设置字符集
*/
var$isCharset=true;
/**
*数据库结果集提取方式
*/
var$fetchMode=MYSQL_ASSOC;
/**
*执行中发生错误是否记录日志
*/
var$isLog=true;
/**
*是否查询出错的时候终止脚本执行
*/
var$isExit=false;



//------------------------
//
//基础的DB操作
//
//------------------------


/**
*构造函数
*
*传递配置信息,配置信息数组结构:
*$masterConf=array(
*"host"=>Master数据库主机地址
*"user"=>登录用户名
*"pwd"=>登录密码
*"db"=>默认连接的数据库
*);
*$slaveConf=array(
*"host"=>Slave1数据库主机地址|Slave2数据库主机地址|...
*"user"=>登录用户名
*"pwd"=>登录密码
*"db"=>默认连接的数据库
*);
*/
functionDBCommon($masterConf,$slaveConf=array()){
//构造数据库配置信息
if(is_array($masterConf)&&!empty($masterConf)){
$this->wdbConf=$masterConf;
}
if(!is_array($slaveConf)||empty($slaveConf)){
$this->rdbConf=$masterConf;
}
else{
$this->rdbConf=$slaveConf;
}
//初始化连接(一般不推荐)
if($this->isInitConn){
$this->getDbWriteConn();
$this->getDbReadConn();
}
}

/**
*获取Master的写数据连接
*/
functiongetDbWriteConn(){
//判断是否已经连接
if($this->wdbConn&&is_resource($this->wdbConn)){
return$this->wdbConn;
}
//没有连接则自行处理
$db=$this->connect($this->wdbConf['host'],$this->wdbConf['user'],$this->wdbConf['pwd'],$this->wdbConf['db']);
if(!$db||!is_resource($db)){
returnfalse;
}
$this->wdbConn=$db;
return$this->wdbConn;
}

/**
*获取Slave的读数据连接
*/
functiongetDbReadConn(){
//如果有可用的Slave连接,随机挑选一台Slave
if(is_array($this->rdbConn)&&!empty($this->rdbConn)){
$key=array_rand($this->rdbConn);
if(isset($this->rdbConn[$key])&&is_resource($this->rdbConn[$key])){
return$this->rdbConn[$key];
}
}
//连接到所有Slave数据库,如果没有可用的Slave机则调用Master
$arrHost=explode("|",$this->rdbConf['host']);
if(!is_array($arrHost)||empty($arrHost)){
return$this->getDbWriteConn();
}
$this->rdbConn=array();
foreach($arrHostas$tmpHost){
$db=$this->connect($tmpHost,$this->rdbConf['user'],$this->rdbConf['pwd'],$this->rdbConf['db']);
if($db&&is_resource($db)){
$this->rdbConn[]=$db;
}
}
//如果没有一台可用的Slave则调用Master
if(!is_array($this->rdbConn)||empty($this->rdbConn)){
$this->errorLog("Notavailabilityslavedbconnection,callmasterdbconnection");
return$this->getDbWriteConn();
}
//随机在已连接的Slave机中选择一台
$key=array_rand($this->rdbConn);
if(isset($this->rdbConn[$key])&&is_resource($this->rdbConn[$key])){
return$this->rdbConn[$key];
}
//如果选择的slave机器是无效的,并且可用的slave机器大于一台则循环遍历所有能用的slave机器
if(count($this->rdbConn)>1){
foreach($this->rdbConnas$conn){
if(is_resource($conn)){
return$conn;
}
}
}
//如果没有可用的Slave连接,则继续使用Master连接
return$this->getDbWriteConn();
}

/**
*连接到MySQL数据库公共方法
*/
functionconnect($dbHost,$dbUser,$dbPasswd,$dbDatabase){
//连接数据库主机
$db=mysql_connect($dbHost,$dbUser,$dbPasswd);
if(!$db){
$this->errorLog("Mysqlconnect".$dbHost."failed");
returnfalse;
}
//选定数据库
if(!mysql_select_db($dbDatabase,$db)){
$this->errorLog("selectdb$dbDatabasefailed",$db);
returnfalse;
}
//设置字符集
if($this->isCharset){
if($this->dbVersion==''){
$res=mysql_query("SELECTVERSION()");
$this->dbVersion=mysql_result($res,0);
}

if($this->dbCharset!=''&&preg_match("/^(5.|4.1)/",$this->dbVersion)){
if(mysql_query("SETNAMES'".$this->dbCharset."'",$db)===false){
$this->errorLog("Setdb_host'$dbHost'charset=".$this->dbCharset."failed.",$db);
returnfalse;
}
}
}
return$db;
}

/**
*关闭数据库连接
*/
functiondisconnect($dbConn=null,$closeAll=false){
//关闭指定数据库连接
if($dbConn&&is_resource($dbConn)){
mysql_close($dbConn);
$dbConn=null;
}
//关闭所有数据库连接
if($closeAll){
if($this->rdbConn&&is_resource($this->rdbConn)){
mysql_close($this->rdbConn);
$this->rdbConn=null;
}
if(is_array($this->rdbConn)&&!empty($this->rdbConn)){
foreach($this->rdbConnas$conn){
if($conn&&is_resource($conn)){
mysql_close($conn);
}
}
$this->rdbConn=array();
}
}
returntrue;
}

/**
*选择数据库
*/
functionselectDb($dbName,$dbConn=null){
//重新选择一个连接的数据库
if($dbConn&&is_resource($dbConn)){
if(!mysql_select_db($dbName,$dbConn)){
$this->errorLog("Selectdatabase:$dbNamefailed.",$dbConn);
returnfalse;
}
returntrue;
}
//重新选择所有连接的数据库
if($this->wdbConn&&is_resource($this->wdbConn)){
if(!mysql_select_db($dbName,$this->wdbConn)){
$this->errorLog("Selectdatabase:$dbNamefailed.",$this->wdbConn);
returnfalse;
}
}
if(is_array($this->rdbConn&&!empty($this->rdbConn))){
foreach($this->rdbConnas$conn){
if($conn&&is_resource($conn)){
if(!mysql_select_db($dbName,$conn)){
$this->errorLog("Selectdatabase:$dbNamefailed.",$conn);
returnfalse;
}
}
}
}
returntrue;
}

/**
*执行SQL语句(底层操作)
*/
functionquery($sql,$isMaster=false){
if(trim($sql)==""){
$this->errorLog("Sqlqueryisempty.");
returnfalse;
}
//获取执行SQL的数据库连接
if(!$isMaster){
$optType=trim(strtolower(array_shift(explode("",ltrim($sql)))));
}
if($isMaster||$optType!="select"){
$dbConn=$this->getDbWriteConn();
}
else{
$dbConn=$this->getDbReadConn();
}
if(!$dbConn||!is_resource($dbConn)){
$this->errorLog("Notavailabilitydbconnection.QuerySQL:".$sql);
if($this->isExit){
exit;
}
returnfalse;
}
//执行查询
$this->dbSql=$sql;
$this->dbResult=null;
$this->dbResult=@mysql_query($sql,$dbConn);
if($this->dbResult===false){
$this->errorLog("Querysqlfailed.SQL:".$sql,$dbConn);
if($this->isExit){
exit;
}
returnfalse;
}
returntrue;
}

/**
*错误日志
*/
functionerrorLog($msg='',$conn=null){
if(!$this->isLog){
return;
}
if($msg==''&&!$conn){
returnfalse;
}
$log="MySQLError:$msg";
if($conn&&is_resource($conn)){
$log.="mysql_msg:".mysql_error($conn);
}
$log.="[".date("Y-m-dH:i:s")."]";
error_log($log);
returntrue;
}




//--------------------------
//
//数据获取接口
//
//--------------------------

/**
*获取SQL执行的全部结果集(二维数组)
*
*@paramstring$sql需要执行查询的SQL语句
*@return成功返回查询结果的二维数组,失败返回false
*/
functiongetAll($sql,$isMaster=false){
if(!$this->query($sql,$isMaster)){
returnfalse;
}
$this->dbRecord=array();
while($row=@mysql_fetch_array($this->dbResult,$this->fetchMode)){
$this->dbRecord[]=$row;
}
@
mysql_free_result($this->dbResult);
if(!is_array($this->dbRecord)||empty($this->dbRecord)){
returnfalse;
}
return$this->dbRecord;
}

/**
*获取单行记录(一维数组)
*
*@paramstring$sql需要执行查询的SQL语句
*@return成功返回结果记录的一维数组,失败返回false
*/
functiongetRow($sql,$isMaster=false){
if(!$this->query($sql,$isMaster)){
returnfalse;
}
$this->dbRecord=array();
$this->dbRecord=@mysql_fetch_array($this->dbResult,$this->fetchMode);
@
mysql_free_result($this->dbResult);
if(!is_array($this->dbRecord)||empty($this->dbRecord)){
returnfalse;
}
return$this->dbRecord;
}

/**
*获取一列数据(一维数组)
*
*@paramstring$sql需要获取的字符串
*@paramstring$field需要获取的列,如果不指定,默认是第一列
*@return成功返回提取的结果记录的一维数组,失败返回false
*/
functiongetCol($sql,$field='',$isMaster=false){
if(!$this->query($sql,$isMaster)){
returnfalse;
}
$this->dbRecord=array();
while($row=@mysql_fetch_array($this->dbResult,$this->fetchMode)){
if(trim($field)==''){
$this->dbRecord[]=current($row);
}
else{
$this->dbRecord[]=$row[$field];
}
}
@
mysql_free_result($this->dbResult);
if(!is_array($this->dbRecord)||empty($this->dbRecord)){
returnfalse;
}
return$this->dbRecord;
}

/**
*获取一个数据(当条数组)
*
*@paramstring$sql需要执行查询的SQL
*@return成功返回获取的一个数据,失败返回false
*/
functiongetOne($sql,$field='',$isMaster=false){
if(!$this->query($sql,$isMaster)){
returnfalse;
}
$this->dbRecord=array();
$row=@mysql_fetch_array($this->dbResult,$this->fetchMode);
@
mysql_free_result($this->dbResult);
if(!is_array($row)||empty($row)){
returnfalse;
}
if(trim($field)!=''){
$this->dbRecord=$row[$field];
}
else{
$this->dbRecord=current($row);
}
return$this->dbRecord;
}

/**
*获取指定各种条件的记录
*
*@paramstring$table表名(访问的数据表)
*@paramstring$field字段(要获取的字段)
*@paramstring$where条件(获取记录的条件语句,不包括WHERE,默认为空)
*@paramstring$order排序(按照什么字段排序,不包括ORDERBY,默认为空)
*@paramstring$limit限制记录(需要提取多少记录,不包括LIMIT,默认为空)
*@parambool$single是否只是取单条记录(是调用getRow还是getAll,默认是false,即调用getAll)
*@return成功返回记录结果集的数组,失败返回false
*/
functiongetRecord($table,$field='*',$where='',$order='',$limit='',$single=false,$isMaster=false){
$sql="SELECT$fieldFROM$table";
$sql.=trim($where)!=''?"WHERE$where":$where;
$sql.=trim($order)!=''?"ORDERBY$order":$order;
$sql.=trim($limit)!=''?"LIMIT$limit":$limit;
if($single){
return$this->getRow($sql,$isMaster);
}
return$this->getAll($sql,$isMaster);
}

/**
*获取指点各种条件的记录(跟getRecored类似)
*
*@paramstring$table表名(访问的数据表)
*@paramstring$field字段(要获取的字段)
*@paramstring$where条件(获取记录的条件语句,不包括WHERE,默认为空)
*@paramarray$order_arr排序数组(格式类似于:array('id'=>true),那么就是按照ID为顺序排序,array('id'=>false),就是按照ID逆序排序)
*@paramarray$limit_arr提取数据的限制数组()
*@returnunknown
*/
functiongetRecordByWhere($table,$field='*',$where='',$arrOrder=array(),$arrLimit=array(),$isMaster=false){
$sql="SELECT$fieldFROM$table";
$sql.=trim($where)!=''?"WHERE$where":$where;
if(is_array($arrOrder)&&!empty($arrOrder)){
$arrKey=key($arrOrder);
$sql.="ORDERBY$arrKey".($arrOrder[$arrKey]?"ASC":"DESC");
}
if(is_array($arrLimit)&&!empty($arrLimit)){
$startPos=intval(array_shift($arrLimit));
$offset=intval(array_shift($arrLimit));
$sql.="LIMIT$startPos,$offset";
}
return$this->getAll($sql,$isMaster);
}

/**
*获取指定条数的记录
*
*@paramstring$table表名
*@paramint$startPos开始记录
*@paramint$offset偏移量
*@paramstring$field字段名
*@paramstring$where条件(获取记录的条件语句,不包括WHERE,默认为空)
*@paramstring$order排序(按照什么字段排序,不包括ORDERBY,默认为空)
*@return成功返回包含记录的二维数组,失败返回false
*/
functiongetRecordByLimit($table,$startPos,$offset,$field='*',$where='',$oder='',$isMaster=false){
$sql="SELECT$fieldFROM$table";
$sql.=trim($where)!=''?"WHERE$where":$where;
$sql.=trim($order)!=''?"ORDERBY$order":$order;
$sql.="LIMIT$startPos,$offset";
return$this->getAll($sql,$isMaster);
}

/**
*获取排序记录
*
*@paramstring$table表名
*@paramstring$orderField需要排序的字段(比如id)
*@paramstring$orderMethod排序的方式(1为顺序,2为逆序,默认是1)
*@paramstring$field需要提取的字段(默认是*,就是所有字段)
*@paramstring$where条件(获取记录的条件语句,不包括WHERE,默认为空)
*@paramstring$limit限制记录(需要提取多少记录,不包括LIMIT,默认为空)
*@return成功返回记录的二维数组,失败返回false
*/
functiongetRecordByOrder($table,$orderField,$orderMethod=1,$field='*',$where='',$limit='',$isMaster=false){
//$order_method的值为1则为顺序,$order_method值为2则2则是逆序排列
$sql="SELECT$fieldFROM$table";
$sql.=trim($where)!=''?"WHERE$where":$where;
$sql.="ORDERBY$orderField".($orderMethod==1?"ASC":"DESC");
$sql.=trim($limit)!=''?"LIMIT$limit":$limit;
return$this->getAll($sql,$isMaster);
}

/**
*分页查询(限制查询的记录条数)
*
*@paramstring$sql需要查询的SQL语句
*@paramint$startPos开始记录的条数
*@paramint$offset每次的偏移量,需要获取多少条
*@return成功返回获取结果记录的二维数组,失败返回false
*/
functionlimitQuery($sql,$startPos,$offset,$isMaster=false){
$start_pos=intval($startPos);
$offset=intval($offset);
$sql=$sql."LIMIT$startPos,$offset";
return$this->getAll($sql,$isMaster);
}


//--------------------------
//
//无数据返回操作
//
//--------------------------

/**
*执行执行非Select查询操作
*
*@paramstring$sql查询SQL语句
*@returnbool成功执行返回true,失败返回false
*/
functionexecute($sql,$isMaster=false){
if(!$this->query($sql,$isMaster)){
returnfalse;
}
return true;
//
$count=@mysql_affected_rows($this->dbLink);
//
if($count0){
//
returnfalse;
//}
//
returntrue;
}

/**
*自动执行操作(针对Insert/Update操作)
*
*@paramstring$table表名
*@paramarray$field_array字段数组(数组中的键相当于字段名,数组值相当于值,类似array('id'=>100,'user'=>'heiyeluren')
*@paramint$mode执行操作的模式(是插入还是更新操作,1是插入操作Insert,2是更新操作Update)
*@paramstring$where如果是更新操作,可以添加WHERE的条件
*@returnbool执行成功返回true,失败返回false
*/
functionautoExecute($table,$arrField,$mode,$where='',$isMaster=false){
if($table==''||!is_array($arrField)||empty($arrField)){
returnfalse;
}
//$mode为1是插入操作(Insert),$mode为2是更新操作
if($mode==1){
$sql="INSERTINTO`$table`SET";
}
elseif($mode==2){
$sql="UPDATE`$table`SET";
}
else{
$this->errorLog("Operatetype'$mode'iserror,incallDB::autoExecuteprocesstable$table.");
returnfalse;
}
foreach($arrFieldas$key=>$value){
$sql.="`$key`='$value',";
}
$sql=rtrim($sql,',');
if($mode==2&&$where!=''){
$sql.="WHERE$where";
}
return$this->execute($sql,$isMaster);
}

/**
*锁表表
*
*@paramstring$tblName需要锁定表的名称
*@returnmixed成功返回执行结果,失败返回错误对象
*/
functionlockTable($tblName){
return$this->query("LOCKTABLES$tblName",true);
}

/**
*对锁定表进行解锁
*
*@paramstring$tblName需要锁定表的名称
*@returnmixed成功返回执行结果,失败返回错误对象
*/
functionunlockTable($tblName){
return$this->query("UNLOCKTABLES$tblName",true);
}

/**
*设置自动提交模块的方式(针对InnoDB存储引擎)
*一般如果是不需要使用事务模式,建议自动提交为1,这样能够提高InnoDB存储引擎的执行效率,如果是事务模式,那么就使用自动提交为0
*
*@parambool$autoCommit如果是true则是自动提交,每次输入SQL之后都自动执行,缺省为false
*@returnmixed成功返回true,失败返回错误对象
*/
functionsetAutoCommit($autoCommit=false){
$autoCommit=($autoCommit?1:0);
return$this->query("SETAUTOCOMMIT=$autoCommit",true);
}

/**
*开始一个事务过程(针对InnoDB引擎,兼容使用BEGIN和STARTTRANSACTION)
*
*@returnmixed成功返回true,失败返回错误对象
*/
functionstartTransaction(){
if(!$this->query("BEGIN")){
return$this->query("STARTTRANSACTION",true);
}
}

/**
*提交一个事务(针对InnoDB存储引擎)
*
*@returnmixed成功返回true,失败返回错误对象
*/
functioncommit(){
if(!$this->query("COMMIT",true)){
returnfalse;
}
return$this->setAutoCommit(true);
}

/**
*发生错误,会滚一个事务(针对InnoDB存储引擎)
*
*@returnmixed成功返回true,失败返回错误对象
*/

functionrollback(){
if(!$this->query("ROLLBACK",true)){
returnfalse;
}
return$this->setAutoCommit(true);
}


//--------------------------
//
//其他数据相关操作
//
//--------------------------

/**
*获取最后一次查询的SQL语句
*
*@returnstring返回最后一次查询的SQL语句
*/
functiongetLastSql(){
return$this->dbSql;
}

/**
*获取上次插入操作的的ID
*
*@returnint如果没有连接或者查询失败,返回0,成功返回ID
*/
functiongetLastId(){
$dbConn=$this->getDbWriteConn();
if(($lastId=mysql_insert_id($dbConn))>0){
return$lastId;
}
return$this->getOne("SELECTLAST_INSERT_ID()",'',true);
}

/**
*获取记录集里面的记录条数(用于Select操作)
*
*@returnint如果上一次无结果集或者记录结果集为空,返回0,否则返回结果集数量
*/
functiongetNumRows($res=null){
if(!$res||!is_resource($res)){
$res=$this->dbResult;
}
returnmysql_num_rows($res);
}

/**
*获取受到影响的记录数量(用于Update/Delete/Insert操作)
*
*@returnint如果没有连接或者影响记录为空,否则返回影响的行数量
*/
functiongetAffectedRows(){
$dbConn=$this->getDbWriteConn();
if(($affetedRows=mysql_affected_rows($dbConn))0){
return$affetedRows;
}
return$this->getOne("SELECTROW_COUNT()","",true);
}

}

?>

测试代码文件:

php
/**
*测试代码
*/

//构造数据库配置信息
$masterConf=array("host"=>"localhost","user"=>"root","pwd"=>"","db"=>"db");
$slaveConf=array("host"=>"localhost|localhost","user"=>"root","pwd"=>"","db"=>"db");

//初始化类
$db=newDBCommon($masterConf,$slaveConf);
print_r($db);

//创建表
$db->execute("CREATETABLE`tbl1`(`id`INTEGER(11)NOTNULLAUTO_INCREMENT,`name`CHAR(32)DEFAULTNULL,`email`CHAR(64)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=MyISAM;");

//插入数据
$arrInsert=array("name"=>"heiyeluren","email"=>"heiyeluren@125.com");
$db->autoExecute("tbl1",$arrInsert,_DB_INSERT);
$arrInsert=array("name"=>"heiyeluren2","email"=>heiyeluren@128.com);
$db->autoExecute("tbl1",$arrInsert,_DB_INSERT);
$s=$db->getAffectedRows();
echo$s;

//获取数据
$s=$db->getAll("select*fromtbl1");
print_r($s);

//选择其他数据库
$db->selectDb("test");

//关闭所有连接
$db->disconnect(null,true);

?>

测试输出结果:

DBCommonObject
(
[wdbConf]=>Array
(
[host]=>localhost
[user]=>root
[pwd]=>
[db]=>db
)

[rdbConf]=>Array
(
[host]=>localhost|localhost
[user]=>root
[pwd]=>
[db]=>db
)

[wdbConn]=>
[rdbConn]=>Array
(
)

[dbResult]=>
[dbRecord]=>
[dbSql]=>
[dbCharset]=>UTF8
[dbVersion]=>4.1
[isInitConn]=>
[isCharset]=>1
[fetchMode]=>1
[isLog]=>1
[isExit]=>
)
1
Array
(
[0]=>Array
(
[id]=>1
[name]=>heiyeluren
[email]=>heiyeluren@125.com
)

[1]=>Array
(
[id]=>2
[name]=>heiyeluren2
[email]=>heiyeluren@
)

)
128.com

【其他数据操作方法使用代码】

/**
*示例代码
*/

//构造数据库配置信息
$masterConf=array(
"host"=>"192.168.0.1",
"user"=>"root",
"pwd"=>"",
"db"=>"db"
);
$slaveConf=array(
"host"=>"192.168.0.3|192.168.0.2",
"user"=>"root",
"pwd"=>"",
"db"=>"db"
);

//初始化类
$db=newDBCommon($masterConf,$slaveConf);

//创建表
$db->execute("CREATETABLE`tbl1`(`id`INTEGER(11)NOTNULLAUTO_INCREMENT,`name`CHAR(32)DEFAULTNULL,`email`CHAR(64)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=MyISAM;");

//插入数据
$arrInsert=array(
"name"=>"heiyeluren",
"email"=>"heiyeluren@125.com"
);
$db->autoExecute("tbl1",$arrInsert,_DB_INSERT);

//更新数据
$arrUpdate=array(
"name"=>"heiyeluren2",
"email"=>"heiyeluren@1111.com"
);
$db->autoExecute("tbl1",$arrUpdate,_DB_UPDATE,"id=1");

//获取操作影响的行
$s=$db->getAffectedRows();

//获取数据

//获取所有数据(二维数组)

$s=$db->getAll("select*fromtbl1");
//获取一行数据(一维数组)
$s=$db->getRow("select*fromtbl1whereid=1");
//获取一列数据(一维数组)
$s=$db->getCol("selectidfromtbl1wherenameLIKE'%heiyeluren%'");
//获取一个数据(直接返回数据)
$s=$db->getOne("selectcount(1)fromtbl1");


//删除数据
$db->execute("deletefromtbl1whereid=1");

//选择其他数据库
$db->selectDb("test");

//关闭所有连接
$db->disconnect(null,true);




分享到:
评论

相关推荐

    PHP实现操作redis的封装类完整实例

    * Redis 操作,支持 Master/Slave 的负载集群 * * @author jackluo */ class RedisCluster{ // 是否使用 M/S 的读写集群方案 private $_isUseCluster = false; // Slave 句柄标记 private $_sn = 0; // ...

    单点登录源码

    Spring+SpringMVC+Mybatis框架集成公共模块,包括公共配置、MybatisGenerator扩展插件、通用BaseService、工具类等。 &gt; zheng-admin 基于bootstrap实现的响应式Material Design风格的通用后台管理系统,`zheng`...

    Redis集群详解

    主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。 其中主从复制有如下特点: * 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库 ...

    java开源包1

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包11

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包2

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包3

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包6

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包5

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包10

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包4

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包8

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包7

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    java开源包9

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java开源包101

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    Java资源包01

    Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    计算机应用技术(实用手册)

    请确认您的显示卡可以支持您所选择的模式,一般用默认的就可以。 4.Integrated Peripherals(集成设备设定) 这个是管理计算机的主板集成设备和端口的选项,具体项目因为主板不同,所以其中的设置会有所不同。 ...

Global site tag (gtag.js) - Google Analytics