【问题标题】:How to build a MySQL query with conditional filters?如何使用条件过滤器构建 MySQL 查询?
【发布时间】:2026-01-18 02:40:01
【问题描述】:

我对 PHP 和 MySQL 都很陌生,我正在尝试构建一个小型歌手名言库。我希望用户能够通过键入引语本身的一部分、歌手的姓名或歌手的乐队(如果有)来搜索引语。

现在,那部分我已经很确定了:

$query = 'SELECT * FROM quotes WHERE (quote LIKE "%'.$search_string.'%" OR singerName LIKE "%'.$search_string.'%" OR bandName LIKE "%'.$search_string.'%")';

这可行,尽管它会返回 search_string 位于单词中间的结果:如果我输入“her”,它将返回包含“other”或“together”的每个引号。如果我从查询中删除第二个 %,它不会返回 search_string 不是第一个单词的引号,我希望它这样做。

无论如何,我还想做的是提供过滤结果的可能性。假设我希望用户能够通过单选按钮仅显示英语、德语或两者的引号。默认情况下,Both 被选中,所以上面的 $query 仍然有效。但是,如果用户选择英文,它也应该说类似AND (language = 'EN')

目前,我尝试以这种方式添加到查询中:

if ($_POST['language']== "EN") {
  $sql .= " AND (language = 'EN')";
}

它有效,但它可能是一个真正的麻烦,因为我还希望用户只使用过滤器搜索报价,而不输入搜索查询:他们将能够查找乐队中歌手的英文报价,例如。所以,我也有这个:

if (strlen($search_string) < 1) {
  $sql = "SELECT * FROM quotes";
}

但是,$sql .= " AND (language = 'EN')"; 将不再正确,因为“AND”应该是“WHERE”。所以我必须有另一个 if 子句来修改字符串,并为我决定应用的每个过滤器设置另一个。

然后我的问题是:我应该如何构建我的查询,因为有 可选 过滤器,并且搜索也应该可以使用过滤器单独

谢谢!

【问题讨论】:

    标签: php mysql sql regex filter


    【解决方案1】:

    设置一个始终为真的条件,以获得常量WHERE 子句。

    $sql = "SELECT * FROM myTable WHERE 1 = 1 "
    if (true) {
        $sql .= " AND col1 LIKE '%val%' ";
    }
    

    【讨论】: