|
|||||||||||||
MySQL/PHP
Schema checking script |
Here's a PHP script that can be run from the command line to show a database's schema, look for matching fields in different tables, and identify matching field pairs that may be poorly normalized.
...
<?php
// command -d [database] -h [hostname] -u [user] -p [password] [fieldname] [ fieldname]
//
// If no field names are provided, displays list of all tables and fields
// If one field name, displays list of only tables that include at that field
// If two field names, displays list only of tables that include both field names
//
// https://bugs.nor1solutions.com/show_bug.cgi?id=2498
$dbname = 'dev';
$host = 'localhost';
$user = 'root';
$passwd = 'root';
for ($i = 1; $i < $_SERVER['argc']; $i++) {
if ($i === $db) {
$dbname = $_SERVER["argv"][$i];
continue;
}
if ($i === $hs) {
$host = $_SERVER["argv"][$i];
continue;
}
if ($i === $us) {
$user = $_SERVER["argv"][$i];
continue;
}
if ($i === $pw) {
$passwd = $_SERVER["argv"][$i];
continue;
}
if ($_SERVER["argv"][$i] == '-d') {
$db = $i + 1;
continue;
}
if ($_SERVER["argv"][$i] == '-h') {
$hs = $i + 1;
continue;
}
if ($_SERVER["argv"][$i] == '-u') {
$us = $i + 1;
continue;
}
if ($_SERVER["argv"][$i] == '-p') {
$pw = $i + 1;
continue;
}
if (!isset($fn))
$fn = $i;
if (isset($fn)) {
if ($i == $fn)
$m[0] = $_SERVER["argv"][$i];
if ($i == ($fn + 1 ))
$m[1] = $_SERVER["argv"][$i];
continue;
}
}
if (!mysql_connect($host, $user, $passwd)) {
echo 'Could not connect to mysql';
exit;
}
$sql = "SHOW TABLES FROM $dbname";
$result = mysql_query($sql);
if (!$result) {
echo "DB Error, could not list tables\n";
echo 'MySQL Error: ' . mysql_error();
exit;
}
mysql_select_db($dbname) or die("mysql_select() failed");
while ($row = mysql_fetch_row($result)) {
$query = "select * from ".$row[0]." limit 1";
if (!isset($m[0]))
echo "Table: {$row[0]}\n";
$res2 = mysql_query($query) or die(mysql_error());
$colqty = mysql_num_fields($res2);
$t = 0;
for ($i = 0; $i < $colqty; $i++) {
if (isset($_SERVER["argv"][2])) {
if (preg_match("/".$m[0]."/i", mysql_field_name($res2, $i))) {
$m1 = mysql_field_name($res2, $i); $t++;
}
}
if (isset($m[1])) {
if (preg_match("/".$m[1]."/i", mysql_field_name($res2, $i))) {
$m2 = mysql_field_name($res2, $i); $t++;
}
}
if (!isset($m[0]))
echo "\t".mysql_field_name($res2, $i)."\n";
}
if (isset($m[1])) {
if ($t == 2) {
echo "Table: {$row[0]}\n";
echo "\t".$m1."\n";
echo "\t".$m2."\n";
}
}
else if (isset($m[0])) {
if ($t == 1) {
echo "Table: {$row[0]}\n";
if (isset($m1)) echo "\t".$m1."\n";
if (isset($m2)) echo "\t".$m2."\n";
}
}
unset($m1);
unset($m2);
}
mysql_free_result($result);
?>