【问题标题】:NodeJS SQLite3 prepared statement with IN and AND带有 IN 和 AND 的 NodeJS SQLite3 准备好的语句
【发布时间】:2023-04-08 18:35:01
【问题描述】:

我在 Express 中有此 API 设置,但我无法弄清楚如何使用 node.js 中的 SQLite3 使用 IN 语句正确准备语言过滤器。

第一个查询正确地应用了语言过滤器。我得到了正确的结果,但这可能会带来 sql 注入风险。

由于语言过滤器,第二个查询没有找到结果。

如何正确设置 db.prepare 语句以同时接受单词和语言?

app.post('/api/languages/:language/getTextWords', (req, res) => {
    let words = req.body.map(word => word.toLowerCase())
    let wordMap = words.map(() => "?").join(',')
    let language = req.params.language.toLowerCase();

    // the language filter is applied correctly I get results but the statement is not fully prepared
    // let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = '${language}'`, words) 
    
    // no results are found because of the language filter
    let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = '?'`, words, language)
    query.all((err, rows) => {
        if (err) {
            res.status(500).send(err.message)
            throw err;
        }

        if (!rows) {
            res.json([])
        }

        if (rows) {
            res.json(rows)
        }
    })
})

以下是相关数据库表的屏幕截图: words table

【问题讨论】:

    标签: sql node.js prepared-statement node-sqlite3


    【解决方案1】:

    将值作为数组传递:

    let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = ?`, [...words, language]);
    

    【讨论】:

    • 谢谢!这行得通。我之前尝试过[单词,语言],但没有成功。以后我会牢记展开语法。
    猜你喜欢
    • 2012-05-24
    • 2010-11-05
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    相关资源
    最近更新 更多