【发布时间】: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,正确,这就是我在这种情况下使用它的目的。这个脚本将在后端运行,运行它的人会希望它向终端打印不一致列的数组、他们的表和他们的数据库,以供他们研究不一致的列中保存的内容和如果需要/想要该数据。我所说的“视觉上不令人愉悦”的具体意思是,结果(列)被分配给它们自己的单个数组,而不是被推送到一个表的所有列的包含数组。