我正在尝试在php和mysql中实现过滤器以搜索数据库中的记录。...过滤器应该像是在6个过滤器中仅选择了两个过滤器一样,查询将对这两个过滤器执行“ AND”操作并从数据库和如果是三个,它将对这三个过滤器执行“与”运算。 一种实现方法是检查每个类似的过滤器。
if(isset($_GET['name'] && isset($_GET['city'])) { perform AND for these two};
elseif(isset($_GET['name'] && (isset($_GET['age'])) {perform AND for these three}.
and so on ...
但是问题是如果我有6个过滤器,那么我必须为其创建64个组合... 我在考虑是否有其他替代解决方案?
答案 0 :(得分:1)
如果您的$_GET
键与表中的列匹配,这可能会起作用:
$query = "SELECT * FROM table";
$filtered_get = array_filter($_GET); // removes empty values from $_GET
if (count($filtered_get)) { // not empty
$query .= " WHERE";
$keynames = array_keys($filtered_get); // make array of key names from $filtered_get
foreach($filtered_get as $key => $value)
{
$query .= " $keynames[$key] = '$value'"; // $filtered_get keyname = $filtered_get['keyname'] value
if (count($filtered_get) > 1 && (count($filtered_get) > $key)) { // more than one search filter, and not the last
$query .= " AND";
}
}
}
$query .= ";"
$query
=“从表中选择*名称='名称'AND城市='城市'AND年龄='年龄';”
我认为这可能可行,尽管此代码示例不包括针对SQL注入的清理,因此您可能应该添加一些内容来清理潜在的危险输入
已更新:添加了$filtered_get = array_filter($_GET);
,以过滤掉$_GET
数组中的所有空字段
答案 1 :(得分:0)
single if condition to check value is empty or not.for non-empty then mysql query is two between 'AND' operation.
$query = 'select * from info';
$where = ' Where';
$and = 'id = 1';
if(!empty($_GET['name'])){
$and .= ' AND name="test"';
}
if(!empty($_GET['city'])){
$and .= ' AND city="test"';
}
$q = $query.''.$where.''.$and;
make like this query is 'select & from info where id=1 AND name="test" AND city="test"';
答案 2 :(得分:0)
您可以为表单元素(例如filter-)使用前缀,因此项目看起来像filter-age,filter-name等。现在,假设您有一个类似
的函数function buildFilters($input, $delimiter) {
foreach ($input as $key => $value) {
$filters = array();
$filters[]="1=1";//default filter
if (strpos($key, $prefix) === 0) {
//add the filter to $filters via $filters[]=yourvalue
}
}
return implode($delimiter, $filters);
}
然后您可以称呼它
$myFilters = buildFilters($_POST, " AND ");
答案 3 :(得分:0)
我尝试使用@tshimkus的答案。也许这是我设置阵列的方式或其他方法,但是在使它工作之前,我遇到了一些问题。
此行:
$query .= " $keynames[$key] = '$value'";
对我来说必须是:
$query .= " $key = '$value'";
我也没有得到最后一项有效的支票(如下所示)。
if (count($filtered_get) > 1 && (count($filtered_get) > $key)) { // more than one search filter, and not the last
最终使用了计数和
if($i!==$len){