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 = '$val";
}
echo '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 "" . 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";
+ }
+ echo "
\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";