如何使用escape()方法在节点中使用mysql全文搜索?

如何使用escape()方法在节点中使用mysql全文搜索?,mysql,node.js,Mysql,Node.js,在NodeJS中,我曾经运行LIKE语句查询来从MYSQL数据库获取数据,但是,由于性能差,我更新了查询以使用全文搜索(“where match-on”语句)。我尝试使用“?”占位符或使用escape()方法运行查询(以避免sql注入),但没有成功。查询仅在没有“”占位符或escape()方法的情况下成功运行 我已经查找了提供的其他答案,但找不到解决方案 代码有效-sql注入易受攻击 代码不起作用-添加了吗?避免sql注入的占位符 我在第二次查询中收到的错误消息: 无法查询说明:错误:ER_PA

在NodeJS中,我曾经运行LIKE语句查询来从MYSQL数据库获取数据,但是,由于性能差,我更新了查询以使用全文搜索(“where match-on”语句)。我尝试使用“?”占位符或使用escape()方法运行查询(以避免sql注入),但没有成功。查询仅在没有“”占位符或escape()方法的情况下成功运行

我已经查找了提供的其他答案,但找不到解决方案

代码有效-sql注入易受攻击

代码不起作用-添加了吗?避免sql注入的占位符

我在第二次查询中收到的错误消息:

无法查询说明:错误:ER_PARSE_错误:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解第1行的“(\'Clorox\')”附近使用的正确语法

有没有办法在NodeJS中使用mysql全文搜索,也有办法避免sql注入

提前感谢您的建议

编辑 谢谢你的回答,这对我很有用

function (req,res,next) {
    var userInput = req.query.Name ///values to search
    var modifiedUserInput = userInput.replace(/ /g,"+")
    var productDescription = "'+" + modifiedUserInput+ "'" 
    const queryString = "Select idx, descr, price, product_img, stock, available from \
    prod.product_list_details where match descr against (? IN BOOLEAN MODE)" 
    connection.query(queryString, productDescription, 
      (err, rows, fields) => {
      if (err) {
        console.log("Failed to query for description: " + err)
        res.sendStatus(500)
        return
      }
      console.log("I think we fetched products successfully")

使用占位符时,必须注意这些占位符仅用于数据,不能包含语法元素,这将导致解析错误

在您的情况下,这意味着查询的形式应为:

WHERE MATCH (descr) AGAINST (? IN BOOLEAN MODE)
其中
表示要包含的数据,并且仅表示数据。当你把它放在括号里时,它实际上扩展到:

WHERE MATCH (descr) AGAINST '(...)'
这破坏了语法,因为括号现在位于数据内部,而不是数据周围

对于像
这样的
%
占位符是数据的一部分的东西,您可以将它们放在如下位置:

WHERE x LIKE ?
在其他情况下,您可以执行以下操作:

WHERE x LIKE CONCAT('%', ?)
如果您更喜欢在程序集数据库端执行

在任何情况下,使用带有占位符值的准备好的语句都是非常重要的,所以处理好它是一件大事,而且朝着这个方向努力是很好的


希望这能帮助您达到目的。

+“'+req.query.Name+“'
-这是sql注入漏洞!看:`描述对手在哪里?`似乎不对。你的意思是
descr匹配的位置吗?
?@tadman这是mysql语法的链接,谢谢@alfasin-你的意思是即使使用“?”占位符,这也是sql注入漏洞,如第二个查询所示?@SnowKari啊,我明白你现在想做什么了。如果删除冗余并使用占位符而不是串联,这将更易于阅读。感谢您的回复!很抱歉关于连接的混淆(将编辑我的问题)。是的,我正在尝试根据表单的用户输入(req.query.Name)运行查询。通过连接,它将给我('Name'),因此查询在不使用“?”占位符的情况下成功运行,这是我附加的第一个查询。但是,当我尝试使用“”占位符时,它返回了一个错误。我试图避开LIKE语句,因为查询需要很长时间才能运行。还有其他建议吗?非常感谢!我认为你没有抓住重点。像
这样的占位符仅用于数据。任何语法元素都需要放入准备好的语句中。所以
反对?
将不起作用,想象一下扩展到
反对“(…)”
这是无效的<代码>反对(?)
威尔。它成功了,非常感谢!非常感谢你的解释!
WHERE x LIKE ?
WHERE x LIKE CONCAT('%', ?)