Node.js拼接MySQL INSERT INTO语句报ER_PARSE_ERROR语法错如何解决?
问题根源
- MySQL要求字符串类型的字段值必须用单/双引号包裹,你直接把
usrname、usrpwd这类字符串变量拼接到SQL中时没有加引号,生成的SQL就变成了VALUES(Behran Meydaner, 2222...),MySQL会把Behran识别为字段名/表名,碰到后面的空格就直接报语法错误。你测试时用的密码是纯数字,MySQL可以自动识别为数值类型所以没报错,如果密码包含字母、特殊字符也会触发同样的语法错误。 - 另外你这种直接拼接用户输入到SQL的写法存在严重的SQL注入风险,恶意用户可以构造特殊输入删库、拖走所有住户数据,绝对不能在生产环境使用。
- 补充提醒:不要明文存储用户密码,建议用bcrypt等工具哈希加密后再存入数据库,避免数据泄露后住户密码直接暴露。
修复方案
临时修复(仅解决当前报错,不推荐生产用)
给所有字符串类型的变量外层加单引号,注意JS字符串内的单引号需要用反斜杠转义:
// 仅修改VALUES拼接行 'VALUES(\''+usrname+'\', \''+usrpwd+'\', '+usrblokno+', '+usrdaireno+', '+curryear+', '+usraidat+', ' +
这种写法如果用户名/密码本身包含单引号还是会报错,且仍存在SQL注入风险。
标准修复(推荐,自动处理转义+防注入)
使用MySQL驱动自带的参数化查询功能,不用手动拼接引号,驱动会自动处理类型匹配、特殊字符转义:
function addUser(usrname, usrpwd, usrblokno, usrdaireno, usraidat, callback) { var today = new Date(); var curryear = today.getFullYear(); // 用?作为参数占位符 var sql = 'INSERT INTO havuzs_sakinleri (isim, sifre, blokno, daireno, yil, aylik_aidat, ' + 'ay1_no, ay1_odemesi, ay2_no, ay2_odemesi, ay3_no, ay3_odemesi, ay4_no, ay4_odemesi, ' + 'ay5_no, ay5_odemesi, ay6_no, ay6_odemesi, ay7_no, ay7_odemesi, ay8_no, ay8_odemesi, ' + 'ay9_no, ay9_odemesi, ay10_no, ay10_odemesi, ay11_no, ay11_odemesi, ay12_no, ay12_odemesi, ' + 'toplam_odenen_tl, devredilen_tl, aidat_bakiye) ' + 'VALUES(?, ?, ?, ?, ?, ?, ' + '1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 0, 0, 0)'; // 第二个参数传入参数数组,顺序和占位符?一一对应 con.query( sql, [usrname, usrpwd, usrblokno, usrdaireno, curryear, usraidat], function( err, res ){ let status_message; if ( err ) { throw err; status_message=('Site sakini eklenirken sorun oluştu.'); } else { status_message = ("Bu kisi yeni site sakini olarak veri tabanina eklendi. Ana sayfaya dönmek için lütfen Ana sayfa butonuna tıklayınız!"); } return callback( status_message ); } ); }
内容的提问来源于stack exchange,提问作者user16617036
相关产品推荐
相关产品推荐

