Node.js提交表单数据到MySQL指定行报SQL语法错误如何解决
报错原因
- 核心SQL语法错误:
INSERT语句的作用是向表中插入全新的数据行,语法上不支持搭配WHERE子句使用。你的需求是修改grades表中已存在的、prn匹配指定值的行数据,应该使用UPDATE语句而非INSERT,这就是报错提示WHERE prn = '1'附近语法错误的直接原因。 - 现有代码存在严重SQL注入风险:你通过字符串拼接的方式把用户传入的参数直接拼入SQL语句,攻击者可以构造恶意参数篡改、拖库甚至删除整表数据,必须全部改用参数化查询写法,不要手动拼接参数值。
修复代码
直接替换原有接口逻辑即可,所有参数都使用预编译占位符?传入,从根源避免注入问题,同时修正SQL语句类型:
app.post('/src/grades-form', function(req, res){ const daa = req.body.daa; const os = req.body.os; const dldm = req.body.dldm; const ptrp = req.body.ptrp; const bhr = req.body.bhr; const prn = req.query.prn; // 改用UPDATE语句更新匹配prn的行,所有参数按顺序用?占位 const sql = "UPDATE grades SET daa = ?, os = ?, dldm = ?, ptrp = ?, bhr = ? WHERE prn = ?"; // 按占位符顺序传入所有参数,由mysql驱动自动处理转义 connection.query(sql, [daa, os, dldm, ptrp, bhr, prn], function(error, results){ if(error) throw error; res.send(`Data stored successfully !!<br><a href="/src/dashboard-admin">Return to dashboard.</a>`); }); });
扩展场景说明
如果你需要实现「prn对应的数据不存在就新增,存在就更新原有数据」的逻辑,可以先给prn字段加唯一索引,再使用MySQL的ON DUPLICATE KEY UPDATE语法,对应SQL写法如下:
INSERT INTO grades (prn, daa, os, dldm, ptrp, bhr) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE daa = VALUES(daa), os = VALUES(os), dldm = VALUES(dldm), ptrp = VALUES(ptrp), bhr = VALUES(bhr)
调用时参数数组按顺序传入[prn, daa, os, dldm, ptrp, bhr]即可。
内容的提问来源于stack exchange,提问作者Shridhar
相关产品推荐
相关产品推荐

