如何为sql查询准备C ++字符串

时间:2013-01-23 15:24:11

标签: c++ c sqlite

我必须准备适合查询的字符串,因为这些字符串将在查询中用作字段值。如果它们包含'etc,则sql查询无法执行。

因此我想替换'with''我已经看到了用子串查找和替换子串的代码。但我想问题有点棘手,因为替换字符串也包含两个单引号''替换一个引号'所以当我必须找到下一个出现时它会遇到'故意被替换。

我正在使用Sql lite C api,示例查询可能看起来像这样

 select * from persons where name  = 'John' D'oe'

由于John Doe包含'查询将失败,所以我希望名称中的所有出现'都替换为''

你们如何在查询中准备你的字段值以便在sql中使用的任何想法?可能这是一个基本的东西,但我不太聪明的C / C ++。

你的帮助会非常有帮助

2 个答案:

答案 0 :(得分:4)

使用带参数的查询而不是替换东西,这可能会导致一些问题(如SQL注入漏洞)。

MySQL示例:

sql::Connection *con = ...;
string query = "SELECT * FROM TABLE WHERE ID = ?";
sql::PreparedStatement *prep_stmt = con->prepareStatement(query);
prep_stmt->setInt(1, 1); // Replace first argument with 1
prep_stmt->execute();

这将执行SELECT * FROM TABLE WHERE ID = 1

编辑:有关SQLite准备语句herehere的更多信息。

答案 1 :(得分:1)

这取决于您使用的SQL库。其中一些将具有PreparedStatement的概念,您将使用问号代替变量,然后当您在语句上设置这些变量时,它将在内部确保您不能注入sql命令。