帮一个朋友维护CMS,具体的还要有一键远程匹配数据库的功能。
当时给的需求是:
1.能够一键比对远程服务器上的数据库的表和字段。
2.比对完成后,如果发现某表或者某字段缺失,那么就自动生成sql语句,来重新生成一个“补丁”
开始以为很简单,其实还蛮复杂的。
一开始就要进更新服务器(主服务器),感觉有点主从结构,读写分离的味道,233333;
分配好一个专门用来远程比对的mysql用户,并且设置权限为select.
然后再在所有的“从”服务器的代码里面写上这个用户的帐号密码。
比对的代码如下:
//远程对比表的情况
function compare(){
//链接本地数据库
mysql_connect(C('DB_HOST'),C('DB_USER'),C('DB_PWD'));
mysql_select_db(C('DB_NAME')); //标准的数据库
$q = mysql_query("show tables");
while($s = mysql_fetch_array($q)){
$name = $s[0];
$q1 = mysql_query("desc $name");
while ($s1 = mysql_fetch_array($q1)) {
$a[$name][] =$s1[0];
}
}
mysql_close();
//链接远程数据库
mysql_connect('182.92.109.88','demoweidogs123','demoweidogs123');
mysql_select_db('demoweidogs123');//需要比较的数据库
$q2 = mysql_query("show tables");
while($s2 = mysql_fetch_array($q2)){
$name2= $s2[0];
$q3 = mysql_query("desc $name2");
while ($s3 = mysql_fetch_array($q3)) {
$aa[$name2][] =$s3[0];
}
}
mysql_close();
$f = $e = array();
$str = $fuhao ='';
foreach($a as $k=>$v){
if(!is_array($aa[$k])){
$e[] = $k;
}
else{
if(count($aa[$k]) <> count($v)){
foreach($v as $k1=>$v1){
if(!in_array($v1,$aa[$k])){
$f[$k][] = $v1;
}
}
}
}
}
然后可以得出结论是否缺少某个表或者某个字段。
至于后续的更新我们以后再写。