]> git.joonet.de Git - adminer.git/commitdiff
Select columns, aggregation
authorjakubvrana <jakubvrana@7c3ca157-0c34-0410-bff1-cbf682f78f5c>
Thu, 7 Aug 2008 10:57:28 +0000 (10:57 +0000)
committerjakubvrana <jakubvrana@7c3ca157-0c34-0410-bff1-cbf682f78f5c>
Thu, 7 Aug 2008 10:57:28 +0000 (10:57 +0000)
git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@437 7c3ca157-0c34-0410-bff1-cbf682f78f5c

index.php
lang/cs.inc.php
lang/de.inc.php
lang/es.inc.php
lang/nl.inc.php
lang/sk.inc.php
lang/zh.inc.php
select.inc.php

index 5778866359cfc2de29581f81dd81c0c552313fc7..71ca27bf582ea8ba8e1f450cacfb235d3f12106c 100644 (file)
--- a/index.php
+++ b/index.php
@@ -41,6 +41,8 @@ if (isset($_GET["download"])) {
        $unsigned = array("", "unsigned", "zerofill", "unsigned zerofill");
        $enum_length = '\'(?:\'\'|[^\'\\\\]+|\\\\.)*\'|"(?:""|[^"\\\\]+|\\\\.)*"';
        $inout = array("IN", "OUT", "INOUT");
+       $functions = array("char_length", "from_unixtime", "hex", "lower", "round", "sec_to_time", "time_to_sec", "unix_timestamp", "upper");
+       $grouping = array("avg", "count", "distinct", "group_concat", "max", "min", "sum");
        
        $error = "";
        if (isset($_GET["table"])) {
index 24b935bc63ad48434f9d4055312fc63b7dee8194..6b196afd73c85e8c5abdf061f3127255f663f30f 100644 (file)
@@ -154,7 +154,7 @@ $translations = array(
        '%d item(s) have been deleted.' => array('Byl smazán %d záznam.', 'Byly smazány %d záznamy.', 'Bylo smazáno %d záznamů.'),
        'all' => 'vše',
        'Delete selected' => 'Smazat označené',
-       'Truncate table' => 'Promazat tabulku',
+       'Truncate result' => 'Promazat výsledek',
        'Too big POST data. Reduce the data or increase the "post_max_size" configuration directive.' => 'Příliš velká POST data. Zmenšete data nebo zvyšte hodnotu konfigurační direktivy "post_max_size".',
        'Logged as: %s' => 'Přihlášen jako: %s',
        'Move up' => 'Přesunout nahoru',
index f7abc65bd1019b4e91d23f222ff3c7c1c9e3d0d8..fa726163606e7f709e4fff7588989e9f1aebc33e 100644 (file)
@@ -152,7 +152,6 @@ $translations = array(
        '%d item(s) have been deleted.' => array('%d Artikel gelöscht.', '%d Artikel gelöscht.'),
        'all' => 'alle',
        'Delete selected' => 'Markierte löschen',
-       'Truncate table' => 'Tabelleninhalt löschen (truncate)',
        'MySQL version: %s through PHP extension %s' => 'Version MySQL: %s, Zugriff unter Benutzung der PHP-Erweiterung %s',
        'around %d row(s)' => array('ungefähren %d Datensatz', 'ungefähren %d Datensätze'),
        'Logged as: %s' => 'Angemeldet als: %s',
index 3a932ce3e39acbbe2f2cc2f2ce40c1fb849b4a27..f2d1336da8ca0ea0f9d3d04fe7779b0bc4756f49 100644 (file)
@@ -152,7 +152,6 @@ $translations = array(
        '%d item(s) have been deleted.' => array('%d item eliminado.', '%d itemes eliminados.'),
        'all' => 'todos',
        'Delete selected' => 'Eliminar seleccionados',
-       'Truncate table' => 'Vaciar tabla (truncate)',
        'MySQL version: %s through PHP extension %s' => 'Versión MySQL: %s a través de extensión PHP %s',
        'around %d row(s)' => array('acaso %d fila', 'acaso %d filas'),
        'Logged as: %s' => 'Logeado como: %s',
index c835dbeeeceec36e20ba293d3842292a501ba222..019cd2776f02b8e424277f8619d0f1b0030a0202 100644 (file)
@@ -154,7 +154,6 @@ $translations = array(
        '%d item(s) have been deleted.' => array('%d item werd verwijderd.', '%d items warden verwijderd.'),
        'all' => 'alle',
        'Delete selected' => 'Geselecteerde verwijderen',
-       'Truncate table' => 'Tabel leegmaken',
        'Logged as: %s' => 'Aangemeld als: %s',
        'Too big POST data. Reduce the data or increase the "post_max_size" configuration directive.' => 'POST-data is te groot. Verklein de hoeveelheid data of verhoog de "post_max_size" configuratie.',
        'Move up' => 'Omhoog',
index 0c799be4447e27df8db0a814af607e2952eb65d5..c8cc2b40947d64281afeeb10928f0abb98b90aac 100644 (file)
@@ -154,7 +154,6 @@ $translations = array(
        '%d item(s) have been deleted.' => array('%d záznam bol zmazaný.', '%d záznamy boli zmazané.', '%d záznamov bolo zmazaných.'),
        'all' => 'všetko',
        'Delete selected' => 'Zmazať označené',
-       'Truncate table' => 'Vyprázdniť tabuľku',
        'Too big POST data. Reduce the data or increase the "post_max_size" configuration directive.' => 'Príliš veľké POST dáta. Zmenšite dáta alebo zvýšte hodnotu konfiguračej direktívy "post_max_size".',
        'Logged as: %s' => 'Prihlásený ako: %s',
        'Move up' => 'Presunúť hore',
index 6381772b28b0ccaea2b65a5cf5e3b3f8f12296d1..d963ea16a1e2cf13db2d9405595f5f8e74bab831 100644 (file)
@@ -154,7 +154,6 @@ $translations = array(
        '%d item(s) have been deleted.' => '%d 个项目被删除',
        'all' => '全部',
        'Delete selected' => '删除选中',
-       'Truncate table' => '截断表',
        'Logged as: %s' => '登录为: %s',
        'Too big POST data. Reduce the data or increase the "post_max_size" configuration directive.' => '太大的 POST 数据. 减少数据或者增加 "post_max_size" 配置指令.',
        'Move up' => '上移',
index dc139c34976ef65919e77ebaaf8a5b57ff9e0bbe..b4d796f26d9cb310a16ab87cdaf3eecb55b600bf 100644 (file)
@@ -19,6 +19,16 @@ foreach ($fields as $key => $field) {
        $rights += $field["privileges"];
 }
 
+$select = array();
+$group = array();
+foreach ((array) $_GET["columns"] as $key => $val) {
+       if ($val["fun"] == "count" || (in_array($val["col"], $columns, true) && (!$val["fun"] || in_array($val["fun"], $functions) || in_array($val["fun"], $grouping)))) {
+               $select[$key] = (in_array($val["col"], $columns, true) ? (!$val["fun"] ? idf_escape($val["col"]) : ($val["fun"] == "distinct" ? "COUNT(DISTINCT " : strtoupper("$val[fun](")) . idf_escape($val["col"]) . ")") : "COUNT(*)");
+               if (!in_array($val["fun"], $grouping)) {
+                       $group[] = $select[$key];
+               }
+       }
+}
 $where = array();
 foreach ($indexes as $i => $index) {
        if ($index["type"] == "FULLTEXT" && strlen($_GET["fulltext"][$i])) {
@@ -39,12 +49,12 @@ foreach ((array) $_GET["where"] as $val) {
 }
 $order = array();
 foreach ((array) $_GET["order"] as $key => $val) {
-       if (in_array($val, $columns, true)) {
+       if (in_array($val, $columns, true)) { //! respect functions
                $order[] = idf_escape($val) . (isset($_GET["desc"][$key]) ? " DESC" : "");
        }
 }
 $limit = (isset($_GET["limit"]) ? $_GET["limit"] : "30");
-$from = "FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : "") . (strlen($limit) ? " LIMIT " . intval($limit) . (intval($_GET["page"]) ? " OFFSET " . ($limit * $_GET["page"]) : "") : "");
+$from = "FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "") . ($group && count($group) < count($select) ? " GROUP BY " . implode(", ", $group) : "") . ($order ? " ORDER BY " . implode(", ", $order) : "") . (strlen($limit) ? " LIMIT " . intval($limit) . (intval($_GET["page"]) ? " OFFSET " . ($limit * $_GET["page"]) : "") : "");
 
 if ($_POST && !$error) {
        $result = true;
@@ -93,14 +103,46 @@ if (isset($rights["insert"])) {
 if (!$columns) {
        echo "<p class='error'>" . lang('Unable to select the table') . ($fields ? "" : ": " . htmlspecialchars($mysql->error)) . ".</p>\n";
 } else {
-       echo "<form action='' id='form'>\n<fieldset><legend>" . lang('Search') . "</legend>\n";
+       echo "<form action='' id='form'>\n";
+       ?>
+<script type="text/javascript">
+function add_row(field) {
+       var row = field.parentNode.cloneNode(true);
+       var selects = row.getElementsByTagName('select');
+       for (var i=0; i < selects.length; i++) {
+               selects[i].name = selects[i].name.replace(/[a-z]\[[0-9]+/, '$&1');
+               selects[i].selectedIndex = 0;
+       }
+       var inputs = row.getElementsByTagName('input');
+       if (inputs.length) {
+               inputs[0].name = inputs[0].name.replace(/[a-z]\[[0-9]+/, '$&1');
+               inputs[0].value = '';
+       }
+       field.parentNode.parentNode.appendChild(row);
+       field.onchange = function () { };
+}
+</script>
+<?php
+       echo "<fieldset><legend>" . lang('Select') . "</legend>\n";
        if (strlen($_GET["server"])) {
                echo '<input type="hidden" name="server" value="' . htmlspecialchars($_GET["server"]) . '" />';
        }
        echo '<input type="hidden" name="db" value="' . htmlspecialchars($_GET["db"]) . '" />';
        echo '<input type="hidden" name="select" value="' . htmlspecialchars($_GET["select"]) . '" />';
        echo "\n";
+       $i = 0;
+       $fun_group = array(lang('Functions') => $functions, lang('Aggregation') => $grouping);
+       foreach ($select as $key => $val) {
+               $val = $_GET["columns"][$key];
+               echo "<div><select name='columns[$i][fun]'><option></option>" . optionlist($fun_group, $val["fun"]) . "</select>";
+               echo "<select name='columns[$i][col]'><option></option>" . optionlist($columns, $val["col"]) . "</select></div>\n";
+               $i++;
+       }
+       echo "<div><select name='columns[$i][fun]' onchange='this.nextSibling.onchange();'><option></option>" . optionlist($fun_group) . "</select>";
+       echo "<select name='columns[$i][col]' onchange='add_row(this);'><option></option>" . optionlist($columns) . "</select></div>\n";
+       echo "</fieldset>\n";
        
+       echo "<fieldset><legend>" . lang('Search') . "</legend>\n";
        foreach ($indexes as $i => $index) {
                if ($index["type"] == "FULLTEXT") {
                        echo "(<i>" . implode("</i>, <i>", array_map('htmlspecialchars', $index["columns"])) . "</i>) AGAINST";
@@ -128,20 +170,6 @@ for (var i=0; <?php echo $i; ?> > i; i++) {
        document.getElementById('form')['where[' + i + '][op]'].onchange();
 }
 <?php } ?>
-
-function add_row(field) {
-       var row = field.parentNode.cloneNode(true);
-       var selects = row.getElementsByTagName('select');
-       for (var i=0; i < selects.length; i++) {
-               selects[i].name = selects[i].name.replace(/[a-z]\[[0-9]+/, '$&1');
-               selects[i].selectedIndex = 0;
-       }
-       var input = row.getElementsByTagName('input')[0];
-       input.name = input.name.replace(/[a-z]\[[0-9]+/, '$&1');
-       input.value = '';
-       field.parentNode.parentNode.appendChild(row);
-       field.onchange = function () { };
-}
 </script>
 <?php
        echo "<div><select name='where[$i][col]' onchange='add_row(this);'><option></option>" . optionlist($columns) . "</select>";
@@ -176,7 +204,7 @@ function add_row(field) {
        echo "</form>\n";
        echo "<div style='clear: left;'>&nbsp;</div>\n";
        
-       $result = $mysql->query("SELECT * $from");
+       $result = $mysql->query("SELECT " . ($select ? (count($group) < count($select) ? "SQL_CALC_FOUND_ROWS " : "") . implode(", ", $select) : "*") . " $from");
        if (!$result) {
                echo "<p class='error'>" . htmlspecialchars($mysql->error) . "</p>\n";
        } else {
@@ -194,14 +222,14 @@ function add_row(field) {
                        echo "<table border='1' cellspacing='0' cellpadding='2'>\n";
                        for ($j=0; $row = $result->fetch_assoc(); $j++) {
                                if (!$j) {
-                                       echo '<thead><tr><td><label><input type="checkbox" name="delete_selected" value="1" onclick="var elems = this.form.elements; for (var i=0; i < elems.length; i++) if (elems[i].name == \'delete[]\') elems[i].checked = this.checked;" />' . lang('all') . '</label></td>';
+                                       echo '<thead><tr>' . (count($select) == count($group) ? '<td><label><input type="checkbox" name="delete_selected" value="1" onclick="var elems = this.form.elements; for (var i=0; i < elems.length; i++) if (elems[i].name == \'delete[]\') elems[i].checked = this.checked;" />' . lang('all') . '</label></td>' : '');
                                        foreach ($row as $key => $val) {
                                                echo '<th><a href="' . remove_from_uri('(order|desc)[^=]*') . '&amp;order%5B0%5D=' . htmlspecialchars($key) . ($_GET["order"][0] === $key && !$_GET["desc"][0] ? '&amp;desc%5B0%5D=1' : '') . '">' . htmlspecialchars($key) . "</a></th>";
                                        }
                                        echo "</tr></thead>\n";
                                }
                                $unique_idf = implode('&amp;', unique_idf($row, $indexes));
-                               echo '<tr><td><input type="checkbox" name="delete[]" value="' . $unique_idf . '" /> <a href="' . htmlspecialchars($SELF) . 'edit=' . urlencode($_GET['select']) . '&amp;' . $unique_idf . '">' . lang('edit') . "</a></td>";
+                               echo '<tr>' . (count($select) == count($group) ? '<td><input type="checkbox" name="delete[]" value="' . $unique_idf . '" /> <a href="' . htmlspecialchars($SELF) . 'edit=' . urlencode($_GET['select']) . '&amp;' . $unique_idf . '">' . lang('edit') . '</a></td>' : '');
                                foreach ($row as $key => $val) {
                                        if (!isset($val)) {
                                                $val = "<i>NULL</i>";
@@ -234,9 +262,9 @@ function add_row(field) {
                                echo "</tr>\n";
                        }
                        echo "</table>\n";
-                       echo "<p><input type='hidden' name='token' value='$token' /><input type='submit' value='" . lang('Delete selected') . "' /> <input type='submit' name='truncate' value='" . lang('Truncate table') . "' onclick=\"return confirm('" . lang('Are you sure?') . "');\" /></p>\n";
+                       echo "<p><input type='hidden' name='token' value='$token' />" . (count($group) == count($select) ? "<input type='submit' value='" . lang('Delete selected') . "' /> " : "") . "<input type='submit' name='truncate' value='" . lang('Truncate result') . "' onclick=\"return confirm('" . lang('Are you sure?') . "');\" /></p>\n";
                        echo "</form>\n";
-                       if (intval($limit) && ($found_rows = $mysql->result($mysql->query("SELECT COUNT(*) FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "")))) > $limit) {
+                       if (intval($limit) && ($found_rows = $mysql->result($mysql->query(count($group) < count($select) ? " SELECT FOUND_ROWS()" : "SELECT COUNT(*) FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "")))) > $limit) {
                                $max_page = floor(($found_rows - 1) / $limit);
                                echo "<p>" . lang('Page') . ":";
                                print_page(0);