php/mysql搜索表,过滤器数量未知


php/mysql search table with unknown number of filters

我在许多购物网站上看到,它们都有搜索过滤器,你可以添加任何数量的过滤器,它只研究与所有过滤器查询匹配的数据。

举个例子,如果你去ebay寻找一台电脑,你可以根据电脑的各种规格进行筛选,以缩小结果。

我遇到的问题是如何为一个有很多字段的表做这件事,用户可以通过进行搜索

我有一个属性表,我想通过任何数量的参数来搜索,例如租金、位置等。

我可以为每个可能的选项创建搜索查询,例如searchByAddress($array)searchByAddressAndRent($array)等,但这显然是不可行的。

另一种方式是,我可以为每个字段创建单独的查询,然后为每个参数(即searchByRent($array)searchByAddress($array))触发单独的搜索查询,并允许PHP应用程序使用array_intersect计算所有结果数组中哪些字段是公共的。

但我想知道,必须有一个适当的技术来实现这一点。这个问题有点冗长,我在谷歌上找不到任何关于它的教程。

所以我的问题是,用各种搜索过滤器搜索数据库表的"正确"方法/技术是什么?

如果创建一个表示属性表的类,则可以在该类中定义一个静态数组,详细说明每个字段名称和相应的数据类型。

在前端,每个搜索字段都应该与数据库中的列名相对应,因此$_REQUEST数组键将与列名相匹配。

之后,遍历搜索数组,检查类字段定义数组中是否存在每个变量,并将其添加到搜索查询中。

下面是一个非常简单的示例类,希望它能给你这个想法。

class Property () {
    // search parameters come from $values_array
    // each search field should correspond to the $field_definitions key
    public function search($values_array = null) {
        // populate the values array. Using this method meads you can pass an array directly
        // into the search function, or you can rely on the $_REQUEST
        $values_array = self::getValuesArray($values_array);
        // setup the initial query
        $query = "SELECT * FROM properties";
        // set our initial join string
        $join = "WHERE";
        // loop each of our search values
        foreach ($values_array as $field=>$value) {
            // check the search key exists in our table definition and it's not empty
            if (array_key_exists($field_definitions, self::$fields) && !empty($value)) {
                // switch the datatype for the field so we can set the appropriate query string
                switch (self::$field_definitions[$field]) {
                    case 'int':
                        $query .= "$join $field = {$value} ";
                        $join = "AND";
                        break;
                    default:
                        $query .= "$join $field = '%{$value}%' ";
                        $join = "AND";
                        break;
                }
            }
        }
        // now execute the query... 
        $results = mysql_query($query);
        // do something to process the results and then return
        return $results;
    }
    // basic function to grab our values from $_REQUEST if passed an empty array
    private function getValuesArray($values_array = null) {
        $values_array = (!empty($values_array)) ? $values_array : $_REQUEST;
        return $values_array;
    }
    // variable containing all available fields in table and corresponding datatype
    public static $field_definitions = 
        array(  'number'=>'int',
            'street'=>'string',
            'locality'=>'string',
            'townland'=>'string',
            'town'=>'string',
            'postcode'=>'string'
        );
}