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

标签 mysql node.js discord.js

我知道转义一般是如何工作的,但在这种情况下,我无法让它给我想要的结果。

我有一张 table ,里面有卡片列表。在命令的顶部,我将查询将每个卡名称作为“主列表”推送到数组中。稍后在代码中,我让用户提供他们想要添加到牌组中的卡牌名称。为了检查他们使用的卡片是否存在且拼写完全一致,它会获取用户提供的每个卡片名称并尝试在主列表数组中找到它。

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

我尝试将所有出现的 ' 替换为 \''' 以及两者的几种组合,多个 \' 和多个不同数量的 ' 。似乎没有什么能让我与之匹配。表中的 Drago's Fury 确实按预期包含名称中的 ',因为我能够通过使用 \'< 转义它来将其放入表中.

这是我的代码:

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

以下是 Drago's Fury 在 MySQL 表中的列出方式:
MySQL Table

这就是我现在正在使用的方法,当用户在 Discord 中提供Drago's Fury时,尝试转义它并使其找到它:

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

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

Console

但随后我收到此错误:

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() 。这将防止注入(inject)和您当前的错误,而您无需自己执行任何其他操作。您的撇号不会触发相同的错误,因为它是按字面意思读取的,而不是作为语句的一部分。

使用示例:

const name = "Drago's Fury";

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

  console.log(rows);
})

关于mysql - 如何转义撇号以匹配 Node.js/Discord.js 中 MySQL 数据库的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56835305/

相关文章:

mySQL 数据库 : Reset AutoIncrement Fields

mysql - 我已经在nodejs中创建了mysql连接,它显示数据库已连接,但显示错误为未定义的数据库

node.js - 仅在一台服务器上测试不和谐机器人discordjs

javascript - React/Redux 状态在第二次操作调用时为空

node.js - 当覆盖下划线字段时,Sequelize 不会清理 dataValues

javascript - 在根服务器上找不到 Discord JS v13 FFmpeg

javascript - Discord.js 按 ID 删除消息

php - 为什么我的 MySQL 连接很慢?

mysql - 创建表时时间字段发生变化

mysql - 列出最受欢迎目的地的所有记录