【问题标题】:How to compare tables from different mySQL databases with PHP?如何将来自不同 mySQL 数据库的表与 PHP 进行比较?
【发布时间】:2021-06-25 20:20:07
【问题描述】:

我是 PHP 和该领域的新手,我的任务是查找来自不同 mySQL 数据库的表之间的不一致。数据库之间的每个表都应该是相同的(列名、列数),但其中保存的实际数据除外,但事实并非如此。我需要确定有问题的列、它们所在的表以及它们所在的数据库。以下是我目前的代码:

<?php
chdir(<path>);
include(<file>);
include(<file>);

$db = new db($hostname, $user, $pass, $commondatabase);

// Get baseline DB columns
//$db->select_db('<baseDB>');
//$btq = "SHOW TABLES";
//$btr = $db->query($btq);
//while($trows = $db->fetch_assoc($btr) {
//      $bcq = "SHOW COLUMNS FROM ".$btr[<key>];
//      $bcr = "$db->query($bcq);
//      $basecolumns[] = $bcr;
//}

$dbq = "SELECT * FROM <commonDB>.<DBnames> ORDER BY <DBnamesID>";
$dbr = $db->query($dbq);

while($dbrow = $db->fetch_assoc($dbr)) {
echo "\n";
print_r($dbrow['dbname']);
echo "\n";
        $db->select_db($dbrow['dbname']);
        $tq = "SHOW TABLES";
        $tr = $db->query($tq);
        while($table = $db->fetch_assoc($tr)) {
/*print_r($dbtables);*/
                $cq = "SHOW COLUMNS FROM ".$table['Tables_in_'.$dbrow['dbname']];
                $cr = $db->query($cq);
                $dbcols = [];
                while($col = $db->fetch_assoc($cr)) {
/*print_r($col);*/      $dbcols = $col;
                        // Do check against baseline here
                        //if($dbcols != $basecolumns) {
                        //      $badcolumns[] = $dbcols;
                        //}
                }
        }
}


$db->close();
?>

目前它将循环到列,但输出在视觉上并不令人愉悦,也不太易于管理。我首先关心的是让它工作到我可以循环到列的地方,并实际上让它们在自己的数组中进行检查,以对照基线进行检查,我已经碰壁了,所以任何方向都会非常感激。目前,每一列都被分配给自己的数组,而不是循环所在的数据库和表的所有列名的数组。蒂亚!

【问题讨论】:

  • 可以查询INFORMATION_SCHEMA.COLUMNS而不是查询表。
  • 谢谢巴尔玛。我最初考虑采用这条路线,但不确定如何提取这些值,因为它们都被塞进一个字段,周围还有其他信息。
  • 只使用子查询选择表名和列名,忽略其他列。然后在基本数据库和其他数据库中的表之间进行完全外连接。请参阅stackoverflow.com/questions/4796872/… 了解如何在 MySQL 中进行模拟。
  • “输出不美观”请理解print_r() 是一个调试工具,它不适合最终用户输出。
  • Miken,正确,这就是我在这种情况下使用它的目的。这个脚本将在后端运行,运行它的人会希望它向终端打印不一致列的数组、他们的表和他们的数据库,以供他们研究不一致的列中保存的内容和如果需要/想要该数据。我所说的“视觉上不令人愉悦”的具体意思是,结果(列)被分配给它们自己的单个数组,而不是被推送到一个表的所有列的包含数组。

标签: php mysql database


【解决方案1】:

这是我想出的。不确定这是否是最干燥的方法,但它可以工作并达到我想要的结果。感谢 Barmar 让我走上正确的道路。

<?php

chdir(<path>);
include(<file>);
include(<file>);

$db = new db($hostname,$user,$pass,$commondatabase);

$db->select_db(<database>);

// Get tables from baseline database
$q="select distinct <column-name> from <table-name> where <where-param> ORDER BY <order-by-param>";
$r=$db->query($q);
while($tables=$db->fetch_assoc($r)) {
        $table = $tables[<key>];

        $x = array();
        $x["$table"]=array();

        // Get table columns from baseline database
        $q="select <column-name> from <table-name> where <where-param> and <where-param> ORDER BY <order-by-param>";
        $r2=$db->query($q);
        while ($columns=$db->fetch_assoc($r2)) {
                $x["$table"][]=$columns[<key>];
        }

        // Check other databases for this table
        $q="select * from $commondatabase.<table-with-database-names> ";
        $q.="where <where-param> order by <order-by-param>";
        $r2=$db->query($q);
        while ($databases=$db->fetch_assoc($r2)) {

                $y = array();
                $y["$table"]=array();

                // Get table columns in $databases[<key>]
                $q="select <column-name> from <table-name> where <where-param> and <where-param> ORDER BY <order-by-param>";
                $r3=$db->query($q);
                while ($columns=$db->fetch_assoc($r3)) {
                        $y["$table"][]=$columns[<key>];
                }

                // Check against baseline
                $z1 = array_diff($x["$table"],$y["$table"]);
                $z2 = array_diff($y["$table"],$x["$table"]);

                // Echo out comparison results
                if (empty($z1) && empty($z2)) {
                        //echo "all good.\n";
                } else {
                        echo "Difference found in {$databases[<key>]}.{$tables[<key>]}:";
                        if (!empty($z1)) print_r($z1);
                        if (!empty($z2)) print_r($z2);
                }
        }
}

$db->close();
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    相关资源
    最近更新 更多