mysql数据库连接类程序代码,mysql读写分离类

ca88会员登录中心

<?php 

2、LAST_INSERT_ID不能发送到主服务器上, 226 行修改为下面的就可以了
elseif not is_insert_id and token.token_name == “TK_FUNCTION” then

 代码如下

       //数据库参数变量设定 
       //$dbhost:主机名 
       //$dbuser:连接帐户 
       //$dbpassword:连接密码 
       //$dbname:数据库名 
      //下面已我机子配置为例, 
      //请大家根据自己的数据库配置信息配置这个文件即可 
      //——————————————————————– 
       $dbhost=”localhost”; 
       $dbuser=”root”; 
       $dbpassword=”7529639″; 
       $dbname=”cr_download”; 
      //——————————————————————– 

注意问题:
1、proxy的读写分离机制是先把最初的几条查询发到master上建立连接,
当发送到master上的查询数超过连接池的最小值时开始把查询

ca88会员登录中心,function insert_id() {
return ($id = mysql_insert_id($this->link)) >= 0 ? $id :
$this->result($this->query(“select last_insert_id()”), 0);
}

       //创建数据库连接并选择相应数据库 
       function createcon(){ 
           mysql_connect($this->dbhost,$this->dbuser,$this->password); 
           mysql_query(“SET NAMES ‘GBK'”);//这是解决乱码的关键哦,LINUX下改为UTF8 
           mysql_select_db($this->dbname); 
       } 
    //执行SQL语句,并返回结果集 
       function fetch_array($sql){ 
           $result=mysql_query($sql); 
           return mysql_fetch_array($result); 
       } 
    //执行SQL语句 
    function query($sql){ 
        return mysql_query($sql); 
    } 
    //取得结果集数组 
    function loop_query($result){ 
        return mysql_fetch_array($result); 
    } 
    //关闭数据库连接 
    function close() { 
        return mysql_close(); 
    } 
   } 
?> 

复制代码代码示例:

function fetch_first($sql) {
$query = $this->query($sql);
return $this->fetch_array($query);
}

   ?> 

调用示例:
 

function fetch_row($query) {
$query = mysql_fetch_row($query);
return $query;
}

    include(‘inc/config.inc.php’);//包含数据库基本配置信息 
    include(‘inc/dbclass.php’);//包含数据库操作类 
   //以下以插入一条数据为例说明,其他操作用法相似 
   //———————————————————————————– 
   $db=new db;//从数据库操作类生成实例,OOP还是好啊 
   $db->mysql($dbhost,$dbuser,$dbpassword,$dbname);//调用连接参数函数 
   $db->createcon();//调用创建连接函数 
   //———————————————————————————– 
   //开始插入数据 
   //———————————————————————————– 
   $addsql=”insert into cr_userinfo values(0,’$username’,’$userpwd’,’$time’,50,1,’$userquestion’,’$useranswer’)”; 
   $db->query($addsql); 
   echo”<img src=images/pass.gif> <font color=red>恭喜您,注册成功!请点击<a href=login.php>这里</a>登录!</font>”; 
   $db->close();//关闭数据库连接  

4、 Lua 脚本能很好的控制连接和分布, 以及查询及返回的结果集.
使用Lua脚本时,必须使用 –proxy-lua-script 指定脚本的名称。
直到产生连接时才会读取脚本,也就是修改脚本后不用重新启动服务。
mysql-proxy –proxy-lua-script=rw-splitting.lua
–proxy-backend-addresses=192.168.18.110:3306
–proxy-read-only-backend-addresses=192.168.18.107:3306

}

?>

1.[mysqld]
2.skip-character-set-client-handshake

function fetch_all($sql, $id = ”) {
$arr = array();
$query = $this->query($sql);
while($data = $this->fetch_array($query)) {
$id ? $arr[$data[$id]] = $data : $arr[] = $data;
}
return $arr;
}

复制代码 代码如下:

附,php读写分离类
 

if($pconnect) {
if(!$this->link = mysql_pconnect($dbhost, $dbuser, $dbpw)) {
$this->halt(‘can not connect to mysql server’);
}
} else {
if(!$this->link = mysql_connect($dbhost, $dbuser, $dbpw)) {
$this->halt(‘can not connect to mysql server’);
}
}

复制代码 代码如下:

mysql-proxy \
–proxy-backend-addresses=narcissus:3306 \
–proxy-backend-addresses=nostromo:3306

function fetch_array($query, $result_type = mysql_assoc) {
return mysql_fetch_array($query, $result_type);
}

