Как разобрать в запрос строку типо >1<2

Cramac

Новичок
Всем привет. Делаю фильтрацию таблицы данных.
Как передав выражение типо ">13<200" или ">2" или "<50" или просто "55"
собрать запрос к базе чтоб получить
where id>13 and <200
where id>2
where id<50
where id=55

единовременно может передаваться 1 вариант условий
 

Фанат

oncle terrible
Команда форума
Хотелось бы.
Чем меньше воли давать юзеру, тем стабильнее работает программа. Знак выбирается из селекта, число вводится в поле
 

AnrDaemon

Продвинутый новичок
Господи, что за дремучий лес… Фанат вчера L2Walker увидел и впечатлён "элегантностью" его интерфейса?
Cramac, словосочетание "лексический парсер" тебе о чём-нибудь говорит? А "конечный автомат"?
http://phpclub.ru/detail/article/2002-11-29
 

Redjik

Джедай-мастер
мне одному кажется, что это статья крайне путано рассказывает о конечных автоматах?
 

hell0w0rd

Продвинутый новичок
ой, какие тут конечные автоматы. Задачка же тривиальная preg_match_all + /([><]{0,1})(\d+)/
 

AnrDaemon

Продвинутый новичок
мне одному кажется, что это статья крайне путано рассказывает о конечных автоматах?
Нет, не одному. Автор с пятого на десятое и обратно скачет. Но при желании разобраться можно.
Хотя применительно к конкретному топику, без этого можно обойтись.
 

Vladson

Сильнобухер
ЭЭЭ мне одному кажется что я попал в раздел юмор ?

Если это не юмор, то даю совет.
1 - ответить почему "не хотелось бы так делать"
2 - точнее озвучить задачу
(А то как-то ответов много, все они правильные в какой-то мере, даже вариант с preg_match не самый страшный, а вот сам вопрос понятен не до конца)
 

antson

Новичок
Партнер клуба
Cramac, если пользователь передает в запрос в одном поле условия вида оператор сравнения и значение, то как ты будешь делать фильтр на sql-injection ?
 

Cramac

Новичок
PHP:
        preg_match_all("/([><]{0,1})(\d+)/",$_GET["kolvo"], $out);
        $where.=" and (";
        if ($out[1][0]==">" or $out[1][0]=="<")
            {
            $where.=" store.Quantity".$out[1][0]."'".$out[2][0]."' and";
            if ($out[1][1]=="<")
                {  
                $where.=" store.Quantity<'".$out[2][1]."' and";
                }
            }
        else $where.=" store.Quantity='".$_GET["kolvo"]."' and";
        $where.=" 1=1)";
 

hell0w0rd

Продвинутый новичок
antson, безотносительно того, что ТС не использует подготовленные выражения, как через регулярку /([><]{0,1})(\d+)/ пропихнуть инъекцию?
 

Cramac

Новичок
есть косяки еще, но никто не мешает добавить фильтрацию вводимых данных и других возможных косяков.
 

hell0w0rd

Продвинутый новичок
Cramac, код у тебя и правда с запашком) Прочитай про PDO и подготовленные выражения, вместо kolvo стоит использовать count и в остальных местах, где есть транслит - заменить на английский аналог.
Ну и возьми лучше query-builder любой.
 
Сверху