* @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) {
/** 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" : "");
}
}
}
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) : "");
$adminer->selectActionPrint($text_length);
echo "</form>\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);
}
$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)
);
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) {
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]")) {
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;
+ }
+ }
+ }
+ if (!$index) {
+ return array();
}
- unset($indexes["PRIMARY"]);
- $index = reset($indexes);
- return ($index ? $index["columns"] : 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() {