Фильтр SQL с использованием пользовательского ввода, если имеется - PullRequest
0 голосов
/ 08 июня 2018

У меня есть запрос 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 и Запрос фильтра SQL близки к тому, что мне нужно, но я не уверен, как адаптировать их для моей ситуации.

PS Добавлены перерывы для лучшей читаемости

Редактировать 1: Добавлен скриншот.Название здания и мета всегда присутствуют.

enter image description here

1 Ответ

0 голосов
/ 08 июня 2018

Как предложили @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;';

Если у вас есть лучший ответ, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...