代码之家  ›  专栏  ›  技术社区  ›  Biarys

使用用户输入(如果提供)的SQL筛选器

  •  -1
  • Biarys  · 技术社区  · 8 年前

    我有一个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查询?当用户单击submit按钮时,会发生一个ajax调用并绘制一个新表。

    这两个答案 sql filter table data SQL Filter Query 接近我需要的,但我不确定如何适应我的情况。

    P.S.为更好的可读性添加了中断

    编辑1:添加了屏幕截图。建筑物和元名称始终存在。

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  0
  •   Biarys    8 年前

    正如@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;';
    

    如果你有更好的答案,请告诉我。