diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index b43b8595..529f24d0 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -266,7 +266,7 @@ class Adminer { * @param array * @return array expressions to join by AND */ - function selectSearchProcess($indexes, $fields) { + function selectSearchProcess($fields, $indexes) { global $dbh; $return = array(); foreach ($indexes as $i => $index) { @@ -297,14 +297,13 @@ class Adminer { /** Process order box in select * @param array - * @param array result of selectColumnsProcess() * @param array * @return array expressions to join by comma */ - function selectOrderProcess($columns, $select, $indexes) { + function selectOrderProcess($fields, $indexes) { $return = array(); foreach ((array) $_GET["order"] as $key => $val) { - if (isset($columns[$val]) || in_array($val, $select, true)) { + if (isset($fields[$val]) || preg_match('~^[A-Z0-9_]+\\(`(?:[^`]+|``)+`\\)$~', $val)) { $return[] = idf_escape($val) . (isset($_GET["desc"][$key]) ? " DESC" : ""); } } diff --git a/adminer/select.inc.php b/adminer/select.inc.php index 429516dc..97cc423f 100644 --- a/adminer/select.inc.php +++ b/adminer/select.inc.php @@ -24,8 +24,8 @@ function apply_sql_function($function, $column) { } list($select, $group) = $adminer->selectColumnsProcess($columns, $indexes); -$where = $adminer->selectSearchProcess($indexes, $fields); -$order = $adminer->selectOrderProcess($columns, $select, $indexes); +$where = $adminer->selectSearchProcess($fields, $indexes); +$order = $adminer->selectOrderProcess($fields, $indexes); $limit = $adminer->selectLimitProcess(); $from = ($select ? implode(", ", $select) : "*") . " FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : ""); $group_by = ($group && count($group) < count($select) ? " GROUP BY " . implode(", ", $group) : "") . ($order ? " ORDER BY " . implode(", ", $order) : ""); @@ -140,7 +140,7 @@ if (!$columns) { $adminer->selectActionPrint($text_length); echo "\n"; - $query = "SELECT " . (intval($limit) && count($group) < count($select) ? "SQL_CALC_FOUND_ROWS " : "") . $from . $group_by . (strlen($limit) ? " LIMIT " . intval($limit) . (intval($_GET["page"]) ? " OFFSET " . ($limit * $_GET["page"]) : "") : ""); + $query = "SELECT " . (intval($limit) && $group && count($group) < count($select) ? "SQL_CALC_FOUND_ROWS " : "") . $from . $group_by . (strlen($limit) ? " LIMIT " . intval($limit) . (intval($_GET["page"]) ? " OFFSET " . ($limit * $_GET["page"]) : "") : ""); echo $adminer->selectQuery($query); $result = $dbh->query($query); @@ -158,7 +158,7 @@ if (!$columns) { } $result->free(); // use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest) - $found_rows = (intval($limit) && count($group) < count($select) + $found_rows = (intval($limit) && $group && count($group) < count($select) ? $dbh->result($dbh->query(" SELECT FOUND_ROWS()")) // space to allow mysql.trace_mode : count($rows) ); diff --git a/editor/include/adminer.inc.php b/editor/include/adminer.inc.php index 483ff1c1..88d85619 100644 --- a/editor/include/adminer.inc.php +++ b/editor/include/adminer.inc.php @@ -152,13 +152,13 @@ ORDER BY ORDINAL_POSITION"); //! requires MySQL 5 function selectOrderPrint($order, $columns, $indexes) { //! desc $orders = array(); - foreach ($indexes as $i => $index) { + foreach ($indexes as $key => $index) { $order = array(); foreach ($index["columns"] as $val) { $order[] = $this->fieldName(array("field" => $val, "comment" => $columns[$val])); } - if (count(array_filter($order, 'strlen')) > 1) { - $orders[$i] = implode(", ", $order); + if (count(array_filter($order, 'strlen')) > 1 && $key != "PRIMARY") { + $orders[$key] = implode(", ", $order); } } if ($orders) { @@ -200,7 +200,7 @@ ORDER BY ORDINAL_POSITION"); //! requires MySQL 5 return array(array(), array()); } - function selectSearchProcess($indexes, $fields) { + function selectSearchProcess($fields, $indexes) { $return = array(); foreach ((array) $_GET["where"] as $val) { if (strlen("$val[col]$val[val]")) { @@ -223,16 +223,33 @@ ORDER BY ORDINAL_POSITION"); //! requires MySQL 5 return $return; } - function selectOrderProcess($columns, $select, $indexes) { + function selectOrderProcess($fields, $indexes) { if ($_GET["order"]) { return array(idf_escape($_GET["order"][0]) . (isset($_GET["desc"][0]) ? " DESC" : "")); } - if ($_GET["index_order"]) { - return $indexes[$_GET["index_order"]]["columns"]; + $index = $indexes[$_GET["index_order"]]; + if (!strlen($_GET["index_order"])) { + foreach ($indexes as $index) { + if ($index["type"] == "INDEX") { + break; + } + } } - unset($indexes["PRIMARY"]); - $index = reset($indexes); - return ($index ? $index["columns"] : array()); + if (!$index) { + return array(); + } + $desc = false; + foreach ($index["columns"] as $val) { + if (ereg('date|timestamp', $fields[$val]["type"])) { + $desc = true; + break; + } + } + $return = array(); + foreach ($index["columns"] as $val) { + $return[] = idf_escape($val) . ($desc ? " DESC" : ""); + } + return $return; } function selectLimitProcess() {