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);
}
|