我有一个SQL查询:
$q='SELECT i.RID, i.ITEM, i.ITEMNAME, i.Desc,
GROUP_CONCAT(concat(m.META_NAME, ": ", m.META_VALUE)) AS Meta, l.Building, l.PERSON_TYPE
FROM LAF_Lost_Items AS i INNER JOIN LAF_Lost_Items_Metadata AS m ON i.RID=m.RID AND i.ITEM=m.ITEM
INNER JOIN LAF_Lost_Inquiries AS l ON l.RID=i.RID
WHERE (i.ClaimID IS NULL) AND (l.Building=?) AND (dateLost > ?) AND (META_NAME IN (?) OR META_VALUE IN (?))
GROUP BY i.RID, i.ITEM;';
$DB->query($q, array($_POST["Building"], $_POST["dateLost"], $_POST["META_NAME"], $_POST["META_VALUE"]));
$r=$DB->fetch_assoc_all();
此查询有效,但如果用户未提供任何内容,则使用空值,这会产生错误的结果。
如何编写仅使用用户提供的值过滤结果的SQL查询?当用户单击“提交”按钮时,将发生ajax调用并绘制新表。
这两个答案sql filter table data和SQL Filter Query接近我的需要,但我不确定如何根据我的情况调整它们。
P.S。添加了中断以提高可读性
编辑1:添加了截图。建筑和元名称始终存在。
答案 0 :(得分:0)
正如@Lucarnosky和@Gus所建议的,我最终检查$ _POST变量是否为空,然后将它们添加到字符串中。这是代码目前的样子:
$s = "";
foreach ($_POST as $i => $values) {
if (!is_array($values)) {
if (!empty($values)){
echo $i . ": " . $values . "\n";
$s .= " AND " . $i . "=" . $values . " ";
}
}
else {
foreach ($values as $key => $value) {
if (!empty($value)) {
echo $i . ": " . $key . ": " . $value . "\n";
$s .= " AND " . $key . "=" . $value . " ";
}
}
}
}
$q='SELECT i.RID, i.ITEM, i.ITEMNAME, i.Desc,
GROUP_CONCAT(concat(m.META_NAME, ": ", m.META_VALUE)) AS Meta, l.Building, l.PERSON_TYPE
FROM LAF_Lost_Items AS i INNER JOIN LAF_Lost_Items_Metadata AS m ON i.RID=m.RID AND i.ITEM=m.ITEM
INNER JOIN LAF_Lost_Inquiries AS l ON l.RID=i.RID
WHERE ' . $s . ' GROUP BY i.RID, i.ITEM;';
如果您有更好的答案,请告诉我。