NodeJS “where子句”中的列“id”未知

wgxvkvu9  于 2022-12-18  发布在  Node.js
关注(0)|答案(1)|浏览(201)

我想这几行代码有问题

app.post('/delete/:id',(req,res)=>{
    db.execute(`DELETE FROM 'tabel' WHERE id = ${req.params.id}`)
    res.redirect('/')
})

当我试图删除一些东西时,它会给我'42 S22'状态,每次我尝试它时都会得到一个错误。这是我在Ejs中的窗体的样子

<% data.forEach(row=>{ %>
        <form action="/delete/<%= row.id %>" method="POST">
            <input type="submit" value="X">
        </form>
    <% }) %>

此代码是在Nodejs和MySql中编写的!
我试过在youtube和谷歌搜索,但我不能得到正确的答案,所以我希望我会得到正确的答案在这里由我的小伙子大学!

6vl6ewon

6vl6ewon1#

我发现你的代码有些问题。
首先,在DELETE语句中使用单引号将表名括起来,但应该使用反引号(')。在SQL中,单引号用于将字符串值括起来,而反引号用于将表名和列名括起来。
第二,您使用req对象的params属性来访问路由中的id参数,但此属性用于访问路由路径本身中的参数,因此如果您的路由定义为/delete/:id,则可以使用req.params.id访问id参数。如果id参数作为查询字符串或请求正文的一部分传递,则需要使用req对象的不同属性来访问它。例如,如果id参数作为查询字符串传递,则可以使用req.query. id来访问它。
以下是应用这些更改后的代码外观:

app.post('/delete/:id', (req, res) => {
  db.execute(`DELETE FROM \`tabel\` WHERE id = ${req.params.id}`)
  res.redirect('/')
})

但是,这段代码仍然容易受到SQL注入攻击,因为您使用字符串插值来构造SQL查询,而应该使用参数化查询来避免这个问题。
下面是一个如何使用参数化查询重写代码的示例:

app.post('/delete/:id', (req, res) => {
  db.execute(`DELETE FROM \`tabel\` WHERE id = ?`, [req.params.id])
  res.redirect('/')
})

在本例中,我用?占位符替换了字符串插值,并将id值作为附加参数传递给execute方法,这样数据库驱动程序就可以正确地转义id值,防止SQL注入攻击。

相关问题