通过准备好的语句实现搜索功能的最佳实践 我试图用C++和LIPBQXX实现一个搜索功能。 但我有以下问题: 用户可以指定4种不同的搜索模式(每个模式都是可选的): 从日期开始 迄今为止 文件类型 文件id
它们都是可选的。所以,如果我想使用准备好的语句,我需要2^4=16个不同的准备好的语句。这是可能的,但我想避免这样 以下是libpqxx中准备好的语句的示例:通过准备好的语句实现搜索功能的最佳实践 我试图用C++和LIPBQXX实现一个搜索功能。 但我有以下问题: 用户可以指定4种不同的搜索模式(每个模式都是可选的): 从日期开始 迄今为止 文件类型 文件id,c++,prepared-statement,libpqxx,C++,Prepared Statement,Libpqxx,它们都是可选的。所以,如果我想使用准备好的语句,我需要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
_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);
因此,我也不知道如何将这样一份事先准备好的声明拼凑在一起
还有其他我没有想到的“好”方法吗?最好的方法是使用四个不同的
->prepare
子句,这取决于实际使用的搜索条件的数量,将这些条件连接到字符串中,然后分支到四个prepare
代码块中的一个。(这可能会让您的样式检查器误以为您正在创建一个注入漏洞,但当然不会,只要您只插入封闭集os列名的元素即可。)
请注意,这不是一个很好的解决方案,但即使是Stephane Faroult(SQL艺术)也说这是最好的解决方案,那么我该和谁争论呢?谢谢你的回答。这似乎真的是(至少比16条准备好的语句好一点)解决方案。