C MySQL API编写了语句限制

时间:2012-10-28 23:51:06

标签: mysql c api prepared-statement bind

我正在尝试在用C编写的CGI脚本中构建SQL查询。用户在查询页面时传递某种参数,脚本需要查询:

SELECT `name`, `address`, `phone_number` FROM `restaurants` WHERE `name` LIKE '%{parameter}%'

由于转义和安全问题,我显然无法将{s参数}与%s和sprintf替换为字符串。

因此我构建了一份准备好的声明:

const char * statement = "SELECT `name`, `address`, `phone_number` FROM `restaurants` WHERE `name` LIKE '%?%'";

最终发生的事情是我的问号未被解析且绑定失败。当我将语句的结尾更改为“name LIKE?”时,这很有效,除了我丢失了包含该术语的结果而不是等于它,这很糟糕。

是否有可能解决这个问题,并且仍然可以正确安全地使用LIKE和字符串中的参数构建SQL语句?

谢谢!

3 个答案:

答案 0 :(得分:1)

尝试在查询中使用LIKE ?,并使用%添加/追加参数字符串 - 我认为这应该有效(无论如何都是通过PHP apis进行的,可能会使用相同的库。)

在PHP中查看相同的问题:How do I create a PDO parameterized query with a LIKE statement?

答案 1 :(得分:0)

使用php和mysli存在同样的问题。 hack是使用sql函数concat,例如LIKE CONCAT('%',?,'%')也应该在C中工作..

答案 2 :(得分:-1)

为什么不用strcat函数构建一个新的查询字符串? http://home.fhtw-berlin.de/~junghans/cref/MAN/strcat.htm 它应该可以解决你的问题。

//编辑: 例如:

char *cmd = "SELECT `name`, `address`, `phone_number` FROM `restaurants` WHERE `name` LIKE '%":
char *cmdEnd = "%'";

// concat strings
strncat(cmd, parameter, strlen(parameter);
strncat(cmt,cmdEnd);