使用多个(可选)搜索字段构建SQL查询

时间:2010-09-22 15:40:28

标签: php forms search

我有一个表单,用于搜索支持票证表。

用户可以从一些困难的可选字段中搜索。

  • 日期(往返)
  • 票务状态
  • 工程师
  • 门票联系

我想知道处理可选搜索过滤器的最佳方法是什么。所以我有一个从用户那里获取参数的查询。因此,如果用户使用from和to日期进行搜索,则查询将希望包含BETWEEN。因此,如果用户仅搜索,则必须编写不同的查询。或者当用户没有添加任何日期参数时的其他查询?那么如果状态下拉列表是空白怎么办?那是另一个问题吗?

任何帮助清除这一点都会很棒!

Jonesy

4 个答案:

答案 0 :(得分:3)

部分构建查询。从查询中的常量开始,并根据更多条件添加更多SQL:

$query = "SELECT ...
  FROM ...
  WHERE [where conditions that are always going to be present]";

if (isset($_POST['date_from']) && isset($_POST['date_to']))
{
  $query .= ... // query code for dealing with dates
}

if (isset($_POST['status']))
{
  $query .= ... // deal with status
}

// etc.

// Once you have your query fully built, execute it
$result_set = mysql_query($query);

这段代码显然只是一个骨架,但这就是我构建查询的方式。

答案 1 :(得分:3)

很难说不知道你正在使用什么类型的数据库抽象,但假设你手写SQL,它很简单,只需为每个变量单独构建where子句的部分。 (这里假设你的变量已被转义/引用。)

$where_clause = array();
if (!empty($date_from)) {
    $where_clause[] = "table.date >= $date_from";
}
if (!empty($date_to)) {
    $where_clause[] = "table.date <= $date_to";
}
if (!empty($status)) {
    $where_clause[] = "status = $status";
}

$query = 'select * from table where ' . join(' and ', $where_clause);

答案 2 :(得分:1)

这是一种优雅的方式,我使用很多,希望也会帮助你:

$q = 'SELECT * FROM Users';
$buildQ = array();

if (empty($idOrName) === false) {
    $buildQ[] = '(userid = "' . $idOrName . '" OR username LIKE "%' . $idOrName. '%")';
}

if (empty($nickname) === false) {
    $buildQ[] = 'nickname="' . $nickname . '"';
}

if (empty($salary) === false) {
    $buildQ[] = 'salary="' . $salary . '"';
}

// ... any other criterias like above if statements

if (count($buildQ) === 1) {
    $q .= ' WHERE ' . $buildQ[0];
} else if (count($buildQ) > 1) {
    $count = 0;
    foreach ($buildQ as $query) {
        if ($count === 0) {
            $q .= ' WHERE ' . $query;
        } else {
            $q .= ' AND ' . $query;
        }

        $count++;
    }
}

答案 3 :(得分:0)

我认为如果您根据填充的字段在运行时动态生成查询会更好。因此,如果只传递一个日期而另一个日期为null,或者两者都被传递,那么您可以创建一些附加特定查询片段的帮助器,依此类推。