diff --git a/libraries/Types.class.php b/libraries/Types.class.php index ec14814dc5..ae63411501 100644 --- a/libraries/Types.class.php +++ b/libraries/Types.class.php @@ -148,18 +148,24 @@ class PMA_Types /** * Returns operators for given type as html options * - * @param string $type Type of field - * @param boolean $null Whether field can be NULL + * @param string $type Type of field + * @param boolean $null Whether field can be NULL + * @param string $selectedOperator Option to be selected * - * @return array + * @return string Generated Html */ - public function getTypeOperatorsHtml($type, $null) + public function getTypeOperatorsHtml($type, $null, $selectedOperator = null) { $html = ''; foreach ($this->getTypeOperators($type, $null) as $fc) { - $escaped = htmlspecialchars($fc); - $html .= ''; + if (isset($selectedOperator) && $selectedOperator == $fc) { + $html .= ''; + } else { + $html .= ''; + } } return $html; diff --git a/libraries/tbl_select.lib.php b/libraries/tbl_select.lib.php index b2dada9821..ae94346cde 100644 --- a/libraries/tbl_select.lib.php +++ b/libraries/tbl_select.lib.php @@ -44,7 +44,7 @@ function PMA_tbl_getFields($db, $table) } else { // strip the "BINARY" attribute, except if we find "BINARY(" because // this would be a BINARY or VARBINARY field type - if (!preg_match('@BINARY[\(]@i', $type)) { + if (! preg_match('@BINARY[\(]@i', $type)) { $type = preg_replace('@BINARY@i', '', $type); } $type = preg_replace('@ZEROFILL@i', '', $type); @@ -331,7 +331,7 @@ function PMA_tbl_search_getWhereClause($fields, $names, $types, $collations, $w = $backquoted_name . ' ' . $func_type . ' ' . $gis_data; } elseif (strncasecmp($types, 'enum', 4) == 0) { - if (!empty($fields)) { + if (! empty($fields)) { if (! is_array($fields)) { $fields = explode(',', $fields); } @@ -410,4 +410,356 @@ function PMA_tbl_search_getWhereClause($fields, $names, $types, $collations, return $w; } + +/** + * Builds the sql search query from the post parameters + * + * @param string $table Selected table + * @param array $fields Entered values of the columns + * @param array $criteriaColumnNames Names of all columns + * @param array $criteriaColumnTypes Types of all columns + * @param array $criteriaColumnCollations Collations of all columns + * @param array $criteriaColumnOperators Operators for given column type + * + * @return string the generated SQL query + */ +function PMA_tblSearchBuildSqlQuery($table, $fields, $criteriaColumnNames, + $criteriaColumnTypes, $criteriaColumnCollations, $criteriaColumnOperators) +{ + $sql_query = 'SELECT '; + + // If only distinct values are needed + $is_distinct = (isset($_POST['distinct'])) ? 'true' : 'false'; + if ($is_distinct == 'true') { + $sql_query .= 'DISTINCT '; + } + + // if all column names were selected to display, we do a 'SELECT *' + // (more efficient and this helps prevent a problem in IE + // if one of the rows is edited and we come back to the Select results) + if (count($_POST['columnsToDisplay']) == count($criteriaColumnNames)) { + $sql_query .= '* '; + } else { + $sql_query .= implode(', ', PMA_backquote($_POST['columnsToDisplay'])); + } // end if + + $sql_query .= ' FROM ' . PMA_backquote($table); + $whereClause = PMA_tblSearchGenerateWhereClause( + $fields, $criteriaColumnNames, $criteriaColumnTypes, + $criteriaColumnCollations, $criteriaColumnOperators + ); + $sql_query .= $whereClause; + + // if the search results are to be ordered + if ($_POST['orderByColumn'] != '--nil--') { + $sql_query .= ' ORDER BY ' . PMA_backquote($_POST['orderByColumn']) + . ' ' . $_POST['order']; + } // end if + return $sql_query; +} + +/** + * Generates the where clause for the SQL search query to be executed + * + * @param array $fields Entered values of the columns + * @param array $criteriaColumnNames Names of all columns + * @param array $criteriaColumnTypes Types of all columns + * @param array $criteriaColumnCollations Collations of all columns + * @param array $criteriaColumnOperators Operators for given column type + * + * @return string the generated where clause + */ +function PMA_tblSearchGenerateWhereClause($fields, $criteriaColumnNames, + $criteriaColumnTypes, $criteriaColumnCollations, $criteriaColumnOperators) +{ + $fullWhereClause = ''; + + if (trim($_POST['customWhereClause']) != '') { + $fullWhereClause .= ' WHERE ' . $_POST['customWhereClause']; + return $fullWhereClause; + } + + // If there are no search criterias set, return + if (! array_filter($fields)) { + return $fullWhereClause; + } + + // else continue to form the where clause from column criteria values + $fullWhereClause = $charsets = array(); + reset($criteriaColumnOperators); + while (list($i, $operator) = each($criteriaColumnOperators)) { + list($charsets[$i]) = explode('_', $criteriaColumnCollations[$i]); + $unaryFlag = $GLOBALS['PMA_Types']->isUnaryOperator($operator); + $tmp_geom_func = isset($geom_func[$i]) ? $geom_func[$i] : null; + + $whereClause = PMA_tbl_search_getWhereClause( + $fields[$i], $criteriaColumnNames[$i], $criteriaColumnTypes[$i], + $criteriaColumnCollations[$i], $operator, $unaryFlag, $tmp_geom_func + ); + + if ($whereClause) { + $fullWhereClause[] = $whereClause; + } + } // end while + + if ($fullWhereClause) { + $fullWhereClause = ' WHERE ' . implode(' AND ', $fullWhereClause); + } + return $fullWhereClause; +} + +/** + * Generates HTML for a geometrical function column to be displayed in table + * search selection form + * + * @param boolean $geomColumnFlag whether a geometry column is present + * @param array $columnTypes array containing types of all columns in the table + * @param array $geom_types array of GIS data types + * @param integer $column_index index of current column in $columnTypes array + * + * @return string the generated HTML + */ +function PMA_tblSearchGetGeomFuncHtml($geomColumnFlag, $columnTypes, +$geom_types, $column_index) +{ + $html_output = ''; + // return if geometrical column is not present + if (! $geomColumnFlag) { + return $html_output; + } + + /** + * Displays 'Function' column if it is present + */ + $html_output .= ''; + // if a geometry column is present + if (in_array($columnTypes[$column_index], $geom_types)) { + $html_output .= ''; + } else { + $html_output .= ' '; + } + $html_output .= ''; + return $html_output; +} + +/** + * Generates formatted HTML for extra search options in table search form + * + * @param array $columnNames Array containing types of all columns in the table + * @param integer $columnCount Number of columns in the table + * + * @return string the generated HTML + */ +function PMA_tblSearchGetOptions($columnNames, $columnCount) +{ + $html_output = ''; + $html_output .= PMA_getDivForSliderEffect('searchoptions', __('Options')); + /** + * Displays columns select list for selecting distinct columns in the search + */ + $html_output .= '
' + . '' . __('Select columns (at least one):') . '' + . '' + . '' + . '
'; + + /** + * Displays input box for custom 'Where' clause to be used in the search + */ + $html_output .= '
' + . '' . '' . __('Or') . ' ' + . __('Add search conditions (body of the "where" clause):') . ''; + $html_output .= PMA_showMySQLDocu('SQL-Syntax', 'Functions'); + $html_output .= '' + . '
'; + + /** + * Displays option of changing default number of rows displayed per page + */ + $html_output .= '
' + . '' . __('Number of rows per page') . '' + . '' + . '
'; + + /** + * Displays option for ordering search results by a column value (Asc or Desc) + */ + $html_output .= '
' + . '' . __('Display order:') . '' + . ''; + $choices = array( + 'ASC' => __('Ascending'), + 'DESC' => __('Descending') + ); + $html_output .= PMA_getRadioFields('order', $choices, 'ASC', false, true, "formelement"); + unset($choices); + + $html_output .= '

'; + return $html_output; +} + +/** + * Generates HTML for displaying fields table in search form + * + * @param array $columnNames Names of columns in the table + * @param array $columnTypes Types of columns in the table + * @param array $columnCollations Collation of all columns + * @param array $columnNullFlags Null information of columns + * @param boolean $geomColumnFlag Whether a geometry column is present + * @param integer $columnCount Number of columns in the table + * @param array $foreigners Array of foreign keys + * @param string $db Selected database + * @param string $table Selected table + * + * @return string the generated HTML + */ +function PMA_tblSearchGetFieldsTableHtml($columnNames, $columnTypes, +$columnCollations, $columnNullFlags, $geomColumnFlag, $columnCount, +$foreigners, $db, $table) +{ + $html_output = ''; + $html_output .= ''; + $html_output .= PMA_tbl_setTableHeader($geomColumnFlag) . ''; + $odd_row = true; + $titles['Browse'] = PMA_getIcon('b_browse.png', __('Browse foreign values')); + $geom_types = PMA_getGISDatatypes(); + + // for every column present in table + for ($i = 0; $i < $columnCount; $i++) { + $html_output .= ''; + $odd_row = !$odd_row; + + /** + * If 'Function' column is present + */ + $html_output .= PMA_tblSearchGetGeomFuncHtml( + $geomColumnFlag, $columnTypes, $geom_types, $i + ); + /** + * Displays column's name, type and collation + */ + $html_output .= ''; + $html_output .= ''; + $html_output .= ''; + /** + * Displays column's comparison operators depending on column type + */ + $html_output .= ''; + /** + * Displays column's foreign relations if any + */ + $html_output .= ''; + } // end for + + $html_output .= '
' . htmlspecialchars($columnNames[$i]) . '' . htmlspecialchars($columnTypes[$i]) . '' . $columnCollations[$i] . ''; + $field = $columnNames[$i]; + $foreignData = PMA_getForeignData($foreigners, $field, false, '', ''); + $html_output .= PMA_getForeignFields_Values( + $foreigners, $foreignData, $field, $columnTypes, $i, $db, $table, + $titles, $GLOBALS['cfg']['ForeignKeyMaxLimit'], '', true + ); + + $html_output .= '' + . '' + . '
'; + return $html_output; +} + +/** + * Generates the table search form under table search tab + * + * @param string $goto Goto URL + * @param array $columnNames Names of columns in the table + * @param array $columnTypes Types of columns in the table + * @param array $columnCollations Collation of all columns + * @param array $columnNullFlags Null information of columns + * @param boolean $geomColumnFlag Whether a geometry column is present + * @param integer $columnCount Number of columns in the table + * @param array $foreigners Array of foreign keys + * @param string $db Selected database + * @param string $table Selected table + * + * @return string the generated HTML for table search form + */ +function PMA_tblSearchGetSelectionForm($goto, $columnNames, $columnTypes, +$columnCollations, $columnNullFlags, $geomColumnFlag, $columnCount, +$foreigners, $db, $table) +{ + $html_output = ''; + $html_output .= '
'; + $url_params = array(); + $url_params['db'] = $db; + $url_params['table'] = $table; + + $html_output .= PMA_generateHtmlTabs(PMA_tbl_getSubTabs(), $url_params, 'topmenu2'); + $html_output .= '
'; + $html_output .= PMA_generate_common_hidden_inputs($db, $table); + $html_output .= ''; + $html_output .= '' + . '
'; + return $html_output; +} ?> diff --git a/tbl_select.php b/tbl_select.php index a0a7ac9b45..dd3dd733ec 100644 --- a/tbl_select.php +++ b/tbl_select.php @@ -23,26 +23,16 @@ $GLOBALS['js_include'][] = 'tbl_change.js'; $GLOBALS['js_include'][] = 'jquery/timepicker.js'; $GLOBALS['js_include'][] = 'gis_data_editor.js'; -$titles['Browse'] = PMA_getIcon('b_browse.png', __('Browse foreign values')); - -$geom_types = PMA_getGISDatatypes(); - $post_params = array( 'ajax_request', - 'collations', + 'criteriaColumnCollations', 'db', - 'distinct', 'fields', - 'func', - 'max_number_of_fields', - 'names', - 'order', - 'orderField', - 'param', + 'criteriaColumnOperators', + 'criteriaColumnNames', 'session_max_rows', 'table', - 'types', - 'where', + 'criteriaColumnTypes', ); foreach ($post_params as $one_post_param) { if (isset($_POST[$one_post_param])) { @@ -54,14 +44,14 @@ foreach ($post_params as $one_post_param) { /** * Not selection yet required -> displays the selection form */ -if (! isset($param) || $param[0] == '') { +if (! isset($_POST['columnsToDisplay']) || $_POST['columnsToDisplay'][0] == '') { // Gets some core libraries include_once 'libraries/tbl_common.inc.php'; //$err_url = 'tbl_select.php' . $err_url; $url_query .= '&goto=tbl_select.php&back=tbl_select.php'; /** - * Gets tables informations + * Gets table's information */ include_once 'libraries/tbl_info.inc.php'; @@ -72,230 +62,30 @@ if (! isset($param) || $param[0] == '') { $err_url = $goto . '?' . PMA_generate_common_url($db, $table); // Gets the list and number of fields - list($fields_list, $fields_type, $fields_collation, $fields_null, $geom_column_present) + list($columnNames, $columnTypes, $columnCollations, $columnNullFlags, $geomColumnFlag) = PMA_tbl_getFields($db, $table); - $fields_cnt = count($fields_list); + $columnCount = count($columnNames); // retrieve keys into foreign fields, if any // check also foreigners even if relwork is FALSE (to get // foreign keys from innodb) $foreigners = PMA_getForeigners($db, $table); - ?> -
- - -
> - - - - - -
- - -
-
-
-
- do the work */ - - // Builds the query - - $sql_query = 'SELECT ' . (isset($distinct) ? 'DISTINCT ' : ''); - - // if all fields were selected to display, we do a SELECT * - // (more efficient and this helps prevent a problem in IE - // if one of the rows is edited and we come back to the Select results) - - if (count($param) == $max_number_of_fields) { - $sql_query .= '* '; - } else { - $param = PMA_backquote($param); - $sql_query .= implode(', ', $param); - } // end if - - // avoid a loop, for example when $cfg['DefaultTabTable'] is set - // to 'tbl_select.php' - unset($param); - - $sql_query .= ' FROM ' . PMA_backquote($table); - - // The where clause - if (trim($where) != '') { - $sql_query .= ' WHERE ' . $where; - } else { - $w = $charsets = array(); - $cnt_func = count($func); - reset($func); - while (list($i, $func_type) = each($func)) { - - list($charsets[$i]) = explode('_', $collations[$i]); - $unaryFlag = $GLOBALS['PMA_Types']->isUnaryOperator($func_type); - - $tmp_geom_func = isset($geom_func[$i]) ? $geom_func[$i] : null; - $whereClause = PMA_tbl_search_getWhereClause( - $fields[$i], $names[$i], $types[$i], $collations[$i], - $func_type, $unaryFlag, $tmp_geom_func - ); - - if ($whereClause) { - $w[] = $whereClause; - } - } // end while - if ($w) { - $sql_query .= ' WHERE ' . implode(' AND ', $w); - } - } // end if - - if ($orderField != '--nil--') { - $sql_query .= ' ORDER BY ' . PMA_backquote($orderField) . ' ' . $order; - } // end if + $sql_query = PMA_tblSearchBuildSqlQuery( + $table, $fields, $criteriaColumnNames, $criteriaColumnTypes, + $criteriaColumnCollations, $criteriaColumnOperators + ); include 'sql.php'; } - ?> diff --git a/tbl_zoom_select.php b/tbl_zoom_select.php index ca2d40fbaa..0e705ddf58 100644 --- a/tbl_zoom_select.php +++ b/tbl_zoom_select.php @@ -45,7 +45,6 @@ $post_params = array( 'fields', 'fields_null', 'inputs', - 'max_number_of_fields', 'maxPlotLimit', 'types', 'zoom_submit', @@ -170,7 +169,6 @@ $fields_cnt = count($fields_list); // check also foreigners even if relwork is FALSE (to get // foreign keys from innodb) $foreigners = PMA_getForeigners($db, $table); -$flag = 1; $tbl_fields_type = $tbl_fields_collation = $tbl_fields_null = array(); if (! isset($zoom_submit) && ! isset($inputs)) { @@ -189,13 +187,30 @@ echo PMA_generateHtmlTabs(PMA_tbl_getSubTabs(), $url_params, 'topmenu2'); * Set the field name,type,collation and whether null on select of a coulmn */ if (isset($inputs) && ($inputs[0] != 'pma_null' || $inputs[1] != 'pma_null')) { - $flag = 2; for ($i = 0 ; $i < 4 ; $i++) { if ($inputs[$i] != 'pma_null') { $key = array_search($inputs[$i], $fields_list); $tbl_fields_type[$i] = $fields_type[$key]; $tbl_fields_collation[$i] = $fields_collation[$key]; - $tbl_fields_null[$i] = $fields_null[$key]; + $tbl_fields_func[$i] = ''; + $foreignData = PMA_getForeignData($foreigners, $inputs[$i], false, '', ''); + $tbl_fields_value[$i] = PMA_getForeignFields_Values( + $foreigners, + $foreignData, + $inputs[$i], + $tbl_fields_type, + $i, + $db, + $table, + $titles, + $GLOBALS['cfg']['ForeignKeyMaxLimit'], + $fields + ); } } } @@ -210,7 +225,6 @@ if (isset($inputs) && ($inputs[0] != 'pma_null' || $inputs[1] != 'pma_null')) { -
@@ -244,10 +258,10 @@ for ($i = 0; $i < 4; $i++) { } } ?> - - - - + + + + ';
-