Подсыпать синтаксического сахарку в класс для работы с mysql

Фанат

oncle terrible
Команда форума
Зреет тут во мне мысля сделать в своем классике пласехолдер со всякими мелочами типа ASC, DESC, AND, OR, операторами сравнения.

То есть, если, скажем,
PHP:
$data  = $db->getAll("SELECT * FROM table ORDER BY field ?o",$order);
то при
PHP:
$order = 'DESC';
будет всё нормально,
PHP:
$order = "bobby;drop table users -- ";
будет выкидываться исключенение.

И есть у меня по этому поводу два сомнения.
- не слишком ли много пласехолдеров (это будет седьмой)?
- не могу придумать, какая тут может влезть инжекция
 

Фанат

oncle terrible
Команда форума
второе -
PHP:
("ORDER BY ?u ?o, ?u", $date, $order, $id)
а первое, если попадает в запрос динамически - то только руками, из прописанного заранее белого списка

Задача ведь не стоит покрыть 100% случаев.
Это чисто синтаксический сахер, чтобы не писать белый список для таких мелочей каждый раз специально, а прописать 1 раз глобально.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
тогда б стоило разумный дефолт предусмотреть, если это сахар?
 

Фанат

oncle terrible
Команда форума
Ну, в том формате, в котором я это придумал, дефолт сделать невозможно - тут же в одной куче и ASC, и AND, и >=
Да и неверно - с дефолтами.
По-хорошему, неверную ерунду в HTTP запросе еще контроллер должен отлавливать и казать 404. Или выставлять дефолты.
А здесь уже так - для проформы. Ради поддержания парадигмы "форматирование SQL делается строго в одном месте"
 

fixxxer

К.О.
Партнер клуба
Напрашиваются кастомные плейсхолдеры. :)

Типа

SafeMysql::addWhitelistPlaceholder('?o', array('ASC', 'DESC'));
SafeMysql::addPlaceholderFunction('?l', function($value) {
return $this->escapeString(addcslashes($value, '%_') . '%');
});
 

Ragazzo

TDD interested
fixxxer
NO! Надо так
SafeMysql::addPlaceholder(new Placeholders\Whitelist(...))
SafeMysql::addPlaceholder(new Placeholders\Function(...))
:D
 
Сверху