<?php
  $user  
"root";
  
$userp "";

  
mysql_connect("localhost"$user$userp) or die(mysql_error());

    
$table2compare = array("`test1`""test2"); // первой пишем табличку старую, которую нужно обновить
    
$engine "MyISAM"// устанавливаем движок
    
$charset "cp1251"// устанавливаем кодировку
    
$collation "cp1251_general_ci"// устанавливаем колейшон
    
$encstring ""// " CHARACTER SET $charset COLLATE $collation"; //в запрос идёт эта строка
    
$comparedtables = array(); $i 0;
  
//echo "<table>";
  
foreach ($table2compare as $tablename){ // собираем таблицы в сравниваемых БД
      
$comparedtables["title"][$i] = $tablename;
    
$db mysql_query("SHOW TABLES IN $tablename");
    while(
$dbt mysql_fetch_array($db,MYSQL_NUM)){ // собираем поля в каждой таблице
      
$table mysql_query("SHOW COLUMNS FROM $dbt[0] FROM $tablename ");
      while(
$tbf mysql_fetch_array($table,MYSQL_NUM)) 
          
$comparedtables["tables"][$dbt[0]][$i][$tbf[0]] = $tbf// таблици с одинаковым именем рядом
    
}
    
$i++;
  }
  
//unset($db, $dbt, $table, $tbf, $i);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
  "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>[<?=implode(", "$table2compare)?>] DBs compare</title>
</head>
<body>
<?
    
echo "<table><tr>";
    for (
$j 0$j $i$j++) 
        echo 
"<td>".$comparedtables["title"][$j]."</td>";
    echo 
