我知道转义在一般情况下是如何工作的,但在这种情况下,我无法得到它来给我想要的结果。
我有张桌子上有一张卡片的清单。在命令的顶部,查询将每个卡片名作为“主列表”推入数组中。在代码的后面,我让用户提供他们想要添加到他们的甲板上的卡名。为了检查他们是否使用的卡片,与拼写完全一样,它取下用户提供的每个卡名,并试图在主列表数组中找到它。
但是,当用户提供带有撇号的卡名(即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:
这就是我现在使用的方法,当它在用户不和谐的内部提供时,尝试并使它找到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])
}
}
如何才能始终匹配主列表中提供的名称?
发布于 2019-07-01 07:39:10
正如注释中解释的那样,通过使用占位符(?
),输入将自动为您转义;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);
})
https://stackoverflow.com/questions/56835305
复制