通过预准备语句实现搜索功能的最佳实践

时间:2010-06-21 09:58:30

标签: c++ prepared-statement libpqxx

我正在尝试使用c ++和libpqxx实现Search-Function。 但是我遇到了以下问题: 用户可以指定4种不同的搜索模式(每种模式都是可选的):

  1. 从日期开始
  2. 至今
  3. 单据类型
  4. 文档ID
  5. 每个都是可选的。因此,如果我想使用预处理语句,我需要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 个答案:

答案 0 :(得分:2)

您可以做的最好的事情是拥有四个不同的->prepare子句,具体取决于实际使用的搜索条件数量,将条件连接到您的String中,然后分支到四个prepare之一代码块。 (这可能会让你的样式检查器误以为你正在创建一个注入漏洞,但当然你不是,只要你只插入封闭集os列名的元素。)

请注意,这不是一个非常好的解决方案,但即使是Stephane Faroult(在 SQL的艺术中)也说这是最好的解决方案,那么我应该争辩谁呢?