首页 > 解决方案 > 可以在同一表 SQL 的一列或多列中进行搜索

问题描述

我有一个夹板,上面展示了几种产品。左侧是几个选项,以便人们可以在产品列表中进行过滤。

如果变量具有值,我正在尝试创建一个表单,它将被组装成部分。

这是我的代码:

if (!empty($_GET) && (!empty($_GET['search']))) {
    $where = "WHERE"; 
}else{
    $url_atual = "";
}

if (isset($_GET['search']) && ($_GET['search'] != "")) {
    $serch = "titulo LIKE '%".$_GET['search']."%' ";
}else{
    $serch = "";
}

if (isset($_GET['cat']) && ($_GET['cat'] != "")) {
    $cat = "AND categoria = ".$_GET['cat']." ";
}else{
    $cat = "";
}

if (isset($_GET['cat_sub']) && ($_GET['cat_sub'] != "")) {
    $cat_sub = "AND subcategoria IN ('".$_GET['cat_sub']."')";
}else{
    $cat_sub = "";
}

if (isset($_GET['fpag']) && ($_GET['fpag'] != "all")) {
    $fpag = "AND fixoHora = '".$_GET['fpag']."' ";
}else{
    $fpag = "";
}


$projetos = $conn->query("SELECT * FROM projetos {$where} {$serch} {$cat} {$cat_sub} {$fpag} LIMIT {$inicio},{$itens_por_pagina}");

问题

在我使用AND, 变量的开头,如果有任何变量没有初始化,比如search,就会报错,因为它会这样开始:

SELECT * FROM projetos AND cat = 1

有没有更好的方法来进行这些搜索?

谢谢您的帮助!

标签: phpsql

解决方案


开发动态查询是一件棘手的事情,因为您必须考虑所有可能的变化和可能性。因此,您拥有的选择越少越好。在这种情况下,你有 4 个。我解决这个问题的方法是详细说明每个结果。我并不是说这是完美的,有人可能会提出更好更简洁的方法,但这就是我的做法:

1.用伪代码绘制你的逻辑

从基本查询开始

有搜索词吗?
:添加“喜欢”
:空白

有分类和搜索吗?
:添加“AND 类别”
:有类别吗?
:添加“类别”。
:空白

是否有类别和子类别或搜索和子类别?
:添加“AND 子类别”
:是否有子类别?
:添加“子类别”
:空白

是否有类别或子类别或搜索
:如果有 fpag,添加 'AND fpag'
:是否有 fpag
:添加 'fpag'
:空白

2. 转换为 if 和 else 语句并附加原始查询

//Basic query
if (!empty($_GET)) {
    $query = "SELECT * FROM projetos WHERE "; 
    }
else{
    $query = "SELECT * FROM projetos";
}

//is there a search term?
if (isset($_GET['search']) && ($_GET['search'] != "")) {
    $query .= "titulo LIKE '%".$_GET['search']."%' ";
    }
else{
    $query .= "";
}

//is there a category and a search?
if (isset($_GET['cat']) && (isset($_GET['search']))) {
    $query .= "AND categoria = ".$_GET['cat']." ";
    }
else{
    if (isset($_GET['cat'])){
        $query .= "categoria = ".$_GET['cat']." ";
        }
    else{
         $query .= "";
        }
}

//is there a Category and a subcategory OR a search and a Subcategory?is there a Category and a subcategory OR a search and a Subcategory?
if (isset($_GET['cat']) && isset($_GET['cat_sub']) || isset($_GET['search']) && isset($_GET['cat_sub'])){
         $query .= "AND subcategoria IN ('".$_GET['cat_sub']."') ";
    }
else{
    if(isset($_GET['cat_sub'])){
        $query .= "subcategoria IN ('".$_GET['cat_sub']."') ";
        }
        else{
            $query .= "";
        }
    }

//is there a Category OR a subcategory OR a Search  
if(isset($_GET['cat']) || isset($_GET['search']) || isset($_GET['cat_sub'])){
    if(isset($_GET['fpag'])){
            $query .= "AND fixoHora = '".$_GET['fpag']."' ";
        }
        else{
            $query .= "";
        }
    }
else{
    if(isset($_GET['fpag'])){
            $query .= "fixoHora = '".$_GET['fpag']."' ";
        }
    else{
            $query .= "";
        }
    }
$projetos = $conn->query($query . "LIMIT  {$inicio},{$itens_por_pagina}");

我快速检查了上面的代码,它似乎有效。可以修改上述代码以确保 $_GET 值不为空,但可以在加载页面之前在验证中完成。

我希望这有帮助。


推荐阅读