我正在尝试在用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语句?
谢谢!
答案 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);