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

事情的开头总是有原因的,由于项目数据库设计的时候没有长远考虑,总是不停的修改数据库.在一些应用上,总会有几个开发服务器,比如测试服务器~,外网服务器等等,而每次我修改的时候只改了本地的服务器数据库的结构,经常导致代码部署到外网测试服务器就挂了,调查了半天才发现是数据库差字段..然而每次的调查都很麻烦,看log,看日志.于是我写下了这段脚本.
<?php  
$dbname1="lzt";
$dbname2="lzt";
$dsn1="mysql:host=192.168.1.90;port=3306;dbname=".$dbname1;//数据库连接1
$dsn2="mysql:host=121.40.121.1;port=3306;dbname=".$dbname2;//数据库连接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=";
//比较表名,列名,列的类型,是否为空,字符编码,属性,扩展这几个属性.
$stmt1=$db1->query($sql."'".$dbname1."'");
$stmt1->setFetchMode(PDO::FETCH_NUM);
$rs1= $stmt1->fetchAll();

$stmt2=$db2->query($sql."'".$dbname2."'");
$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的数据得话,除了耗费的时间久一点,其他应该是没什么问题咯…

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值