наилучшая практика для реализации функции поиска через подготовленные операторы - PullRequest
1 голос
/ 21 июня 2010

Я пытаюсь реализовать функцию поиска с использованием c ++ и libpqxx. Но у меня есть следующая проблема: Пользователь может указать 4 различных шаблона поиска (каждый из них необязательный):

  1. от даты
  2. до даты
  3. тип документа
  4. идентификатор документа

Каждый из них не является обязательным. Поэтому, если я хочу использовать подготовленные утверждения, мне нужно 2 ^ 4 = 16 различных подготовленных утверждений. Ну, это возможно, но я хочу этого избежать.

Вот в качестве примера, как выглядит подготовленный оператор в libpqxx:

_connection->prepare("ExampleStmnt", "SELECT * FROM foo WHERE title=$1 AND id=$2 AND date=$3")
    ("text", pqxx::prepare::treat_string)
    ("smallint", pqxx::prepare::treat_direct)
    ("timestamp", pqxx::prepare::treat_direct);

Поэтому я также понятия не имею, как бы я собрал такое подготовленное утверждение.

Есть ли какой-нибудь другой "хороший" способ, о котором я не думал?

1 Ответ

2 голосов
/ 21 июня 2010

Лучшее, что вы можете сделать, - это иметь четыре различных предложения ->prepare, в зависимости от того, сколько критериев поиска фактически используется, объединить критерии в вашу строку и затем перейти к одному из четырех блоков кода prepare. (Это, вероятно, заставит вашу проверку стиля думать, что вы создаете уязвимость для инъекций, но, конечно, это не так, если вы вставляете только элементы с закрытыми именами столбцов os.)

Обратите внимание, что это не очень хорошее решение, но даже Стефан Фарулт (в Искусство SQL ) говорит, что это лучшее из возможных, так кто я такой, чтобы спорить?

...