我有一个视图,用户可以在其中选择要进行高级搜索的字段,这些字段是:
**name**- **age** - **location** - **isPaid** - **date_subscription**, **date_expiration**
用户可能选择一个列或将多个列组合在一起,如果我应该使用if statement
来检测选择了哪些列,然后根据所选择的列来运行查询,我会感到困惑,但是我这样做将需要设置所有有效条件,这意味着设置所有有效组合。还有其他执行此类查询的方法吗?
我正在编写此查询,但是我停了下来,因为我只是意识到会持续多长时间:
SELECT * FROM internetclientdetails icd INNER JOIN internetclient ic on ic.id = icd.icid WHERE
(icd.date_sub <=".$start_dateSubsc." and cd.date_sub >= ".$end_dateSubsc.")
OR
(icd.date_exp <=".$start_dateExp." and cd.date_exp >= ".$end_dateExp.")
OR
(
(icd.date_sub <=".$start_dateSubsc." and cd.date_sub >= ".$end_dateSubsc.")
AND
(icd.date_exp <=".$start_dateExp." and cd.date_exp >= ".$end_dateExp.")
)
OR
.
.
.
但是这太长了,因为我还有4个左字段来设置OR
和AND
运算符
答案 0 :(得分:1)
通常,您会添加一些已经查询的构建库,该库可以从您选择的输入中构建有效的SQL。
其中有许多,例如Doctrine DB abstraction layer,Medoo和其他一些
。例如,在Medoo中,一个相当复杂的查询,例如:
SELECT account,user_name FROM table
WHERE user_id IN (2,123,234,54) OR
email IN ('foo@bar.com','cat@dog.com','admin@medoo.in')
将用PHP编写为:
$database->select("account", "user_name", [
"OR" => [
"user_id" => [2, 123, 234, 54],
"email" => ["foo@bar.com", "cat@dog.com", "admin@medoo.in"]
]
]);
因此,使用medoo时要做的就是从表单传递正确的输入。
关于您有关用户如何选择不同列的问题,您可以使用以下内容:
$ mapping = array(“ start_dateSubsc” =>“ date_sub”,“ end_dateSubsc” =>“ date_sub”,...);
在其中列出用户可以在网页中输入的所有可能字段,这些字段都映射到实际数据库表的列名。
然后,当您处理页面时,您将执行以下操作:
$wherequery["OR"]=array();
foreach ($mapping as $userfield => $dbfield)
{
if array_key_exists($userfield, $_REQUEST)
array_push($wherequery["OR"], $dbfield => $_REQUEST[$userfield]);
}
$database->select("your columns"),[ $wherequery ]);
这将适用于需要=用户所说的字段以及您必须在其中匹配任何字段的字段。
与可能在范围内的字段有更多关系,然后分别处理它们,以及使用“ AND”处理字段,但这取决于实际字段的范围和可能性。