diff --git a/ChangeLog b/ChangeLog
index 03378d723f..7ebbba2b03 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -41,6 +41,8 @@ phpMyAdmin - ChangeLog
- issue #13628 Fixed javascript error in server monitor
- issue #13444 Fixed server monitor on non Linux and Windows systems
- issue #13633 Reload javscript messages when changing language
+- issue #13604 Fixed crash on invalid ordering data
+- issue #13639 Fixed error when browsing non SELECT results
4.7.4 (2017-08-23)
- issue #13415 Remove shadow from the logo
diff --git a/libraries/classes/DisplayResults.php b/libraries/classes/DisplayResults.php
index ed1e43e677..4977b4c6bc 100644
--- a/libraries/classes/DisplayResults.php
+++ b/libraries/classes/DisplayResults.php
@@ -1307,9 +1307,7 @@ class DisplayResults
. '';
// Output data needed for column reordering and show/hide column
- if ($this->_isSelect($analyzed_sql_results)) {
- $table_headers_html .= $this->_getDataForResettingColumnOrder();
- }
+ $table_headers_html .= $this->_getDataForResettingColumnOrder($analyzed_sql_results);
$display_params['emptypre'] = 0;
$display_params['emptyafter'] = 0;
@@ -1650,28 +1648,32 @@ class DisplayResults
/**
* Prepare data for column restoring and show/hide
*
+ * @param array $analyzed_sql_results analyzed sql results
+ *
* @return string $data_html html content
*
* @access private
*
* @see _getTableHeaders()
*/
- private function _getDataForResettingColumnOrder()
+ private function _getDataForResettingColumnOrder($analyzed_sql_results)
{
-
- $data_html = '';
+ if (! $this->_isSelect($analyzed_sql_results)) {
+ return '';
+ }
// generate the column order, if it is set
- $pmatable = new Table($this->__get('table'), $this->__get('db'));
- $col_order = $pmatable->getUiProp(Table::PROP_COLUMN_ORDER);
+ list($col_order, $col_visib) = $this->_getColumnParams(
+ $analyzed_sql_results
+ );
+
+ $data_html = '';
if ($col_order) {
$data_html .= '';
}
- $col_visib = $pmatable->getUiProp(Table::PROP_COLUMN_VISIB);
-
if ($col_visib) {
$data_html .= '';
@@ -3393,6 +3395,16 @@ class DisplayResults
if ($this->_isSelect($analyzed_sql_results)) {
$pmatable = new Table($this->__get('table'), $this->__get('db'));
$col_order = $pmatable->getUiProp(Table::PROP_COLUMN_ORDER);
+ /* Validate the value */
+ if ($col_order !== false) {
+ $fields_cnt = $this->__get('fields_cnt');
+ foreach ($col_order as $value) {
+ if ($value >= $fields_cnt) {
+ $this->removeUiProp(Table::PROP_COLUMN_ORDER);
+ $fields_cnt = false;
+ }
+ }
+ }
$col_visib = $pmatable->getUiProp(Table::PROP_COLUMN_VISIB);
} else {
$col_order = false;
@@ -4243,7 +4255,11 @@ class DisplayResults
* The statement this table is built for.
* @var \PhpMyAdmin\SqlParser\Statements\SelectStatement
*/
- $statement = $analyzed_sql_results['statement'];
+ if (isset($analyzed_sql_results['statement'])) {
+ $statement = $analyzed_sql_results['statement'];
+ } else {
+ $statement = null;
+ }
$table_html = '';
// Following variable are needed for use in isset/empty or
@@ -4294,7 +4310,7 @@ class DisplayResults
$sort_expression_nodirection = array();
$sort_direction = array();
- if (!empty($statement->order)) {
+ if (!is_null($statement) && !empty($statement->order)) {
foreach ($statement->order as $o) {
$sort_expression[] = $o->expr->expr . ' ' . $o->type;
$sort_expression_nodirection[] = $o->expr->expr;
@@ -4372,7 +4388,7 @@ class DisplayResults
$sort_by_key_html = $unsorted_sql_query = '';
}
- if (($displayParts['nav_bar'] == '1') && (empty($statement->limit))) {
+ if (($displayParts['nav_bar'] == '1') && !is_null($statement) && (empty($statement->limit))) {
$table_html .= $this->_getPlacedTableNavigations(
$pos_next, $pos_prev, self::PLACE_TOP_DIRECTION_DROPDOWN,
$is_innodb, $sort_by_key_html
@@ -4386,7 +4402,7 @@ class DisplayResults
$map = array();
$target = array();
- if (!empty($statement->from)) {
+ if (!is_null($statement) && !empty($statement->from)) {
foreach ($statement->from as $field) {
if (!empty($field->table)) {
$target[] = $field->table;
@@ -4455,7 +4471,7 @@ class DisplayResults
}
// 5. ----- Get the navigation bar at the bottom if required -----
- if (($displayParts['nav_bar'] == '1') && empty($statement->limit)) {
+ if (($displayParts['nav_bar'] == '1') && !is_null($statement) && empty($statement->limit)) {
$table_html .= $this->_getPlacedTableNavigations(
$pos_next, $pos_prev, self::PLACE_BOTTOM_DIRECTION_DROPDOWN,
$is_innodb, $sort_by_key_html
diff --git a/libraries/classes/Sql.php b/libraries/classes/Sql.php
index 1050e10a6d..1963f8a1ce 100644
--- a/libraries/classes/Sql.php
+++ b/libraries/classes/Sql.php
@@ -1315,6 +1315,9 @@ EOT;
*/
public static function deleteTransformationInfo($db, $table, $analyzed_sql_results)
{
+ if (! isset($analyzed_sql_results['statement'])) {
+ return;
+ }
$statement = $analyzed_sql_results['statement'];
if ($statement instanceof AlterStatement) {
if (!empty($statement->altered[0])
@@ -1674,7 +1677,7 @@ EOT;
} while ($GLOBALS['dbi']->moreResults() && $GLOBALS['dbi']->nextResult());
} else {
- if (isset($result) && $result) {
+ if (isset($result) && $result !== false) {
$fields_meta = $GLOBALS['dbi']->getFieldsMeta($result);
$fields_cnt = count($fields_meta);
}
@@ -1883,7 +1886,7 @@ EOT;
$updatableView = false;
- $statement = $analyzed_sql_results['statement'];
+ $statement = isset($analyzed_sql_results['statement']) ? $analyzed_sql_results['statement'] : null;
if ($statement instanceof SelectStatement) {
if (!empty($statement->expr)) {
if ($statement->expr[0]->expr === '*') {
diff --git a/libraries/classes/Table.php b/libraries/classes/Table.php
index a67337a69e..b0c167b6b8 100644
--- a/libraries/classes/Table.php
+++ b/libraries/classes/Table.php
@@ -1841,7 +1841,7 @@ class Table
}
}
// remove the property, since it no longer exists in database
- $this->removeUiProp(self::PROP_SORTED_COLUMN);
+ $this->removeUiProp($property);
return false;
}
@@ -1859,7 +1859,7 @@ class Table
}
// remove the property, since the table has been modified
- $this->removeUiProp(self::PROP_COLUMN_ORDER);
+ $this->removeUiProp($property);
return false;
}