【问题标题】:Node MySQL escape LIKE statement节点 MySQL 转义 LIKE 语句
【发布时间】:2021-08-29 02:03:24
【问题描述】:

如何在 node-mysql 中转义 MySQL LIKE 语句?

类似的东西

"SELECT * FROM card WHERE name LIKE '%" + connection.escape(req.body.search) + "%'"

结果

'SELECT * FROM card WHERE name LIKE \'%\'hello\'%\''

这是一个语法错误。如果我使用

的替代语法
connection.query("SELECT * FROM card WHERE name LIKE '%?%'", req.body.search, function () {});

导致类似的语法错误。我也试过了

connection.query("SELECT * FROM card WHERE name LIKE ?", '%' + req.body.search + '%', function () {});

最后只是转义了“%”符号。

【问题讨论】:

  • 第三个例子是正确的,你看到的确切问题是什么?请注意,如果您要搜索字面上包含百分号的字符串,即trickier

标签: javascript mysql node.js node-mysql


【解决方案1】:

不知道为什么它在您的上一个示例中转义 %,因为这对我来说很好:

// lifted from my code:
var value = 'ee20e966289cd7';
connection.query('SELECT * from django_session where session_key like ?', '%' + value + '%', ...)

// Result:
[ { session_key: '713ee20e966289cd71b936084a1e613e', ... } ]

当我在驱动程序中打开调试(将debug:true 作为参数传递给mysql.createConnection)时,它不会转义百分号:

{ command: 3,
  sql: 'SELECT * from django_session where session_key like \'%ee20e966289cd7%\'' }

(它确实转义了单引号,但这仅用于显示目的)

(使用mysql@2.0.0-alpha8

【讨论】:

  • 如果我想做这样的事情怎么办? query = 'SELECT * from Events e where e.Zipcode='+mysql.escape(req.body.near)+" and e.EventName LIKE %"+mysql.escape(req.body.find)+'%'; 然后将其传递给查询数据库?我遇到了同样的错误
  • 我收到这样的错误:`错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'sometext'%')' 附近使用正确的语法。我不明白为什么要加上额外的单引号!
【解决方案2】:

我在类似的事情上取得了成功

"SELECT * FROM card WHERE name LIKE " + connection.escape('%'+req.body.search+'%')

【讨论】:

  • 这行得通。 connection.escape 以一种奇怪的方式工作。我试图在 connection.escape 周围加上 % 符号,然后得到类似 %'value'% 的东西。那将完全破坏查询。但现在得到了正确的。谢谢你。干杯!
【解决方案3】:

怎么样

mysql.format("SELECT * FROM card WHERE name LIKE CONCAT('%', ?,  '%')", req.body.search)

?

【讨论】:

    【解决方案4】:

    你总是可以做到的

    variable = '%${variable}%'
    "SELECT * FROM 'table' WHERE ('foo' LIKE ?);", 
    [variable], callback =>
    

    【讨论】:

    • 你这是什么意思?您能否在您的代码中添加一些解释,以便其他人可以从中学习?
    • 假设您有一个名为 searchUser 的方法,它获取名称作为参数并返回用户数据,如果用户不存在则返回 false searchUser(user){ name = %${name}%` db.query(" SELECT * FROM users WHERE name LIKE ?;", [name], (erro, callback)) }`
    • 重点是使用javascript模板字符串在LIKE用来搜索的字符串中包含%操作符。
    • 请通过编辑将所有解释添加到您的答案中
    【解决方案5】:

    我遇到了同样的问题并这样解决了:

    function search(searchTerm) {
    
        let replacement = `'%${searchTerm}%'`;
    
        let sqlStatement = `SELECT * from  clients where firstName LIKE ${replacement}`;
    
        const [rows, fields, error] = connection.query(sqlStatement);
    
        return rows;
    
    }
    

    【讨论】:

    • 不要使用它。 SQL 注入。
    【解决方案6】:

    简单易行的方法:

    `SELECT * FROM card WHERE name LIKE ` + connection.escape(`%${req.body.search}%`)
    

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 2016-04-18
      • 2020-09-23
      • 2011-10-18
      相关资源
      最近更新 更多