我正在开发一个小型移动网络应用。我有一个具有LIKE
子句的查询。例如:
SELECT from posts WHERE (title LIKE '%car%') or (content LIKE '%car%');
我遇到的问题是javascript中的变量在其值周围有单引号。所以我得到以下内容:
SELECT from posts WHERE (title LIKE '%'car'%') or (content LIKE '%'car'%');
实际字符串我正在以这种方式构建:
"SELECT from posts WHERE (title LIKE '%" + client.escape(input) + "%') or (content LIKE '%" + client.escape(input) + "%');"
答案 0 :(得分:1)
封闭的'
由escape函数自动添加,因此将%
移到变量内部并将其转义,然后从查询中删除'
:< / p>
input = client.escape('%' + input + '%'); //=== "'%escaped_input%'"
client.query("SELECT * FROM posts WHERE (title LIKE " + input + ") or (content LIKE " + input + ")", function(err, results) {
// ...
});
或者,您也应该能够使用模拟的预准备语句语法:
input = '%' + input + '%';
client.query("SELECT * FROM posts WHERE (title LIKE ?) or (content LIKE ?)", [input, input], function(err, results) {
// ...
});
这将执行类似于sprintf
的操作,将第二个参数数组中的?
占位符替换为正确转义的项(内部使用与上面相同的escape
方法),顺序它们被传递 - 占位符的顺序对应于数组项的顺序。
旁注:我假设您过度简化了查询,删除了SELECT
语句中的所有字段,请记住至少选择一个字段或全部字段(*
),否则它无效SQL语法。