Я создаю функциональность фильтра и задаюсь вопросом, как наилучшим образом объединить дополнительные запросы вместе. Например:
$basicquery = "SELECT * FROM products";
$filter1 = mysqli_real_escape_string($connection, $_GET['filter1']);
// has_presence is my function that returns false if value is NULL or ""
$optional1 = (has_presence($filter1)) ? "feature1='{$filter1}'" : "";
$filter2 = mysqli_real_escape_string($connection, $_GET['filter2']);
$optional2 = (has_presence($filter2)) ? "feature2='{$filter2}'" : "";
$filter3 = mysqli_real_escape_string($connection, $_GET['filter3']);
$optional3 = (has_presence($filter3)) ? "feature2='{$filter3}'" : "";
// How to build this one correctly?
$allqueries = $basicquery .
" WHERE " .
$optional1 .
" AND " . $optional2 .
" AND " . $optional3;
Моя проблема заключается в создании $allquery
при $allquery
размещении WHERE
и AND
, потому что иногда мне даже не нужно WHERE
, а иногда мне просто нужно 1 AND
.
Это правильный способ создания такого запроса? (например, когда условие не указано, верните все для этого столбца). Или другой подход лучше (например, 3 отдельных запроса и присоединиться к ним)
Одним из моих любимых подходов к этой проблеме является использование "нулевых" значений. Я просто передаю все параметры в окончательный запрос, но сначала проверяю, являются ли они нулевыми. Например, если у вас есть 3 фильтра, как в вашем примере, предложение where будет выглядеть примерно так:
where (filter1 is null or column1 = filter1)
and (filter2 is null or column2 = filter2)
and (filter3 is null or column3 = filter3)
Таким образом, у вас есть 3 основных преимущества:
$query = "SELECT * FROM products";
$filter1 = mysqli_real_escape_string($connection, $_GET['filter1']);
$filter2 = mysqli_real_escape_string($connection, $_GET['filter2']);
$filter3 = mysqli_real_escape_string($connection, $_GET['filter3']);
if(has_presence($filter1) || has_presence($filter2) || has_presence($filter3) {
$query .= " WHERE";
$query .= (has_presence($filter1)) ? " feature1='{$filter1}'" : "";
$query .= (has_presence($filter2)) ? " AND feature2='{$filter2}'" : "";
$query .= (has_presence($filter3)) ? " AND feature2='{$filter3}'" : "";
}
Добавьте 1=1
и поместите AND
перед каждым фильтром.
$basicquery = "SELECT * FROM products";
$filter1 = mysqli_real_escape_string($connection, $_GET['filter1']);
// has_presence is my function that returns false if value is NULL or ""
$optional1 = (has_presence($filter1)) ? " AND feature1='{$filter1}'" : "";
$filter2 = mysqli_real_escape_string($connection, $_GET['filter2']);
$optional2 = (has_presence($filter2)) ? " AND feature2='{$filter2}'" : "";
$filter3 = mysqli_real_escape_string($connection, $_GET['filter3']);
$optional3 = (has_presence($filter3)) ? " AND feature2='{$filter3}'" : "";
// How to build this one correctly?
$allqueries = $basicquery .
" WHERE 1=1 " .
$optional1 .
$optional2 .
$optional3;
AND