фильтр выборки по цене

M
На сайте с 01.10.2014
Offline
61
2221

Всем привет. есть скрипт php, который выводит все, что входит в диапазон, который ввел пользователь. Вот он:

$start_cost = (int)$_GET["start_cost"];

$end_cost = (int)$_GET["end_cost"];

if (!empty($start_cost) OR !empty($end_cost))

{

$query_cost = " AND cost BETWEEN $start_cost AND $end_cost";

}

проблема в том, что если я ввожу ноль в поле start_cost и также ноль в поле end_cost, то мне просто выводится все, что есть в таблице, но если я ввожу, например 5 туда и 5 туда, то скрипт будет выводить все данные в таблице, которые входят в этот диапазон(То есть имеют стоимость 5, например). Что нужно изменить, чтобы это также работало и с нулем?

Лучшая вап клик пп для выкупа подписок (https://mcwap.ru/?r=1153)
totamon
На сайте с 12.05.2007
Offline
437
#1

попробуй условие

if (isset($start_cost) OR isset($end_cost))
Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
M
На сайте с 01.10.2014
Offline
61
#2
totamon:
попробуй условие

то что нужно. спасибо)

bupy7
На сайте с 18.03.2014
Offline
30
#3

totamon, и что это должно дать по вашему мнению? Это будет всегда давать true, что бы там не было.

if (isset($_GET['start_cost']) || isset($_GET['end_cost']))

M
На сайте с 01.10.2014
Offline
61
#4
bupy7:
totamon, и что это должно дать по вашему мнению? Это будет всегда давать true, что бы там не было.

if (isset($_GET['start_cost']) || isset($_GET['end_cost']))

а не знаете в чем тут может быть дело: если я заполняю только поле start_cost, а end_cost оставляю пустым, то из таблицы ничего не выводится, но если заполняю оба поля или последнее поле, то все выводится правильно. В чем тут может быть проблема?

bupy7
На сайте с 18.03.2014
Offline
30
#5

mortido, потому что используется between. По сути, здесь нужно совсем по другому делать. И в итоге вот так должно быть, к примеру, но может и не работать корректно, потому что я полного представления о работе поиска не имею:

$start_cost = (int)$_GET['start_cost'];

$end_cost = (int)$_GET['end_cost'];

if (isset($_GET['start_cost']) && isset($_GET['end_cost'])) {

$query_cost = " AND cost BETWEEN {$start_cost} AND {$end_cost}";

} elseif (isset($_GET['start_cost'])) {

$query_cost = " AND cost=>{$start_cost}";

} elseif (isset($_GET['end_cost'])) {

$query_cost = " AND cost<={$end_cost}";

}

totamon
На сайте с 12.05.2007
Offline
437
#6
bupy7:
totamon, и что это должно дать по вашему мнению? Это будет всегда давать true, что бы там не было.

if (isset($_GET['start_cost']) || isset($_GET['end_cost']))

согласен с вашим вариантом, хотел обратить внимание что нужно поменять !empty на isset,

тк 0 это как раз пустое значение и не попадает в фильтр.

M
На сайте с 01.10.2014
Offline
61
#7
bupy7:
mortido, потому что используется between. По сути, здесь нужно совсем по другому делать. И в итоге вот так должно быть, к примеру, но может и не работать корректно, потому что я полного представления о работе поиска не имею:

$start_cost = (int)$_GET['start_cost'];
$end_cost = (int)$_GET['end_cost'];

if (isset($_GET['start_cost']) && isset($_GET['end_cost'])) {
$query_cost = " AND cost BETWEEN {$start_cost} AND {$end_cost}";
} elseif (isset($_GET['start_cost'])) {
$query_cost = " AND cost=>{$start_cost}";
} elseif (isset($_GET['end_cost'])) {
$query_cost = " AND cost<={$end_cost}";
}

к сожалению, также выводит как и мой предыдущий код

bupy7
На сайте с 18.03.2014
Offline
30
#8

mortido, вот поэтому я и написал, что мне неизвестно что уходит в запрос. Что у вас $start_cost и $end_cost можете прислать? Добавьте после

$start_cost = (int)$_GET['start_cost'];

$end_cost = (int)$_GET['end_cost'];

это

var_dump($start_cost, $end_cost);die();

и установите дефолтные значения поиска и отправьте запрос. Результат var_dump сюда.

M
На сайте с 01.10.2014
Offline
61
#9

обычные текстовые поля:

<input type="text" name="start_cost" />

<input type="text" name="end_cost" />

а результат var_dump: int(0) int(0)

bupy7
На сайте с 18.03.2014
Offline
30
#10

$start_cost = (int)$_GET['start_cost'];

$end_cost = (int)$_GET['end_cost'];

if ($start_cost && $end_cost && $start_cost < $end_cost) {

$query_cost = " AND cost BETWEEN {$start_cost} AND {$end_cost}";

} elseif ($start_cost > $end_cost || $start_cost == $end_cost) {

$query_cost = " AND cost=>{$start_cost}";

} elseif ($start_cost < $end_cost) {

$query_cost = " AND cost<={$end_cost}";

}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий