diff --git a/functions.inc.php b/functions.inc.php index e885511d..6ad21743 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -61,16 +61,15 @@ function indexes($table) { } function foreign_keys($table) { - //! make over to information_schema.key_column_usage static $pattern = '~`((?:[^`]*|``)+)`~'; $return = array(); $create_table = mysql_result(mysql_query("SHOW CREATE TABLE " . idf_escape($table)), 0, 1); - preg_match_all('~FOREIGN KEY \\((.*)\\) REFERENCES (.*) \\((.*)\\)~', $create_table, $matches, PREG_SET_ORDER); + preg_match_all('~FOREIGN KEY \\((.+)\\) REFERENCES (?:`(.+)`\\.)?`(.+)` \\((.+)\\)~', $create_table, $matches, PREG_SET_ORDER); foreach ($matches as $match) { preg_match_all($pattern, $match[1], $source); - preg_match_all($pattern, $match[3], $target); + preg_match_all($pattern, $match[4], $target); foreach ($source[1] as $val) { - $return[idf_unescape($val)][] = array(idf_unescape(substr($match[2], 1, -1)), array_map('idf_unescape', $source[1]), array_map('idf_unescape', $target[1])); + $return[idf_unescape($val)][] = array(idf_unescape($match[2]), idf_unescape($match[3]), array_map('idf_unescape', $source[1]), array_map('idf_unescape', $target[1])); } } return $return; diff --git a/index.php b/index.php index fb4739c5..e5c64bff 100644 --- a/index.php +++ b/index.php @@ -23,7 +23,7 @@ if (isset($_GET["sql"])) { include "./view.inc.php"; } else { page_header(htmlspecialchars($_GET["db"])); - $result = mysql_query("SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '" . mysql_real_escape_string($_GET["db"]) . "'"); + $result = mysql_query("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = '" . mysql_real_escape_string($_GET["db"]) . "'"); if (mysql_num_rows($result)) { echo "

" . lang('Routines') . "

\n"; echo "\n"; diff --git a/select.inc.php b/select.inc.php index 3a5097d1..fd9cc31a 100644 --- a/select.inc.php +++ b/select.inc.php @@ -39,11 +39,20 @@ $limit = 30; echo "\n"; echo "\n"; $result = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "") . " LIMIT $limit OFFSET " . ($limit * $_GET["page"])); -$found_rows = mysql_result(mysql_query(" SELECT FOUND_ROWS()"), 0); +$found_rows = mysql_result(mysql_query(" SELECT FOUND_ROWS()"), 0); // space for mysql.trace_mode if (!mysql_num_rows($result)) { echo "

" . lang('No rows.') . "

\n"; } else { $foreign_keys = foreign_keys($_GET["select"]); + $childs = array(); + $result1 = mysql_query("SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '" . mysql_real_escape_string($_GET["db"]) . "' AND REFERENCED_TABLE_NAME = '" . mysql_real_escape_string($_GET["select"]) . "' ORDER BY ORDINAL_POSITION"); + while ($row1 = mysql_fetch_assoc($result1)) { + $childs[$row1["CONSTRAINT_NAME"]][0] = $row1["TABLE_SCHEMA"]; + $childs[$row1["CONSTRAINT_NAME"]][1] = $row1["TABLE_NAME"]; + $childs[$row1["CONSTRAINT_NAME"]][2][] = $row1["REFERENCED_COLUMN_NAME"]; + $childs[$row1["CONSTRAINT_NAME"]][3][] = $row1["COLUMN_NAME"]; + } + mysql_free_result($result1); echo "
\n"; for ($j=0; $row = mysql_fetch_assoc($result); $j++) { @@ -59,16 +68,22 @@ if (!mysql_num_rows($result)) { if (count($foreign_keys[$key]) == 1) { $foreign_key = $foreign_keys[$key][0]; $val = '">' . "$val"; - foreach ($foreign_key[1] as $i => $source) { - $val = "&where[$i][col]=" . urlencode($foreign_key[2][$i]) . "&where[$i][op]=%3D&where[$i][val]=" . urlencode($row[$source]) . $val; + foreach ($foreign_key[2] as $i => $source) { + $val = "&where[$i][col]=" . urlencode($foreign_key[3][$i]) . "&where[$i][op]=%3D&where[$i][val]=" . urlencode($row[$source]) . $val; } - $val = 'edit'; //! views can be unupdatable - //! links to referencing tables - information_schema.key_column_usage - REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME + foreach ($childs as $child) { + echo ' ' . htmlspecialchars($child[1]) . ''; + } echo ""; echo "\n"; } diff --git a/table.inc.php b/table.inc.php index 9098f9f1..5d274953 100644 --- a/table.inc.php +++ b/table.inc.php @@ -24,6 +24,24 @@ if ($indexes) { echo "
\n"; } +$result = mysql_query("SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = '" . mysql_real_escape_string($_GET["db"]) . "' AND TABLE_NAME = '" . mysql_real_escape_string($_GET["table"]) . "' AND REFERENCED_TABLE_NAME IS NOT NULL ORDER BY ORDINAL_POSITION"); +if (mysql_num_rows($result)) { + $foreign_keys = array(); + while ($row = mysql_fetch_assoc($result)) { + $foreign_keys[$row["CONSTRAINT_NAME"]][0] = $row["REFERENCED_TABLE_SCHEMA"]; + $foreign_keys[$row["CONSTRAINT_NAME"]][1] = $row["REFERENCED_TABLE_NAME"]; + $foreign_keys[$row["CONSTRAINT_NAME"]][2][] = htmlspecialchars($row["COLUMN_NAME"]); + $foreign_keys[$row["CONSTRAINT_NAME"]][3][] = htmlspecialchars($row["REFERENCED_COLUMN_NAME"]); + } + echo "

" . lang('Foreign keys') . "

\n"; + echo "\n"; + foreach ($foreign_keys as $foreign_key) { + echo "\n"; + } + echo "
" . implode(", ", $foreign_key[2]) . "" . (strlen($foreign_key[0]) && $foreign_key[0] !== $_GET["db"] ? "" . htmlspecialchars($foreign_key[0]) . "." : "") . "" . htmlspecialchars($foreign_key[1]) . "(" . implode(", ", $foreign_key[3]) . ")
\n"; +} +mysql_free_result($result); + $result = mysql_query("SHOW TRIGGERS LIKE '" . mysql_real_escape_string($_GET["table"]) . "'"); if (mysql_num_rows($result)) { echo "

" . lang('Triggers') . "

\n";