diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 136e8851..b06405d9 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -1060,7 +1060,7 @@ if (!defined("DRIVER")) { $structured_types[$key] = array_keys($val); } $unsigned = array("unsigned", "zerofill", "unsigned zerofill"); ///< @var array number variants - $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"); ///< @var array operators used in select + $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "FIND_IN_SET", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"); ///< @var array operators used in select $functions = array("char_length", "date", "from_unixtime", "lower", "round", "floor", "ceil", "sec_to_time", "time_to_sec", "upper"); ///< @var array functions used in select $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); ///< @var array grouping functions used in select $edit_functions = array( ///< @var array of array("$type|$type2" => "$function/$function2") functions used in editing, [0] - edit and insert, [1] - edit only diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index 4afd2c3f..ab4ce272 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -519,6 +519,7 @@ class Adminer { $val["op"] = "LIKE %%"; } if ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators)) { + $prefix = ""; $cond = " $val[op]"; if (preg_match('~IN$~', $val["op"])) { $in = process_length($val["val"]); @@ -529,11 +530,14 @@ class Adminer { $cond = " LIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%"); } elseif ($val["op"] == "ILIKE %%") { $cond = " ILIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%"); + } elseif ($val["op"] == "FIND_IN_SET") { + $prefix = "$val[op](" . q($val["val"]) . ", "; + $cond = ")"; } elseif (!preg_match('~NULL$~', $val["op"])) { $cond .= " " . $this->processInput($fields[$val["col"]], $val["val"]); } if ($val["col"] != "") { - $return[] = idf_escape($val["col"]) . $cond; + $return[] = $prefix . idf_escape($val["col"]) . $cond; } else { // find anywhere $cols = array(); @@ -543,10 +547,10 @@ class Adminer { && (!preg_match("~[\x80-\xFF]~", $val["val"]) || $is_text) ) { $name = idf_escape($name); - $cols[] = ($jush == "sql" && $is_text && !preg_match("~^utf8~", $field["collation"]) ? "CONVERT($name USING " . charset($connection) . ")" : $name); + $cols[] = $prefix . ($jush == "sql" && $is_text && !preg_match("~^utf8~", $field["collation"]) ? "CONVERT($name USING " . charset($connection) . ")" : $name) . $cond; } } - $return[] = ($cols ? "(" . implode("$cond OR ", $cols) . "$cond)" : "0"); + $return[] = ($cols ? "(" . implode(" OR ", $cols) . ")" : "0"); } } } diff --git a/changes.txt b/changes.txt index 78645a07..74867992 100644 --- a/changes.txt +++ b/changes.txt @@ -6,7 +6,8 @@ Stop redirecting links via adminer.org Support X-Forwarded-Prefix Display options for timestamp columns when creating a new table MySQL, PostgreSQL: Display warnings -MySQL: Add floor and ceil functions +MySQL: Add floor and ceil select functions +MySQL: Add FIND_IN_SET search operator MariaDB: Support JSON since MariaDB 10.2 PostgreSQL: Support functions PostgreSQL: Allow editing views with uppercase letters (bug #467)