Я делаю запрос динамически следующим образом:
$query = "SELECT u.* FROM users u WHERE date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 $range))";
Также $range
содержит следующее слово:
switch ($_GET['range']){ case "week": $range = "WEEK"; case "month": $range = "MONTH"; case "year": $range = "YEAR"; case "ALL": $range = <I don't know what should I put here to get the expected result>; }
Как я уже сказал выше, я хочу установить что-то как значение $range
чтобы сделать WHERE
чем-то вроде WHERE 1
. Как я могу это сделать?
Я думаю, что Адам предлагал что-то вроде этого:
$where = ''; switch ($_GET['range']) { case "week": $where = "date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 WEEK))": break; case "month": $where = "date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 MONTH))": break; case "year": $where = "date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 YEAR))": break; default: $where = ''; } $query = "SELECT u.* FROM users u WHERE $where";
Предположим, что отчетность соответствует другим критериям? Там, где конкатенация строк становится беспорядочной. Добавление «AND» между частями. Подавление ключевого слова WHERE целиком? Где OOP-код для представления SQL-запроса может быть полезным.
Возможно, используйте аргумент case в своем предложении where?
$query = "SELECT u.* FROM users u WHERE CASE {$range} WHEN 'ALL' then TRUE ELSE date_time > unix_timestamp(DATE_SUB(now() , INTERVAL 1 {$range})) END";
switch ($_GET['range']){ case "week": $range = "WEEK"; case "month": $range = "MONTH"; case "year": $range = "YEAR"; case "ALL": $range = null; } $query = "SELECT u.* FROM users u WHERE 1=1 "; if(!empty($range)) { $query .= " AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 $range))"; }
Добавьте условное выражение datetime where; WHERE 1=1
всегда будет правдой. Таким образом, результат следующего условия будет иметь значение в конечном результате
Начнем с того, что ваш оператор switch не имеет операторов break и не будет работать так, как вы ожидаете.
Вот что я предлагаю:
$query = "SELECT u.* FROM users u"; $range = false; if (isset($_GET['range'])) { switch ($_GET['range']){ case "week": $range = "WEEK"; break; case "month": $range = "MONTH"; break; case "year": $range = "YEAR"; break; default: $range = false; } } if ($range) { $query .= " WHERE date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 $range))"; }
Я бы определил массив с допустимыми диапазонами и сначала проверил ввод пользователя. Затем постройте запрос динамически.
$validRanges = [ 'year' => 'YEAR', 'month' => 'MONTH', 'week' => 'WEEK', 'ALL' => null ]; if (isset($_GET['range']) && !isset($validRanges[$_GET['range']])) { $range = $validRanges[$_GET['range']]); } else { // it's up to you, what to do in this case throw new Exception('Range is not valid or missing'); } if ($range === null) { $rangeCondition = '1=1'; } else { $rangeCondition = "date_time > unix_timestamp(NOW() - INTERVAL 1 $range)"; } $query = "SELECT u.* FROM users u WHERE $rangeCondition";