好了,看完这篇文章相信新手们可以很好的使用PHP对MYSQL进行基本的数据添加,删除等操作了,而且代码规范,易于维护。祝各位学习愉快,有不懂的就回帖留言,我会第一时间回复^_^。

<?php  
class mysql_rw_php {  
    //查询个数  
    var $querynum = 0;  
    //当前操作的数据库连接  
    var $link = null;  
    //字符集  
    var $charset;  
    //当前数据库  
    var $cur_db = ”;  
  
    //是否存在有效的只读数据库连接  
    var $ro_exist = false;  
    //只读数据库连接  
    var $link_ro = null;  
    //读写数据库连接  
    var $link_rw = null;  
  
    function mysql_rw_php(){  
    }  
  
    function connect($dbhost, $dbuser, $dbpw, $dbname = ”, $pconnect =
0, $halt = TRUE) {  
        if($pconnect) {  
            if(!$this->link =
@mysql_pconnect($dbhost,
$dbuser, $dbpw)) {  
                $halt && $this->halt(‘Can not connect to MySQL
server’);  
            }  
        } else {  
            if(!$this->link = @mysql_connect($dbhost, $dbuser,
$dbpw)) {  
                $halt && $this->halt(‘Can not connect to MySQL
server’);  
            }  
        }  
          
        //只读连接失败  
        if(!$this->link && !$halt) return false;  
          
        //未初始化rw时,第一个连接作为rw  
        if($this->link_rw == null)  
            $this->link_rw = $this->link;  
  
        if($this->version() > ‘4.1’) {  
            if($this->charset) {  
                @mysql_query(“SET
character_set_connection=$this->charset,
character_set_results=$this->charset,
character_set_client=binary”, $this->link);  
            }  
            if($this->version() > ‘5.0.1’) {  
                @mysql_query(“SET sql_mode=””, $this->link);  
            }  
        }  
        if($dbname) {  
            $this->select_db($dbname);  
        }  
    }  
  
