From 228e43a0fdaa36f004612508ee5c15cfa47283fc Mon Sep 17 00:00:00 2001 From: jakubvrana Date: Mon, 20 Jul 2009 15:34:05 +0000 Subject: [PATCH] Row descriptions in select git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@856 7c3ca157-0c34-0410-bff1-cbf682f78f5c --- adminer/include/adminer.inc.php | 9 ++++++++ adminer/select.inc.php | 7 +++--- editor/include/adminer.inc.php | 38 +++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index 3e16210f..ad8c1be2 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -57,6 +57,15 @@ function adminer_select_query($query) { return call_adminer('select_query', "

" . htmlspecialchars($query) . " " . lang('Edit') . "\n", $query); } +/** Descriptions of selected data +* @param array all data to print +* @param array foreign keys +* @return array +*/ +function adminer_row_descriptions($rows, $foreign_keys) { + return call_adminer('row_descriptions', $rows, $rows, $foreign_keys); +} + /** Value printed in select table * @param string escaped value to print * @param string link to foreign key diff --git a/adminer/select.inc.php b/adminer/select.inc.php index ac5ba0e1..fab31791 100644 --- a/adminer/select.inc.php +++ b/adminer/select.inc.php @@ -282,6 +282,7 @@ if (!$columns) { $foreign_keys[$val][] = $foreign_key; } } + $descriptions = adminer_row_descriptions($rows, $foreign_keys); //! Editor only $backward_keys = array(); @@ -306,7 +307,7 @@ if (!$columns) { echo '' . adminer_field_name($fields, $key) . ''; } echo ($backward_keys ? "" . lang('Relations') : "") . "\n"; - foreach ($rows as $row) { + foreach ($descriptions as $n => $row) { $unique_idf = implode('&', unique_idf($row, $indexes)); //! don't use aggregation functions echo '' . (count($select) != count($group) || information_schema($_GET["db"]) ? '' : ' ' . lang('edit') . ''); foreach ($row as $key => $val) { @@ -334,7 +335,7 @@ if (!$columns) { foreach ((array) $foreign_keys[$key] as $foreign_key) { if (count($foreign_keys[$key]) == 1 || count($foreign_key["source"]) == 1) { foreach ($foreign_key["source"] as $i => $source) { - $link .= where_link($i, $foreign_key["target"][$i], $row[$source]); + $link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]); } $link = htmlspecialchars((strlen($foreign_key["db"]) ? preg_replace('~([?&]db=)[^&]+~', '\\1' . urlencode($foreign_key["db"]), $SELF) : $SELF) . 'select=' . urlencode($foreign_key["table"])) . $link; // InnoDB supports non-UNIQUE keys break; @@ -351,7 +352,7 @@ if (!$columns) { echo ' ' . htmlspecialchars($table) . ''; //! adminer_table_name() diff --git a/editor/include/adminer.inc.php b/editor/include/adminer.inc.php index a5a113d8..0f6f4507 100644 --- a/editor/include/adminer.inc.php +++ b/editor/include/adminer.inc.php @@ -29,6 +29,44 @@ function adminer_select_query($query) { return call_adminer('select_query', "\n", $query); } +function adminer_row_descriptions($rows, $foreign_keys) { + global $dbh; + $return = $rows; + foreach ($rows[0] as $key => $val) { + foreach ((array) $foreign_keys[$key] as $foreign_key) { + if (count($foreign_key["source"]) == 1) { + $id = idf_escape($foreign_key["target"][0]); + // find out the description column - first varchar + $name = $id; + foreach (fields($foreign_key["table"]) as $field) { + if ($field["type"] == "varchar") { + $name = idf_escape($field["field"]); + break; + } + } + // find all used ids + $ids = array(); + foreach ($rows as $row) { + $ids[$row[$key]] = $dbh->quote($row[$key]); + } + // select all descriptions + $descriptions = array(); + $result = $dbh->query("SELECT $id, $name FROM " . idf_escape($foreign_key["table"]) . " WHERE $id IN (" . implode(", ", $ids) . ")"); + while ($row = $result->fetch_row()) { + $descriptions[$row[0]] = $row[1]; + } + $result->free(); + // use the descriptions + foreach ($rows as $n => $row) { + $return[$n][$key] = $descriptions[$row[$key]]; + } + break; + } + } + } + return call_adminer('row_descriptions', $return, $rows, $foreign_keys); +} + function adminer_select_val($val, $link) { return call_adminer('select_val', ($link ? '' . $val . '' : $val), $val, $link); }