如何在 Knex 中像查询一样转义 %?

Jun*_*Jun 8 javascript mysql node.js knex.js

我正在使用knex生成我的 SQL 查询。在knex文档中,它显示了这一点

knex('users').where('columnName', 'like', '%rowlikeme%')
Run Code Online (Sandbox Code Playgroud)

现在在我的应用程序中,我这样做了:

function search(term) {
  term = "%" + term + "%";
  knex('table').where('description', 'like', term);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能逃脱,%以便它也%作为术语的一部分进行搜索?

谢谢。

coo*_*koo 5

对于这种情况,我使用

而是来自es6(安全版本)的字符串插值

knex('table').where('description', 'like', `%${term}%`)
Run Code Online (Sandbox Code Playgroud)

??参数绑定

knex('table').whereRaw('description like \'%??%\'', [term])
Run Code Online (Sandbox Code Playgroud)

但在第一种情况下,您必须 100% 确定该术语是有效的,因为SQL 注入可能性

  • _first_ 示例有 SQL 注入的可能性。第二个是使用命名参数,所以应该是安全的。 (4认同)
  • `.where` 中的术语被转义,因此不存在注入风险:https://github.com/knex/documentation/issues/73#issuecomment-572482153 (4认同)
  • 第二个是严重错误的,根本不应该工作(“??”绑定应该只用于标识符,所以如果“term”中有点,它将失败)。第一个应该没问题,但我不知道它是否真的能够匹配“%”字符。 (2认同)

And*_*cha 5

所以我正在寻找一种将 LOWER 函数应用于参数的正确方法。这是对我来说似乎效果很好的解决方案:

builder.whereRaw('LOWER(last_name) LIKE LOWER(?)', [`%${lastName}%`])
Run Code Online (Sandbox Code Playgroud)


小智 0

使用 RLIKE 而不是如下所示的 LIKE,它应该适合您。

function search(term){
    knex('table').where('description','rlike',term);
    ...
}
Run Code Online (Sandbox Code Playgroud)