我有一个表单,用于搜索支持票证表。
用户可以从一些困难的可选字段中搜索。
我想知道处理可选搜索过滤器的最佳方法是什么。所以我有一个从用户那里获取参数的查询。因此,如果用户使用from和to日期进行搜索,则查询将希望包含BETWEEN。因此,如果用户仅搜索,则必须编写不同的查询。或者当用户没有添加任何日期参数时的其他查询?那么如果状态下拉列表是空白怎么办?那是另一个问题吗?
任何帮助清除这一点都会很棒!
Jonesy
答案 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,或者两者都被传递,那么您可以创建一些附加特定查询片段的帮助器,依此类推。