PageRenderTime 48ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/php-tool/dbdiff.php

http://chenjin.googlecode.com/
PHP | 399 lines | 303 code | 51 blank | 45 comment | 57 complexity | 364ddd06a069f0a6f640a1cb128fc2f1 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. /**
  3. * ?????????
  4. *
  5. * @author ??<54zhua@gmail.com>
  6. * @copyright www.joy999.com
  7. * @version v1.0
  8. */
  9. ?><html>
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  11. <title>??????????</title>
  12. <body>
  13. <form method="POST">
  14. <h3>??????????????</h3>
  15. ???<input type="text" name="host1" value="<?php echo $_REQUEST['host1']?>"><br>
  16. ????<input type="text" name="user1" value="<?php echo $_REQUEST['user1']?>"><br>
  17. ???<input type="password" name="pwd1" value="<?php echo $_REQUEST['pwd1']?>"><br>
  18. ???<input type="text" name="db1" value="<?php echo $_REQUEST['db1']?>"><br>
  19. <h3>??????????????</h3>
  20. ???<input type="text" name="host2" value="<?php echo $_REQUEST['host2']?>"><br>
  21. ????<input type="text" name="user2" value="<?php echo $_REQUEST['user2']?>"><br>
  22. ???<input type="password" name="pwd2" value="<?php echo $_REQUEST['pwd2']?>"><br>
  23. ???<input type="text" name="db2" value="<?php echo $_REQUEST['db2']?>"><br>
  24. <input type="submit" value="??">
  25. <input type="reset" value="??">
  26. <p><input type="checkbox" name="exec" value="1" <?php echo ( $_REQUEST['exec'] == 1 ) ? 'checked' : '' ?> >??SQL????</p>
  27. </form>
  28. <?php
  29. /**
  30. * ???????
  31. *
  32. */
  33. if ( ! isset( $_REQUEST['host1'] ) || ! isset( $_REQUEST['host2'] ) ) {
  34. echo '</form></body></html>';
  35. exit;
  36. }
  37. echo '<hr>';
  38. set_time_limit( 0 );
  39. ignore_user_abort( true );
  40. ob_implicit_flush( true );
  41. $link1 = mysql_connect( $_REQUEST['host1'] , $_REQUEST['user1'] , $_REQUEST['pwd1'] )
  42. or die( '???1 ?????');
  43. $link2 = mysql_connect( $_REQUEST['host2'] , $_REQUEST['user2'] , $_REQUEST['pwd2'] )
  44. or die( '???2 ?????');
  45. //mysql_select_db( $_REQUEST['db1'] , $link1 )
  46. // or die( '???1 ?????');
  47. //mysql_select_db( $_REQUEST['db2'] , $link2 )
  48. // or die( '???2 ?????');
  49. $ts = array();
  50. $tStruct = array();
  51. $tCreate = array();
  52. $tIndex = array();
  53. foreach( array( $_REQUEST['db1'] => $link1 , $_REQUEST['db2'] => $link2 ) as $db => $link ) {
  54. mysql_select_db( $db , $link )
  55. or die( '????' . $db . '?????');
  56. mysql_query( 'set names "utf8";' , $link )
  57. or die( $db . ' set names "utf8" ?????');
  58. //?????
  59. $m = mysql_query( 'show tables;' , $link )
  60. or die ( $db . 'show tables ?????');
  61. while( $r = mysql_fetch_array( $m ) ) {
  62. $tn = $r[0];
  63. $rm = mysql_query( 'show full columns from `' . $tn . '`' , $link );
  64. while( $v = mysql_fetch_assoc( $rm ) ) {
  65. $ts[$db][$tn][] = $v['Field'];
  66. $tStruct[$db][$tn][$v['Field']] = $v;
  67. }
  68. if ( $db == $_REQUEST['db1'] ) {
  69. $rm = mysql_query( 'show create table `' . $tn . '`' , $link );
  70. $v = mysql_fetch_array( $rm );
  71. $tCreate[$v[0]] = $v[1] ;
  72. }
  73. //?????
  74. $rm = mysql_query( 'SHOW INDEX FROM `' . $tn . '`' , $link );
  75. $t = array();
  76. while( $v = mysql_fetch_assoc( $rm ) ) {
  77. if ( $v['Key_name'] == 'PRIMARY' ) {
  78. //??
  79. $t['key'][$v['Key_name']][] = $v['Column_name'];
  80. continue;
  81. }
  82. if ( $v['Non_unique'] == 1 ) {
  83. //??
  84. if ( $v['Index_type'] == 'FULLTEXT' ) {
  85. //????
  86. $t['fulltext'][$v['Key_name']][] = $v['Column_name'];
  87. } else {
  88. //????
  89. $t['index'][$v['Key_name']][] = $v['Column_name'];
  90. }
  91. } else {
  92. //??
  93. $t['uni'][$v['Key_name']][] = $v['Column_name'];
  94. }
  95. }
  96. // if ( $tn == 'access_log') {
  97. // var_dump( $t );
  98. // }
  99. foreach( $t as $type => $ta ) {
  100. foreach( $ta as $kn => $ka ) {
  101. sort( $ka );
  102. // var_dump( $ka );
  103. $tmp = implode( '`,`' , $ka );
  104. if ( ! empty( $tmp ) ) {
  105. $tmp = '`' . $tmp . '`' ;
  106. }
  107. $ta[$kn] = $tmp;
  108. }
  109. $t[$type] = $ta;
  110. }
  111. $tIndex[$db][$tn] = $t;
  112. }
  113. }
  114. $sql = array();
  115. $msg = array();
  116. if ( is_array( $ts[$_REQUEST['db1']] ) ) foreach( $ts[$_REQUEST['db1']] as $tn => $tbs ) {
  117. if ( ! isset( $ts[$_REQUEST['db2']][$tn] ) ) {
  118. //????
  119. $sql[] = $tCreate[$tn];
  120. }
  121. $last = '?';
  122. foreach( $tbs as $v ) {
  123. if ( ! isset( $ts[$_REQUEST['db2']][$tn] ) ) {
  124. $msg[$tn][] = '??????? ' . $v . ' ? ' . $last . ' ??';
  125. $last = $v;
  126. continue;
  127. }
  128. $fieldUpdateMethod = '' ;
  129. if ( ! in_array( $v , $ts[$_REQUEST['db2']][$tn] ) ) {
  130. //????
  131. $msg[$tn][] = '?? ' . $v . ' ? ' . $last . ' ??';
  132. $fieldUpdateMethod = 'ADD';
  133. } else {
  134. //????
  135. if ( $tStruct[$_REQUEST['db2']][$tn][$v] != $tStruct[$_REQUEST['db1']][$tn][$v] ) {
  136. $msg[$tn][] = '?? ' . $v . ' ? ' . $last . ' ??';
  137. $fieldUpdateMethod = 'CHANGE `' . $v . '` ' ;
  138. }
  139. }
  140. if ( $fieldUpdateMethod ) {
  141. $T = $tStruct[$_REQUEST['db1']][$tn];
  142. $tt = $T[$v];
  143. $tSql = 'alter table `' . $tn .'` ' . $fieldUpdateMethod . ' `' . $v .'` ' . $tt['Type'] . ' ';
  144. if ( $tt['Null'] == 'NO' ) {
  145. $tSql .= ' NOT NULL ';
  146. }
  147. $tSql .= ' ' . $tt['Extra'] . ' ';
  148. if ( $tt['Default'] != '' ) {
  149. if ( $tt['Default'] == 'CURRENT_TIMESTAMP' ) {
  150. $tSql .= ' default CURRENT_TIMESTAMP ';
  151. } else {
  152. $tSql .= ' default \'' . addslashes( $tt['Default'] ) . '\' ';
  153. }
  154. }
  155. $tSql .= ' COMMENT \'' . mysql_escape_string( $tt['Comment'] ) .'\' ';
  156. if ( $last == '?' ) {
  157. $tSql .= ' FIRST ';
  158. } else {
  159. if ( in_array( $last , $ts[$_REQUEST['db2']][$tn] ) ) {
  160. $tSql .= ' AFTER `' . $last . '`';
  161. }
  162. }
  163. //?????????????????????
  164. if ( ! empty( $tt['Extra'] ) ) {
  165. if ( $tt['Key'] == 'PRI' ) {
  166. //??,????????????????
  167. $tSql .= ' , DROP PRIMARY KEY ';
  168. //?????????????
  169. $tSql .= ' , ADD PRIMARY KEY ( ';
  170. foreach( $T as $tName => $vv ) {
  171. $priKey = array();
  172. if ( $vv['Key'] == 'PRI' ) {
  173. $priKey[] = '`' . $tName . '`';
  174. }
  175. $tSql .= implode( ',' , $priKey );
  176. }
  177. $tSql .= ' ) ';
  178. }
  179. if ( $tt['Key'] == 'MUL' ) {
  180. //??
  181. $tSql .= ' , ADD INDEX ( ' . $v . ' )';
  182. }
  183. if ( $tt['Key'] == 'UNI' ) {
  184. //??
  185. $tSql .= ' , ADD UNIQUE ( ' . $v . ' )';
  186. }
  187. }
  188. $sql[] = $tSql;
  189. }
  190. $last = $v;
  191. }
  192. }
  193. if ( is_array( $ts[$_REQUEST['db2']] ) ) foreach( $ts[$_REQUEST['db2']] as $tn => $tbs ) {
  194. foreach( $tbs as $v ) {
  195. if ( ! in_array( $v , $ts[$_REQUEST['db1']][$tn] ) ) {
  196. $msg[$tn][] = '?? ' . $v;
  197. $sql[] = 'alter table `' . $tn . '` drop column `' . $v . '`';
  198. }
  199. }
  200. }
  201. $typeMap = array(
  202. 'key' => '??' ,
  203. 'index' => '??' ,
  204. 'uni' => '??' ,
  205. 'fulltext' => '????' ,
  206. );
  207. //??????????
  208. echo '<hr><h2>????????</h2>';
  209. $indexMsg = array();
  210. foreach( $tIndex[$_REQUEST['db2']] as $tableName => $indexs ) {
  211. $str = '';
  212. foreach( $indexs as $type => $arr ) {
  213. foreach( $arr as $iName => $iVal ) {
  214. if ( isset( $tIndex[$_REQUEST['db1']][$tableName][$type][$iName] ) ) {
  215. $srcVal = $tIndex[$_REQUEST['db1']][$tableName][$type][$iName];
  216. if ( $srcVal == $iVal ) {
  217. //?????
  218. continue;
  219. } else {
  220. //????????
  221. $msg[$tableName][] = '<li>' . $typeMap[$type] .' [' . $iName .' : ' . $iVal . '] ??';
  222. //???????
  223. switch( $type ) {
  224. case 'key' :
  225. $sql[] = 'ALTER TABLE `'. $tableName . '` DROP PRIMARY KEY ';
  226. $sql[] = 'ALTER TABLE `' . $tableName . '` ADD PRIMARY KEY ( ' . $srcVal . ' )';
  227. break;
  228. case 'index' :
  229. $sql[] = 'ALTER TABLE `'. $tableName . '` DROP INDEX `' . $iName .'`';
  230. $sql[] = 'ALTER TABLE `' . $tableName . '` ADD INDEX `' . $iName .'` ( ' . $srcVal . ' )';
  231. break;
  232. case 'uni' :
  233. $sql[] = 'ALTER TABLE `'. $tableName . '` DROP INDEX `' . $iName .'`';
  234. $sql[] = 'ALTER TABLE `' . $tableName . '` ADD UNIQUE `' . $iName .'` ( ' . $srcVal . ' )';
  235. break;
  236. case 'fulltext' :
  237. $sql[] = 'ALTER TABLE `'. $tableName . '` DROP INDEX `' . $iName .'`';
  238. $sql[] = 'ALTER TABLE `' . $tableName . '` ADD FULLTEXT `' . $iName .'` ( ' . $srcVal . ' )';
  239. break;
  240. }
  241. }
  242. } else {
  243. //????????
  244. $msg[$tableName][] = '<li>'. $typeMap[$type] .' [' . $iName .' : ' . $iVal . '] ????';
  245. switch( $type ) {
  246. case 'key' :
  247. $sql[] = 'ALTER TABLE `'. $tableName . '` DROP PRIMARY KEY ';
  248. break;
  249. case 'index' :
  250. case 'uni' :
  251. case 'fulltext' :
  252. $sql[] = 'ALTER TABLE `'. $tableName . '` DROP INDEX `' . $iName .'`';
  253. break;
  254. }
  255. }
  256. }
  257. }
  258. }
  259. foreach( $tIndex[$_REQUEST['db1']] as $tableName => $indexs ) {
  260. foreach( $indexs as $type => $arr ) {
  261. foreach( $arr as $iName => $iVal ) {
  262. if ( isset( $tIndex[$_REQUEST['db2']][$tableName][$type][$iName] ) ) {
  263. } else {
  264. //??????????
  265. $msg[$tableName][] = '<li>'. $typeMap[$type] .' [' . $iName .' : ' . $iVal . '] ????';
  266. switch( $type ) {
  267. case 'key' :
  268. $sql[] = 'ALTER TABLE `' . $tableName . '` ADD PRIMARY KEY ( ' . $iVal . ' )';
  269. break;
  270. case 'index' :
  271. $sql[] = 'ALTER TABLE `' . $tableName . '` ADD INDEX `' . $iName .'` ( ' . $iVal . ' )';
  272. break;
  273. case 'uni' :
  274. $sql[] = 'ALTER TABLE `' . $tableName . '` ADD UNIQUE `' . $iName .'` ( ' . $iVal . ' )';
  275. break;
  276. case 'fulltext' :
  277. $sql[] = 'ALTER TABLE `' . $tableName . '` ADD FULLTEXT `' . $iName .'` ( ' . $iVal . ' )';
  278. break;
  279. }
  280. }
  281. }
  282. }
  283. }
  284. //??????
  285. foreach( $msg as $tn => $arr ) {
  286. echo '<hr><p>???' . $tn . '</p><ul>';
  287. if ( !empty( $arr ) ) foreach( $arr as $v ) {
  288. echo '<li>' . $v . '</li>';
  289. } else {
  290. echo '<li>????</li>';
  291. }
  292. echo '</ul>';
  293. }
  294. if ( ! empty( $sql ) ) {
  295. echo '<textarea style="width:100%;height:500px">';
  296. $result = '';
  297. foreach( $sql as $s ) {
  298. echo htmlspecialchars( $s . ";\n\n\n" );
  299. // if ( $_REQUEST['exec'] == 1 ) {
  300. // echo '<p><b>???</b>' . $s . ' ' . ( mysql_query( $s , $link2 ) ? '<font color=green>??</font>' : '<font color=red>??</font>' );
  301. // $result .= "</p>\r\n";
  302. // }
  303. }
  304. echo '</textarea>';
  305. if ( $_REQUEST['exec'] == 1 ) {
  306. $totalSqls = count( $sql );
  307. foreach( $sql as $i => $s ) {
  308. echo '===========================????' . ( $i + 1 ) . ' / ' . $totalSqls .'=================================<br />';
  309. echo '<p><b>???</b>' . $s . ' ' . ( mysql_query( $s , $link2 ) ? '<font color=green>??</font>' : '<font color=red>??</font>' );
  310. echo "</p>\r\n";
  311. }
  312. }
  313. ?>
  314. <table><tr><td>
  315. <form method="POST">
  316. <input type="hidden" name="exec" value="1">
  317. <input type="hidden" name="host1" value="<?php echo $_REQUEST['host1']?>"><br>
  318. <input type="hidden" name="user1" value="<?php echo $_REQUEST['user1']?>"><br>
  319. <input type="hidden" name="pwd1" value="<?php echo $_REQUEST['pwd1']?>"><br>
  320. <input type="hidden" name="db1" value="<?php echo $_REQUEST['db1']?>"><br>
  321. <input type="hidden" name="host2" value="<?php echo $_REQUEST['host2']?>"><br>
  322. <input type="hidden" name="user2" value="<?php echo $_REQUEST['user2']?>"><br>
  323. <input type="hidden" name="pwd2" value="<?php echo $_REQUEST['pwd2']?>"><br>
  324. <input type="hidden" name="db2" value="<?php echo $_REQUEST['db2']?>"><br>
  325. <input type="submit" value="??SQL???????">
  326. </form>
  327. </td><td>
  328. <form method="POST">
  329. <input type="hidden" name="host1" value="<?php echo $_REQUEST['host1']?>"><br>
  330. <input type="hidden" name="user1" value="<?php echo $_REQUEST['user1']?>"><br>
  331. <input type="hidden" name="pwd1" value="<?php echo $_REQUEST['pwd1']?>"><br>
  332. <input type="hidden" name="db1" value="<?php echo $_REQUEST['db1']?>"><br>
  333. <input type="hidden" name="host2" value="<?php echo $_REQUEST['host2']?>"><br>
  334. <input type="hidden" name="user2" value="<?php echo $_REQUEST['user2']?>"><br>
  335. <input type="hidden" name="pwd2" value="<?php echo $_REQUEST['pwd2']?>"><br>
  336. <input type="hidden" name="db2" value="<?php echo $_REQUEST['db2']?>"><br>
  337. <input type="submit" value="????????SQL?">
  338. </form>
  339. </td></tr></table>
  340. <?php
  341. } else {
  342. echo '<font color=green>??????????</font>';
  343. }
  344. mysql_close( $link1 );
  345. mysql_close( $link2 );
  346. ?>
  347. </body>
  348. </html>