Как я могу эмулировать WHERE 1 в динамическом запросе?

Я делаю запрос динамически следующим образом:

$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";