    //连接一个只读的mysql数据库  
    function connect_ro($dbhost, $dbuser, $dbpw, $dbname = ”,
$pconnect = 0){  
        if($this->link_rw == null)  
            $this->link_rw = $this->link;  
        $this->link = null;  
        //不产生halt错误  
        $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect,
false);  
        if($this->link){  
            //连接成功  
            //echo “link ro sussess!<br>”;  
            $this->ro_exist = true;  
            $this->link_ro = $this->link;  
            if($this->cur_db){  
                //如果已经选择过数据库则需要操作一次  
                @mysql_select_db($this->cur_db,
$this->link_ro);  
            }  
        }else{  
            //连接失败  
            //echo “link ro failed!<br>”;  
            $this->link = &$this->link_rw;  
        }  
    }  
  
    //设置一系列只读数据库并且连接其中一个  
    function set_ro_list($ro_list){  
        if(is_array($ro_list)){  
            //随机选择其中一个  
            $link_ro = $ro_list[array_rand($ro_list)];  
            $this->connect_ro($link_ro[‘dbhost’],
$link_ro[‘dbuser’], $link_ro[‘dbpw’]);  
        }  
    }  
  
    function select_db($dbname) {  
        //同时操作两个数据库连接  
        $this->cur_db = $dbname;  
        if($this->ro_exist){  
            @mysql_select_db($dbname, $this->link_ro);  
        }  
        return @mysql_select_db($dbname, $this->link_rw);  
    }  
  
    function fetch_array($query, $result_type = MYSQL_ASSOC) {  
        return mysql_fetch_array($query, $result_type);  
    }  
  
    function fetch_one_array($sql, $type = ”) {  
        $qr = $this->query($sql, $type);  
        return $this->fetch_array($qr);  
    }  
  
    function query($sql, $type = ”) {  
        $this->link = &$this->link_rw;  
        //判断是否select语句  
        if($this->ro_exist && preg_match (“/^(\s*)select/i”,
$sql)){  
            $this->link = &$this->link_ro;  
        }  
        $func = $type == ‘UNBUFFERED’ &&
@function_exists(‘mysql_unbuffered_query’) ?  
            ‘mysql_unbuffered_query’ : ‘mysql_query’;  
        if(!($query = $func($sql, $this->link)) && $type != ‘SILENT’)
{  
            $this->halt(‘MySQL Query Error’, $sql);  
        }  
        $this->querynum++;  
        return $query;  
    }  
  
    function affected_rows() {  
        return mysql_affected_rows($this->link);  
    }  
  
    function error() {  
        return (($this->link) ? mysql_error($this->link) :
mysql_error());  
    }  
  
    function errno() {  
        return intval(($this->link) ? mysql_errno($this->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 insert_id() {  
        return ($id = mysql_insert_id($this->link)) >= 0 ? $id :
$this->result($this->query(“SELECT last_insert_id()”), 0);  
    }  
  
    function fetch_row($query) {  
        $query = mysql_fetch_row($query);  
        return $query;  
    }  
  
    function fetch_fields($query) {  
        return mysql_fetch_field($query);  
    }  
  
    function version() {  
        return mysql_get_server_info($this->link);  
    }  
  
    function close() {  
        return mysql_close($this->link);  
    }  
  
    function halt($message = ”, $sql = ”) {  
        $dberror = $this->error();  
        $dberrno = $this->errno();  
        echo “<div
style=\”position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB;padding:0.5em;\”>  
                <b>MySQL Error</b><br>  
                <b>Message</b>: $message<br>  
                <b>SQL</b>: $sql<br>  
                <b>Error</b>: $dberror<br>  
                <b>Errno.</b>: $dberrno<br>  
                </div>”;  
        exit();  
    }  
}
?>

function error() {
return (($this->link) ? mysql_error($this->link) :
mysql_error());
}

<?php 
//定义数据库操作类 
class db{ 
       //类属性定义 
       var $dbhost=”localhost”;//MYSQL主机 
       var $dbuser=”root”;//连接帐户 
       var $password=””;//连接密码 
       var $dbname=””;//数据库名 
      //变量引用 
       function mysql($dbhost,$dbuser,$password,$dbname){ 
           $this->dbhost=$dbhost; 
           $this->dbuser=$dbuser; 
           $this->password=$password; 
           $this->dbname=$dbname; 
       } 
    //创建MYSQL连接 
       function mycon(){ 
        @mysql_connect($this->dbhost,$this->dbuser,$this->password); 
    } 
    //选择相应的数据库 
    function selectdb(){ 
     @mysql_select_db($this->db); 
    } 

3、数据库读写分离,192.168.18.110负责写入,192.168.18.107负责读取数据,当然也可以再增加读取数据的服务器。
 

function version() {
return mysql_get_server_info($this->link);
}

很多朋友新学PHP也许在数据库方面会有点麻烦,尤其是MYSQL4.1.x以后会出现乱码问题。这里写个简单教程,希望对新手有点帮助。也许很多朋友之前是学ASP的(本人也是),有可能怀念ASP的set rs=adodb.recorset(我靠,太久没做ASP,后面的好像有点错,想不起来了!凑活着看吧!)然后就rs.open,rs.movenext………..可是PHPA是依靠很多数据库操作函数来控制,比如:mysql_connect();mysql_select_db();………..那如果页面多,难道要一个个的重复写这些函数???当然不用,现在给大家个数据库操作类,里面包含了大多数,数据库操作的方法,包含基本配置信息,以后大家需要调用数据库信息就直接包含这个页面就可以,下面给出代码及使用方法。
   首先需要两个页面1.config.inc.php代码: 
   

这种方式并不是读写分离。
mysql-proxy不能区分哪些是发往从服务器的,还需要自己用脚本控制,见第四种方式。

function num_rows($query) {
$query = mysql_num_rows($query);
return $query;
}

另一个就是数据库操作类页面了dbclass.php

2、连接多个数据库服务器,假如A and B.
第一个客户端连接到 A,第二个连接到 B。
如果有一台停止服务时,代理会自动检测到,有新连接时会自动连接到一台正常的数据库。
 

function connect($dbhost, $dbuser, $dbpw, $dbname = ”, $dbcharset = ”,
$pconnect = 0, $tablepre=”, $time = 0) {
$this->dbhost = $dbhost;
$this->dbuser = $dbuser;
$this->dbpw = $dbpw;
$this->dbname = $dbname;
$this->dbcharset = $dbcharset;
$this->pconnect = $pconnect;
$this->tablepre = $tablepre;
$this->time = $time;

<?php 

<?php  
/**************************************** 
*** mysql-rw-php version 0.1 
***  
***  
*** code modify from class_mysql.php (uchome) 
****************************************/  
  
require_once(‘mysql_rw_php.class.php’);  
  
//rw info  
$db_rw = array(  
    ‘dbhost’=>’www.jbxue.com’,  
    ‘dbuser’=>’jbxue’,  
    ‘dbpw’=>’www.jbxue.com’,  
    ‘dbname’=>’test’  
);  
  
$db_ro = array(  
    array(  
        ‘dbhost’=>’www.jbxue.com:4306’,  
        ‘dbuser’=>’jbxue’,  
        ‘dbpw’=>’www.jbxue.com’  
    )  
);  
  
$DB = new mysql_rw_php;  
  
//connect Master  
$DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw],
$db_rw[dbname]);  
  
//Method 1: connect one server  
$DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser],
$db_ro[0][dbpw]);  
  
