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的数据得话,除了耗费的时间久一点,其他应该是没什么问题咯…
相关文章推荐
- THINKPHP限制今天提交的数据不超过几条
- php提供service总结---wsdl篇
- 使用PHP生成二维码的两种方法(带logo图像)
- php获取post参数的几种方式
- 邮件服务器Postfix的管理 重启php-fpm
- [PHP代码] PHP远程获取网页内容
- PHP_OS常量使用方法
- 运行PHP
- PHP 7.0.0 一键安装脚本
- 韩顺平老师php从入门到精通149讲
- VideoView中getDuration()和getCurrentPosition()获取错误的问题
- PHP 解压zip文件的函数封装
- php-fpm.conf详细解析篇
- PHP如何实现无限回复
- PHP 匹配中文(UTF-8)
- 无法为 php_mysqli 指定 mysqli.default_socket 参数
- php 把秒数转换为时长(h:i:s格式)
- php基于getimagesize 上传图片验证
- PotPlayer播放器在双屏扩展模式下,视频播放时所遇到的几个常见问题的专业解答
- CGI PHP安装