我在许多购物网站上看到过,它们的侧面都有搜索过滤器,您可以添加任意数量的过滤器,并且它会研究数据,仅显示与所有过滤器查询匹配的数据。
例如,如果您前往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'
);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句