"</tr>";

    
$bigsql "";
    foreach (
$comparedtables["tables"] as $table => $fields) {
        echo 
"<tr>";
        for (
$j 0$j $i$j++) { // $j номерация базы (если 0, это та, которую нужно обновить)
            
            
echo "<td valign='top'>";
            if (empty(
$fields[$j])) continue; // если таблици в базе $j нету, идём дальше
            
            
if ($j 0$eq $fields[$j] == $fields[0]; else $eq true// сравниваем 2 таблицы
            
$edittable $comparedtables["title"][0].".`".$table."` "// полное название "бд.таблица"
            
$usetable $comparedtables["title"][$j].".`".$table."` ";
            
$head "ALTER TABLE ".$edittable// основная операция
            
$footer ";\n\r";
            
            foreach (
$fields[$j] as $key => $field) break; // получаем первые поле из таблицы
            // если таблица уникальна, создаём её только с первым полем
            
            
if (empty($fields[0])) { // получаем криейт тейбл директом от мускула
            
$db mysql_query("show create table $usetable");
              while(
$dbt mysql_fetch_array($db,MYSQL_NUM))
                  
$sqlct $dbt[1].$footer;
              
//echo "<pre>".$sqlct."</pre>";
                
$sqlct str_replace(array("`".$table."`"),array($edittable),$sqlct);
                
$rx = array(
                    
"(DEFAULT CHARSET\=(\w[0-9a-zA-Z]{1,10}))",
                    
"(COLLATE\=(\w{1,30}))",
                    
"(COLLATE (\w{1,30}))",
                    
"(ENGINE\=(\w[a-zA-Z]{1,10}))"
                
);
                
// обнуляем автоинкремент в новых табличках
                
$sqlct preg_replace("/(AUTO_INCREMENT\=([0-9]{1,10}))/mi""AUTO_INCREMENT=1"$sqlct);
                
// ставим нужные параметры
                
if (!empty($charset)) { $sqlct preg_replace("/".$rx[0]."/mi""DEFAULT CHARSET=$charset"$sqlct); unset($rx[0]);}
                if (!empty(
$collation)) {
                    
$sqlct preg_replace("/".$rx[1]."/mi""COLLATE=$collation"$sqlct);
                    
$sqlct preg_replace("/".$rx[2]."/mi""COLLATE $collation"$sqlct);
                    unset(
$rx[1],$rx[2]);
                } 
                if (!empty(
$engine)) { $sqlct preg_replace("/".$rx[3]."/mi""ENGINE=$engine"$sqlct); unset($rx[3]);}
                
// убираем лишнее (так как у 2ух БД может быть разные кодировки, и движки
                
if (!empty($rx)) $sqlct preg_replace("/".implode("|".$rx)."/mi"""$sqlct);
                
$bigsql .= $sqlct// собираем всё в один большой запрос
                
$skip "ok";
        }

            echo 
"<span ".(!$eq "style='background: #fcc;'" "").">$table</span><br>"// если таблицы разные, подкрашиваем
            
echo "<table rules=all frame=box cellpadding='2'>
            <tr>
                <td>Field</td>
                <td>Type</td>
                <td>Null</td>
                <td>Key</td>
                <td>Default</td>
                <td>Extra</td>
            </tr>"
;
            
          foreach (
$fields[$j] as $key => $field) { // работаем с полями таблицы в БД $j
        
$sql "";
        if (
$ptable != $edittable$prev ""// если новая таблица онуляем предыдущее название поля

                
$eqf $fields[$j][$key] == $fields[0][$key] ? true false// разные ли поля сами по себе целиком
                
$eqt $fields[$j][$key][0] == $fields[0][$key][0] ? true false// проверка совпадение названия полей
                
$eqs strtoupper($fields[$j][$key][1]) == "TIMESTAMP" true false// проверка на TIMESTAMP
                
$eqi $fields[$j][$key][3] == $fields[0][$key][3] ? true false// проверка на ключи Primary или Index
          
                 
if (empty($j)) $eqf = empty($fields[1][$key]) ? falsetrue;
          
          echo 
"<tr ".(!$eqf "style='background: #c88;'" "").">
                          <td>
$field[0]</td>
                          <td>
$field[1]</td>
                          <td>
$field[2]</td>
                        <td>
$field[3]</td>
                        <td>
$field[4]</td>
                        <td>
$field[5]</td>
                    </tr>"
;
        
        
              if (
$skip) continue;
              
              if (
$j 0) {
              if (
$field[3] == "PRI") { // собираем все примари в списочек
                  
if (isset($prim)) $prim .= ",`".$field[0]."`";
                  else 
$prim "`".$field[0]."`";
              }
                  
              if (!
$eqf) { // формируем альтер запрос
                  
$sql .= $head
                  
$sql .= $eqt "CHANGE `".$field[0]."`" "ADD ";
                  
$sql .= " `".$field[0]."` ".strtoupper($field[1]);
                  
$sql .= "$encstring ".($field[2] == "YES" "NULL DEFAULT NULL" "NOT NULL");
                  
$sql .= !$eqs && $field[4] != "" " DEFAULT '".$field[4]."'" "";
                  
$sql .= $prev && !$eqt " AFTER `".$prev."`" "";
                  
$sql .= $footer;
                  
                  if ((empty(
$fields[$j][$key][3]) && $fields[0][$key][3] == "MUL") ||
                          (
$fields[0][$key][3] == "PRI" && $field[3] == "MUL"))  { // если есть лишний индекс, убираем
                      
$db mysql_query("SHOW INDEX FROM $edittable WHERE Column_name = '".$field[0]."'");
                          while(
$dbt mysql_fetch_array($db,MYSQL_NUM)){ 
                              
$sql .= $head." DROP INDEX ".$dbt[2].$footer;
                      }
                  }

                  if ((
$field[3] == "MUL" || $field[3] == "PRI") && !$eqi) { // ставим индексы
                      
$sql .= $head;
                      
$sql .= $field[3] == "PRI" " DROP PRIMARY KEY, " "";
                      
$sql .= "ADD ".($field[3] == "MUL" "INDEX" "PRIMARY KEY");
                      
$sql .= " (".($field[3] == "MUL" $field[0] : $prim ).")";
                      
$sql .= $footer;
                  }
                  
                  
                  if (
strtoupper($field[5]) == "AUTO_INCREMENT") { // добавляем автоинкремент
                      
$sql .= $head;
                      
$sql .= " CHANGE `".$field[0]."` `".$field[0]."` ".strtoupper($field[1])." NOT NULL AUTO_INCREMENT";
                      
$sql .= $footer;
                  }
                  
              }
              } else {
                  if (!
$eqf && !empty($fields[1]))
                      
$sql .= "#".$head." DROP `".$field[0]."`".$footer;
              }
                    
          
$prev $field[0];
          
$ptable $edittable;
          unset(
$sqlct);
                
$bigsql .= $sql;
        }
        
            if (
$j == && empty($fields[$j+1]))
                
$bigsql .= "#DROP TABLE ".$edittable.$footer;

        unset(
$skip$prim$sql$prev);
      echo 
"</table></td>";
    }
    echo 
"</tr>";
  }
  
  echo 
"</table>";
  echo 
'<textarea style="margin: 20px; width: 600px; height: 360px;" onclick="select();">'.$bigsql.'</textarea>';
  unset (
$comparedtables$bigsql$ptable);
  
mysql_close();
?>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
<script type="text/javascript">
    $(function(){
      $("table table").hide();
      $("table table td").css("white-space","nowrap");
      $("table span").click(function(){
          $(this).next().next().toggle();
      }).css({"cursor":"pointer"});
    });    
</script>
</body>