//Method 2: connect one server from a list by rand  
$DB->set_ro_list($db_ro);  
  
//send to rw  
$sql = “insert into a set a=’test'”;  
$DB->query($sql);  
  
//send to ro  
$sql = “select * from a”;  
$qr = $DB->query($sql);  
while($row = $DB->fetch_array($qr)){  
    echo $row[a];  
}  
?>

class cls_mysql{
var $querynum = 0;
var $link;
var $histories;

复制代码 代码如下:

MySQL
Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。
对于应用而言,MySQL Proxy是完全透明的,应用则只需要连接到MySQL
Proxy的监听端口即可。
当然,这样proxy机器可能成为单点失效,可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数,就可以实现。

function cache_gc() {
$this->query(“delete from {$this->tablepre}sqlcaches where
expiry<$this->time”);
}

下面讲下用法:
如果一个页面要涉及数据库操作,请这样使用: 

3、使用默认的rw-splitting.lua时,会提示找不到proxy-command,我把mysql-proxy的路径设置为系统路径,然后在
share目录下运行就一切Ok了,在运行中输入cmd,然
后cd C:\tools\mysql-proxy\share。

var $goneaway = 5;

复制代码代码示例:

if($this->version() > ‘5.0.1’) {
mysql_query(“set sql_mode=””, $this->link);
}
}

除了PHP在代码里设置读写分离外,还可以在软件层次读写分离:

function errno() {
return intval(($this->link) ? mysql_errno($this->link) :
mysql_errno());
}

复制代码代码示例:

function free_result($query) {
return mysql_free_result($query);
}

复制代码代码示例:

function fetch_fields($query) {
return mysql_fetch_field($query);
}

典型配置案例:
1、最简单的,代理单个数据库服务器,通过4040端口访问mysql数据库。
mysql-proxy
–proxy-backend-addresses=192.168.18.110:3306

function affected_rows() {
return mysql_affected_rows($this->link);
}

4、字符乱码
通过proxy连上数据库之后,查到的字符串始终是乱码,即便手工执行了set
names ‘utf8′也没有效果。
解决办法,mysql server必须设置
 

function num_fields($query) {
return mysql_num_fields($query);
}

  1. init-connect=’SET NAMES utf8′
  2. default-character-set=utf8
    public function isReadOperation($sql) {  
        return
    preg_match(‘/^\s*(SELECT|SHOW|DESC|PRAGMA)\s+/i’,$sql);  

function result_first($sql) {
$query = $this->query($sql);
return $this->result($query, 0);
}

mysql-proxy \
–proxy-backend-addresses=192.168.18.110:3306 \
–proxy-read-only-backend-addresses=192.168.18.107:3306
 

var $dbhost;
var $dbuser;
var $dbpw;
var $dbcharset;
var $pconnect;
var $tablepre;
var $time;

function close() {
return mysql_close($this->link);
}

if($this->version() > ‘4.1’) {
if($dbcharset) {
mysql_query(“set character_set_connection=”.$dbcharset.”,
character_set_results=”.$dbcharset.”, character_set_client=binary”,
$this->link);
}

function result($query, $row) {
$query = @mysql_result($query, $row);
return $query;
}

function halt($message = ”, $sql = ”) {
$error = mysql_error();
$errorno = mysql_errno();
if($errorno == 2006 && $this->goneaway– > 0) {
$this->connect($this->dbhost, $this->dbuser, $this->dbpw,
$this->dbname, $this->dbcharset, $this->pconnect,
$this->tablepre, $this->time);
$this->query($sql);
} else {
$s = ‘<b>error:</b>’.$error.'<br />’;
$s .= ‘<b>errno:</b>’.$errorno.'<br />’;
$s .= ‘<b>sql:</b>:’.$sql;
exit($s);
}
}
}

if($dbname) {
mysql_select_db($dbname, $this->link);
}

function query($sql, $type = ”, $cachetime = false) {
$func = $type == ‘unbuffered’ &&
@function_exists(‘mysql_unbuffered_query’) ?
‘mysql_unbuffered_query’ : ‘mysql_query’;
if(!($query = $func($sql, $this->link)) && $type != ‘silent’) {
$this->halt(‘mysql query error’, $sql);
}
$this->querynum++;
$this->histories[] = $sql;
return $query;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图