繁体   English   中英

如何在撇号中转义以匹配Node.js / Discord.js中MySQL数据库的数据?

[英]How can I escape an apostrophe to match data from a MySQL database in Node.js/Discord.js?

我知道转义通常是如何工作的,但是在这种情况下,我无法获得转义以得到期望的结果。

我有一张桌子,上面有一张卡片清单。 在命令的顶部,我让查询将每个卡的名称作为“主列表”推送到一个数组中。 在代码的后面,我让用户提供他们想要添加到卡座中的卡名。 为了检查他们使用的卡是否与拼写完全相同,它采用用户提供的每张卡名称并尝试在主列表数组中找到它。

但是,当用户提供带有撇号的卡名(即Drago's Fury )时,它拒绝在列表中找到卡名。

我尝试用\\'''替换所有出现的'''以及两个,多个\\'和多个' '的不同组合。 似乎没有什么能与我匹敌。 Drago's Fury在表中确实含有' S IN的名字如预期,因为我能够把它放到桌子用逃避它\\'

这是我的代码:

con.query(`SELECT * FROM cardsmaster`, (error, rows, fields) => {
    let cardsList = []
    for (var i in rows) {
        cardsList.push(rows[i].name)
    }
});

这是MySQL表中列出Drago's Fury方式:
MySQL表

这是我现在用来尝试逃避它并使它在用户的Discord内部提供的Drago's Fury找到Drago's Fury东西:

cardsToAdd = cardsToAdd.content.replace(/'/gi, "\'");

这是cardsToAdd在替换后登录时显示Drago's Fury的方式:

安慰

但是然后我收到此错误:

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Fury, Fierce Boost, Fierce Boost, Fiery Rage, Fire Boost, Fire Boost, Magma Bo' at line 1

因此,我尝试:

cardsToAdd = cardsToAdd.content.replace(/'/gi, "\\'");

我当时以为第一个\\将逃避第二个\\和撇号,但这并不是我想要的。 传入的值是相同的,除了它具有双引号而不是单引号,因此我不确定这是否引起了问题...

这是尝试获取用户提供的内容并在主列表中找到它的部分:

let usercardnamearray = cardsToAdd.split(", ")

let matchedcards = []
let unmatchedcards = []

for (let i = 0; i < usercardnamearray.length; i++) {

    console.log(usercardnamearray[i])

    let found = cardsList.indexOf(`${usercardnamearray[i]}`)
    console.log(found)

    if (found >= 0) {
        matchedcards.push(usercardnamearray[i])
    } else if (found == -1){
        unmatchedcards.push(usercardnamearray[i])
    }
}

如何在主列表中始终匹配提供的名称?

如注释中所述,通过使用占位符( ? ),将自动为您转义输入; node-mysql驱动程序自行对其使用mysql.escape() 这将防止注入和您当前的错误,而无需您自己执行其他任何操作。 您的撇号不会触发相同的错误,因为它是按字面意思而不是作为语句的一部分读取的。

用法示例:

const name = "Drago's Fury";

con.query("SELECT * FROM cardmaster WHERE name = ?", [name], (err, rows) => {
  if (err) return console.error(err);

  console.log(rows);
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM