diff --git a/ChangeLog b/ChangeLog index 988714adf..f72d97dcc 100755 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,11 @@ phpMyAdmin - Changelog $Id$ $Source$ +2004-04-07 Marc Delisle + * tbl_select.php, lang/*: feature 788608: new features for Search: + DISTINCT, IS NULL, IS NOT NULL, NOT LIKE, multiple select for ENUM, + and column title is now Operator, thanks to Philippe (jausions) + 2004-04-08 Marcel Tschopp * phpinfo.php, tbl_relation.php, libraries/display_tbl.lib.php libraries/mysql_wrappers.lib.php, libraries/dbi/mysql.dbi.lib.php diff --git a/tbl_select.php b/tbl_select.php index be5c07a05..b60055cb6 100644 --- a/tbl_select.php +++ b/tbl_select.php @@ -36,8 +36,13 @@ if ($cfg['PropertiesIconic'] == true) { * * LIKE works also on integers and dates so I added it in numfunctions */ -$numfunctions = array('=', '>', '>=', '<', '<=', '!=', 'LIKE'); -$textfunctions = array('LIKE', '=', '!='); +$numfunctions = array('=', '>', '>=', '<', '<=', '!=', 'LIKE', 'NOT LIKE'); +$textfunctions = array('LIKE', 'NOT LIKE', '=', '!='); +$enumfunctions = array('=', '!='); +$nullfunctions = array('IS NULL', 'IS NOT NULL'); +$unaryfunctions = array( + 'IS NULL' => 1, + 'IS NOT NULL' => 1); /** * Not selection yet required -> displays the selection form @@ -62,17 +67,16 @@ if (!isset($param) || $param[0] == '') { $fields_list[] = $row['Field']; $type = $row['Type']; // reformat mysql query output - staybyte - 9. June 2001 - $shorttype = substr($type, 0, 3); - if ($shorttype == 'set' || $shorttype == 'enu') { + if (strncasecmp($type, 'set', 3) == 0 + || strncasecmp($type, 'enum', 4) == 0) { $type = str_replace(',', ', ', $type); } else { - $type = preg_replace('@BINARY@i', '', $type); - $type = preg_replace('@ZEROFILL@i', '', $type); - $type = preg_replace('@UNSIGNED@i', '', $type); + $type = str_replace(array('binary', 'zerofill', 'unsigned'), '', strtolower($type)); } if (empty($type)) { $type = ' '; } + $fields_null[] = $row['Null']; $fields_type[] = $type; if (PMA_MYSQL_INT_VERSION >= 40100 && !empty($row['Collation']) && $row['Collation'] != 'NULL') { $fields_collation[] = $row['Collation']; @@ -94,14 +98,33 @@ if (!isset($param) || $param[0] == '') { //$foreigners = ($cfgRelation['relwork'] ? PMA_getForeigners($db, $table) : FALSE); $foreigners = PMA_getForeigners($db, $table); ?> +
-       -  :
-       -
+

  • @@ -128,7 +152,7 @@ if (!isset($param) || $param[0] == '') { = 40100 ? '' . $strCollation . '' . "\n" : ''; ?> - + "> @@ -172,36 +207,35 @@ if (!isset($param) || $param[0] == '') { if ($foreigners && isset($foreigners[$field]) && isset($disp_row) && is_array($disp_row)) { // f o r e i g n k e y s - echo ' ' . "\n"; // go back to first row echo PMA_foreignDropdown($disp_row, $foreign_field, $foreign_display, $data, 100); echo ' ' . "\n"; } else if (isset($foreign_link) && $foreign_link == true) { ?> - + ' . "\n"; - echo ' ' . "\n"; $cnt_enum_value = count($enum_value); - for ($j=0; $j<$cnt_enum_value;$j++){ + echo ' ' . "\n"; } else { // o t h e r c a s e s - echo ' ' . "\n"; + echo ' ' . "\n"; } ?> - - - + + + 0) { - $sql_query .= ',' . PMA_backquote(urldecode($param[$i])); - } - $i++; + for ($i = 1; $i < $c; $i++) { + $sql_query .= ',' . PMA_backquote(urldecode($param[$i])); } } // end if $sql_query .= ' FROM ' . PMA_backquote($table); - // The where clause - if ($where != '') { - $sql_query .= ' WHERE ' . $where; - } - else { - $sql_query .= ' WHERE 1'; - $cnt_fields = count($fields); - for ($i = 0; $i < $cnt_fields; $i++) { - if (!empty($fields) && $fields[$i] != '') { - if (preg_match('@char|blob|text|set|enum|date|time|year@i', $types[$i])) { - $quot = '\''; - } else { - $quot = ''; - } - if (strtoupper($fields[$i]) == 'NULL' || strtoupper($fields[$i]) == 'NOT NULL') { - $quot = ''; - $func[$i] = 'IS'; - } - $field_charset = empty($charsets[$i]) ? '' : ' _' . $charsets[$i]; - //$sql_query .= ' AND ' . PMA_backquote(urldecode($names[$i])) . " $func[$i] $quot$fields[$i]$quot"; - $sql_query .= ' AND ' . PMA_backquote(urldecode($names[$i])) . ' ' . $func[$i] . $field_charset . ' ' . $quot . PMA_sqlAddslashes($fields[$i]) . $quot; + // The where clause + if (trim($where) != '') { + $sql_query .= ' WHERE ' . $where; + } else { + $w = array(); + $cnt_func = count($func); + reset($func); + while (list($i, $func_type) = each($func)) { + if (@$unaryfunctions[$func_type] == 1) { + $fields[$i] = ''; + $w[] = PMA_backquote(urldecode($names[$i])) . ' ' . $func_type; + + } elseif (strncasecmp($types[$i], 'enum', 4) == 0) { + if (!empty($fields[$i])) { + if (!is_array($fields[$i])) { + $fields[$i] = explode(',', $fields[$i]); + } + $enum_selected_count = count($fields[$i]); + if ($func_type == '=' && $enum_selected_count > 1) { + $func_type = $func[$i] = 'IN'; + $parens_open = '('; + $parens_close = ')'; + + } elseif ($func_type == '!=' && $enum_selected_count > 1) { + $func_type = $func[$i] = 'NOT IN'; + $parens_open = '('; + $parens_close = ')'; + + } else { + $parens_open = ''; + $parens_close = ''; + } + $enum_where = '\'' . PMA_sqlAddslashes($fields[$i][0]) . '\''; + for ($e = 1; $e < $enum_selected_count; $e++) { + $enum_where .= ', \'' . PMA_sqlAddslashes($fields[$i][$e]) . '\''; + } + + $w[] = PMA_backquote(urldecode($names[$i])) . ' ' . $func_type . ' ' . $parens_open . $enum_where . $parens_close; + } + + } elseif ($fields[$i] != '') { + if (preg_match('@char|blob|text|set|date|time|year@i', $types[$i])) { + $quot = '\''; + } else { + $quot = ''; + } + $w[] = PMA_backquote(urldecode($names[$i])) . ' ' . $func_type . ' ' . $quot . PMA_sqlAddslashes($fields[$i]) . $quot; } // end if } // end for + + if ($w) { + $sql_query .= ' WHERE ' . implode(' AND ', $w); + } } // end if if ($orderField != '--nil--') {