如何使用参数化查询更新SQL?

问题描述

我有以下sql语句:

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注入。如果是这样,那么您需要在连接查询之前手动验证列名称(例如,通过对照固定的值列表进行检查)。