@kamtm

Как построить запрос на выборку с нулем?

Здравствуйте!

В базе данных есть поле status (int)

По-умолчанию оно имеет значение 1, но можно задать значение 0, 2, 3 и другие.

Следующий код делает выборку из базы данных:

if ($page == 'news') {

		$s = '';
		$status  = $inCore->request('status', 'int'); 
		
		if (isset($status) && !empty($status)) { // Проблемный участок
			if ($status == 0) { $s = ' AND status = 0 '; } else { $s = ' AND status = '.$status; } 
			if ($status == 6) { $s = ' OR adddate < (NOW() - INTERVAL 30 DAY) '; }	
		}
		
		$res = $inDB->query("SELECT id FROM news WHERE id>0 $s");  $summ = $inDB->num_rows($res);


Проблема в том, что подразумевается, что при заходе на страницу

?page=news запрос будет обходить переменную $status, то есть будет иметь вид:

SELECT id FROM news WHERE id>0

Так оно и выходит, но проблема в том, что и страница, вида ?page=news&status=0

Также приводит к запросу

SELECT id FROM news WHERE id>0

То есть не получается прикрепить переменную status=0

Причем, страница вида ?page=news&status=3 отлично отрабатывается

SELECT id FROM news WHERE id>0 AND status = 3

НО, если заменить код, на такой:

if ($page == 'news') {

		$s = '';
		$status  = $inCore->request('status', 'int'); 
		
// Проблемный участок
			if ($status == 0) { $s = ' AND status = 0 '; } else { $s = ' AND status = '.$status; } 
			if ($status == 6) { $s = ' OR adddate < (NOW() - INTERVAL 30 DAY) '; }	
		
		$res = $inDB->query("SELECT id FROM news WHERE id>0 $s");  $summ = $inDB->num_rows($res);


То, начинает работать страница вида, ?page=news&status=0

Но, теперь, если зайти на ?page=news, мы видим пустую страницу и запрос вида:

SELECT id FROM news WHERE id>0 AND status = 0

Как можно решить данную проблему? Явно не получается у меня создать условие, вида

ЕСЛи ?page=news , то $s = ' ', иначе, если существует переменная $status , то $s = ' AND status = ' . $status ;
  • Вопрос задан
  • 2304 просмотра
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Проблема в двух строчках:
$status = $inCore->request('status', 'int');
если я правильно понимаю, вы тут получаете данные из запроса и приводите их к нужному типу (int). В этом случае null приведется к 0. Если есть вариант выставить значение по умолчанию (-1) или еще лучше проверить наличие такого ключа.... то-то типа $inCore->request->has('status'); Решить проблему в этой строке будет вернее всего. Пусть оно уж null и возвращает коль уж нету данных и пусть не выдумывает с кастами типов.

if (isset($status) && !empty($status)) { // Проблемный участок

тут нужно убрать !empty и заменить его на что-то типа $status !== null/is_null($status) ибо empty на ноль тоже среагирует как на пустоту.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы