版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1333626
背景:项目规划中,要求进行主从数据库的读写分离,其中对于主从数据库的创建和配置,网上有很充实的介绍,这里仅在配置成功的基础上进行代码端的判断实现。
1.ThinkPHP框架中,已经集成了主从数据库的操作,其中只需要对配置文件中的相应代码做修改即可。
具体的介绍可以参考官方开发文档的介绍.
2.如果使用原生语句进行开发,需要进行sql语句的判断,根据网上的一些介绍和参考,核心代码如下。
值得一提的是,此处使用了mysql_connect()连接,据官方解释,强烈建议使用mysqli或者pdo连接.
所以,可以自行改动呗...
3.解释好麻烦,粘贴示例代码,自行参考,欢迎指正...
<?php
header('Content-Type: text/html;charset = utf-8 ');
/**
* User: zhanghj
*/
define("DB_HOST_1","192.168.1.73");//请正确对应 IP 地址 用户名 密码 即可...
define("DB_USER_1","momomo");
define("DB_PWD_1","000000");
define("DB_HOST_2","192.168.1.74");
define("DB_USER_2","nonono");
define("DB_PWD_2","000000");
define("DB_DBNAME","minsheng");
define("DB_CHARSET","utf8");
/**
* 思路:根据传入的sql语句,判断是否为查询操作 此处使用 mysql
* @param $sql 执行的SQL语句
* @return resource
*/
function connectTo($sql){
$link = null;
$querystr = trim($sql);
$querystr = substr($querystr,0,6);
if($querystr != 'select')
{
//如果不是查询语句就连接主服务器
$link=@mysql_connect(DB_HOST_1,DB_USER_1,DB_PWD_1)
or die("主库连接失败Error:".mysql_errno().":".mysql_error());
print_r('主库连接成功');
}else{
//如果是查询语句就连接从服务器
$link=@mysql_connect(DB_HOST_2,DB_USER_2,DB_PWD_2)
or die("从库连接失败Error:".mysql_errno().":".mysql_error());
print_r('从库连接成功');
}
mysql_set_charset(DB_CHARSET);//mysql_query('set names utf8');
mysql_select_db(DB_DBNAME) or die("指定数据库打开失败");
return $link;
}
/**
* 完成记录插入的操作
* @param string $table
* @param array $array
* @return number
*/
function insert($table,$array){
$keys=join(",",array_keys($array));
$vals="'".join("','",array_values($array))."'";
$sql="insert {$table}($keys) values({$vals})";
$link = connectTo($sql);
mysql_query($sql);
$Tag_id = mysql_insert_id();
//根据需求 关闭连接
mysql_close($link);
return $Tag_id;
}
function getResultNum($sql){
$link = connectTo($sql);
$result=mysql_query($sql);
$Tag_num = mysql_num_rows($result);
//根据需求 关闭连接
mysql_close($link);
return $Tag_num;
}
/*使用提示:
运行SQL语句前,首先调用connectTo($sql)方法,进行数据库链接的选择
根据自己的项目需求,判断是否断开上述方法返回的连接
*/
//测试:
$data = array(
'user_name' => 'wo¥¥ 的名字',
'email' => '爱谁谁!别关心那么多,好嘛?'
);
echo '我在测试呢!';
$tag =insert('ms_users',$data);
echo $tag;
echo '<hr/>';
echo '<hr/>';
$res = getResultNum('select * from ms_users');
print_r($res);
4.执行代码,结果截图如下,其中第一张为初次运行的显示情况,第二张为刷新后的显示情况,跟数据表的字段限制有关,可自行检验。
5.补充使用mysqli面向对象思想的核心代码
/**
* 思路:根据传入的sql语句,判断是否为查询操作 此处使用 mysqli
* 前提是,开启mysqli的扩展功能
* @param $sql 执行的SQL语句
* @return resource
*/
function connectTo($sql){
$mysqli = null;
$querystr = trim($sql);
$querystr = substr($querystr,0,6);
//使用 mysqli 面向对象方式进行数据库的连接操作
if($querystr != 'select')
{
//如果不是查询语句就连接主服务器
//创建对象并打开连接,最后一个参数是选择的数据库名称
$mysqli = new mysqli(DB_HOST_1,DB_USER_1,DB_PWD_1,DB_DBNAME);
//检查连接是否成功
if (mysqli_connect_errno()){
die('主库连接失败Error:'). mysqli_connect_error();
}
print_r('主库连接成功');
}else{
//如果是查询语句就连接从服务器
$mysqli = new mysqli(DB_HOST_2,DB_USER_2,DB_PWD_2,DB_DBNAME);
//检查连接是否成功
if (mysqli_connect_errno()){
die('从库连接失败Error::'). mysqli_connect_error();
}
print_r('从库连接成功');
}
$mysqli->query("set names '".DB_CHARSET."'");
return $mysqli;
}