Node.js中使用MySQL插入数据时遭遇ER_PARSE_ERROR语法错误求助
解决Node.js中MySQL插入数据的语法错误问题
嘿,我一眼就发现你代码里的问题所在了!你的SQL语句直接把values变量写进了字符串里,MySQL会把它当成SQL关键字来解析,而不是你生成的随机激活码,这就是导致语法错误的根本原因。而且这种直接拼接变量的写法还存在SQL注入的安全隐患,绝对不推荐这么用。
下面给你两种解决方案,优先推荐第一种:
方案一:使用参数化查询(最安全可靠)
这是MySQL官方推荐的写法,让驱动帮你处理参数的转义,既避免语法错误,又能防止SQL注入:
var mysql = require('mysql'); var activationKey = randomValueHex(8); // 变量名更清晰,避免和SQL关键字混淆 var sql = "INSERT INTO `activationkeys`(`activationKey`, `productId`) VALUES (?, '3')"; // 把参数放在数组里传给query方法,?会被自动替换成正确转义后的变量值 con.query(sql, [activationKey], function (err, result) { if (err) throw err; console.log("1 record inserted"); });
方案二:字符串拼接(不推荐,仅作参考)
如果你非要用字符串拼接的方式,必须给字符串类型的变量加上单引号,同时要注意转义特殊字符(但手动处理很容易出错):
var mysql = require('mysql'); var activationKey = randomValueHex(8); // 用模板字符串拼接,给变量加上单引号 var sql = `INSERT INTO \`activationkeys\`(\`activationKey\`, \`productId\`) VALUES ('${activationKey}', '3')`; con.query(sql, function (err, result) { if (err) throw err; console.log("1 record inserted"); });
总结
一定要优先选择参数化查询的方式,它不仅解决了你的语法错误,还从根源上杜绝了SQL注入的风险,让你的代码更安全健壮。
内容的提问来源于stack exchange,提问作者Manoj A
相关产品推荐
相关产品推荐

