Node.js使用mysql2将表名作为变量传参出现??附近SQL语法错误如何解决?
问题原因
你出现语法报错的核心原因是混淆了mysql2中query和execute两个方法的实现逻辑:
??双问号作为标识符(表名、字段名)占位符,是mysqljs/mysql2客户端转义逻辑提供的特性,仅对query方法生效- 你调用的
execute方法走的是服务端预处理语句逻辑,服务端原生的预处理机制不允许把表名、字段名这类标识符作为占位符参数,所以你的??不会被解析替换,直接作为SQL语法的一部分提交到数据库,自然触发语法错误。
解决方案
方案1:改用query方法执行查询
直接把pool.execute替换成pool.query即可,该方法会在本地完成占位符替换后再把完整SQL提交给数据库,符合你原有的写法逻辑:
tableName = "some_table" id = "some_id"; const readForwardedMessageDetails = pool.query('SELECT * FROM ?? WHERE `id` = ? LIMIT 1', [tableName, id], function(err, row) { if (err) { console.log(err) return } // 后续业务逻辑 } )
方案2:保留execute方法的场景,先手动转义表名
如果需要使用execute的服务端预处理特性,先用mysql2提供的escapeId方法手动转义表名(避免SQL注入风险),拼接进SQL语句后再用execute处理值参数即可:
const mysql = require('mysql2'); tableName = "some_table" id = "some_id"; // 先转义表名 const escapedTableName = mysql.escapeId(tableName); const readForwardedMessageDetails = pool.execute(`SELECT * FROM ${escapedTableName} WHERE \`id\` = ? LIMIT 1`, [id], function(err, row) { if (err) { console.log(err) return } // 后续业务逻辑 } )
内容的提问来源于stack exchange,提问作者DragonFire
相关产品推荐
相关产品推荐

