问题描述
var sql = UPDATE tableName SET ? = ? WHERE ? = ?";
db.query(
sql,[asset.getColOne(),asset.getValOne(),asset.getColTwo(),asset.getValTwo()],callback
);
和
{
"colOne": "colName","valOne": 1,"colTwo": "colName","valTwo": 0
}
但是当我尝试执行此操作时,出现语法错误,指出我的sql语句是:
错误代码:1064。您的sql语法有错误;检查 相应于您的MariaDB服务器版本的手册 在第1行的'colName'= 1 WHERE'colName'= 0'附近使用的语法
是否可以指定列名或克服单引号?谢谢
解决方法
您不能将表名或列名作为参数传递给查询。准备好的语句机制旨在传递文字值,而不是此类元数据。
在这里,您需要使用字符串连接:
var sql = "UPDATE tableName SET `" + asset.getColOne() + "` = ? WHERE `" + asset.getColTwo() + "` = ?";
db.query(sql,[asset.getValOne(),asset.getValTwo()],callback);
请注意,我在表名和列名的周围添加了反引号,以防它们不能用作未加引号的标识符。
但是请记住,如果变量来自代码外部,则使用这种技术将使您的代码可以进行SQL注入。如果是这样,那么您需要在连接查询之前手动验证列名称(例如,通过对照固定的值列表进行检查)。