您的位置:首页 > 编程语言 > PHP开发

PHP脚本快速比较两个mysql表结构的差异

2015-12-03 17:17 741 查看
事情的开头总是有原因的,由于项目数据库设计的时候没有长远考虑,总是不停的修改数据库.在一些应用上,总会有几个开发服务器,比如测试服务器~,外网服务器等等,而每次我修改的时候只改了本地的服务器数据库的结构,经常导致代码部署到外网测试服务器就挂了,调查了半天才发现是数据库差字段..然而每次的调查都很麻烦,看log,看日志.于是我写下了这段脚本.


<?php

$dsn1="mysql:host=192.168.1.90;port=3306;dbname=lzt";//数据库连接1
$dsn2="mysql:host=121.40.121.36;port=3306;dbname=lzt";//数据库连接2

$db1=new PDO($dsn1,"root","fuck1314");
$db2=new PDO($dsn2,"root","fuck1314");
echo "------------------------------------------------------------------------------------------</br>";
echo "--------------------------表检查----------------------------------------------------------</br>";
$sql="show  tables";
$stmt1=$db1->query($sql);
$stmt1->setFetchMode(PDO::FETCH_NUM);
$rs1= $stmt1->fetchAll();

$stmt2=$db2->query($sql);
$stmt2->setFetchMode(PDO::FETCH_NUM);
$rs2= $stmt2->fetchAll();
$rs= check($rs1,$rs2);
//dump($rs);
Pr($rs);
echo "------------------------------------------------------------------------------------------</br>";
echo "数据格式:TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,CHARACTER_SET_NAME,COLUMN_KEY,EXTRA</br>";
echo "数据格式:表名,列名,列类型,是否允许空,字符编码集,属性,扩展</br>";
$sql="SELECT TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,CHARACTER_SET_NAME,COLUMN_KEY,EXTRA
from information_schema.COLUMNS where  TABLE_SCHEMA='lzt_platform';";
//比较表名,列名,列的类型,是否为空,字符编码,属性,扩展这几个属性.
$stmt1=$db1->query($sql);
$stmt1->setFetchMode(PDO::FETCH_NUM);
$rs1= $stmt1->fetchAll();

$stmt2=$db2->query($sql);
$stmt2->setFetchMode(PDO::FETCH_NUM);
$rs2= $stmt2->fetchAll();
$rs= check($rs1,$rs2);
Pr($rs);

//---------------------------------------------功能函数
//Print Array   其实没用上...
function dump($vars, $label = '', $return = false) {
if (ini_get('html_errors')) {
$content = "<pre>\n";
if ($label != '') {
$content .= "<strong>{$label} :</strong>\n";
}
$content .= htmlspecialchars(print_r($vars, true));
$content .= "\n</pre>\n";
} else {
$content = $label . " :\n" . print_r($vars, true);
}
if ($return) { return $content; }
echo $content;
return null;
}
//Print Tbale   把结果用表格打印出来
function Pr($arr)
{
$base="<div class=\"list\">
<table width=\"454\"  border=\"1\" cellpadding=\"2\" cellspacing=\"1\">
<col width=\"150\" />
<col width=\"150\" />
<tr>
<th>DSN1</th>
<th>DSN2</th>
</tr>";
foreach ($arr as $key => $value) {
$v1=implode(",",$value['A']);
$v2=implode(",",$value['B']);
$base=$base."<tr>
<td>$v1</td>
<td>$v2</td>
</tr>";
}
$base=$base." </table>";
echo $base;
}
//数据检查
function check($arr1,$arr2){
$arr3=array();
foreach ($arr1 as $key => $value) {
if(!in_array($value,$arr2,true)){
//如果A不在B里 则证明B里没有这个字段或表...则存起来.
$arr3[]=array("A"=>$value,
"B"=>array("null"));
}
}
//逆向遍历一下.
foreach ($arr2 as $key => $value) {
if(!in_array($value,$arr1,true)){

$arr3[]=array("B"=>$value,
"A"=>array("null"));
}
}

return $arr3;
}




运行方式也很简单,放在你的php服务器的webroot根目录,然后在浏览器调用一下就可以咯.

相信大家看到这段代码之后会觉得,怎么这么简单,我一开始是想去找工具的,没想到都要收费,所以就只能自己动手了..本文也提供了一些思路….如果你要比较table的数据得话,除了耗费的时间久一点,其他应该是没什么问题咯…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: