【发布时间】:2011-06-16 18:18:35
【问题描述】:
考虑下面的代码
char bar[] = "hello world \"One\", two, 'three'";
char *zSQL = sqlite3_mprintf("INSERT INTO stuff (`foo`) VALUES ('%q');", bar ) ;
sqlite3_exec(db, zSQL, 0, 0, 0);
sqlite3_free(zSQL);
/* Produces a exception error */
问题在于 SQL 语句中的引号没有被转义。如果我在 PHP 中编程,我会使用像 sqlite_escape_string 这样的函数来转义字符串,然后再将它们插入 SQL 查询,但我似乎无法在 C++ 中找到等效的函数。我可以构建我自己的类似 sqlite_escape_string 的函数,但我确信必须有一个已经编写/测试过的函数......
c++ 是否有 sqlite_escape_string() 等效函数?
【问题讨论】:
-
根据文档,
%q格式字符串应该转义引号。所以要问的正确问题是,为什么它不起作用?可以发布sqlite3_mprintf调用的结果吗? -
@tim,你是对的,存在语法错误。
-
为什么不使用 std::string bla(szYourstring); bla = bla.replace("'", "''"); char* szCharPointer = bla.c_str();
-
@Quandary 可能还有其他我不知道的字符可能会在将来引起问题。例如转义字符、不可打印字符等。