【问题标题】:LIKE clause problemsLIKE 子句问题
【发布时间】:2013-05-08 10:38:19
【问题描述】:

我正在开发一个小型移动网络应用程序。我有一个带有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) + "%');"

【问题讨论】:

  • 您是否从 Node 运行此查询?你用的是哪个mysql模块?
  • 在调用 escape 之前将 % 符号放入您的输入中。
  • SELECT from 看起来也不是有效的 mysql 语法。
  • 你是对的,只是在本地尝试过,connection.scape() 没有转义单引号,很奇怪。
  • 我建议查看这些报价的来源。您对 javascript 的概括只是将它们放在那里是不正确的。

标签: javascript mysql sql node.js


【解决方案1】:

封闭的's 由转义函数自动添加,因此将%s 移动到变量内部并转义它,并从查询中删除's:

input = client.escape('%' + input + '%'); //=== "'%escaped_input%'"
client.query("SELECT * FROM posts WHERE (title LIKE " + input + ") or (content LIKE " + input + ")", function(err, results) {
     // ...
});

Reference - Escaping query values

或者,您也应该能够使用模拟的预处理语句语法:

input = '%' + input + '%';
client.query("SELECT * FROM posts WHERE (title LIKE ?) or (content LIKE ?)", [input, input], function(err, results) {
     // ...
});

这将执行类似于sprintf 的操作,将? 占位符替换为第二个参数数组中正确转义的项目(内部使用与上述相同的escape 方法),按照它们传递的顺序 - 占位符' order 对应于数组项的 order。


旁注:我假设您已经过度简化了从SELECT 语句中删除所有字段的查询,请记住至少选择一个字段或所有字段(*),否则它不是有效的 SQL 语法。

【讨论】:

  • 是的,我通常会使用模拟的准备好的语句,但在这种情况下,我有多个输入要使用 LIKE 子句进行比较。非常感谢您的帮助。
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 2020-01-29
  • 1970-01-01
相关资源
最近更新 更多