我正在尝试使用值数组来填充转义的 SQL 查询。数组被接受。
我正在使用:
function genUpdateString(settings) {
var sql = "";
var first = true;
for (attr in settings) {
if (
settings[attr] != undefined &&
attr != "userid" &&
attr != "api_key"
) {
if (first) {
first = false;
} else {
sql += ", ";
}
sql += attr + "='" + settings[attr] + "'";
}
}
return sql;
}
sql_update = genUpdateString(...);
var sql = "UPDATE user SET " + sql_update + " WHERE name = '" + newSettings.userid + "'";
myCon.query(sql, (err, result) => {
这工作正常,但是当我尝试移动到转义格式时它崩溃了:
var sql = "UPDATE user SET ? WHERE name = ?";
myCon.query(sql, [sql_update, userid], (err, result) => {
当我手动创建字符串时,它运行良好并更新我的数据库表,但使用第二种方法时它会崩溃并出现错误:
Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''age=\'33\'' WHERE name = 'Josephy Krakowski'' at line 1
最佳答案
您的 genUpdateString
函数也不是 SQL 注入(inject)安全的 - 仅添加单引号并不安全。
类似这样的事情 - 我们正在“并行”生成带有问号和参数的查询片段。
function genUpdateAndArgs(map) {
const names = [];
const args = [];
for(var key in map) {
const value = map[key];
if(value !== undefined) {
names.push(key);
args.push(value);
}
}
// ['foo', 'bar'] => 'foo = ?, bar = ?'
const namesFragment = names.map((name) => `${name} = ?`).join(', ');
return [namesFragment, args];
}
const settings = {
'foo': 123,
'bar': 456,
};
const userId = 1337;
const [namesFragment, updateArgs] = genUpdateAndArgs(settings);
const query = `UPDATE user SET ${namesFragment} WHERE name = ?`;
const args = [].concat(updateArgs).concat(userId);
console.log(query, args);
输出为
UPDATE user SET foo = ?, bar = ? WHERE name = ?
[ 123, 456, 1337 ]
然后您可以将其插入db.query
...
但是,我真的衷心推荐像 Knex 这样的查询构建器 - 在 Knex 中,大约是相同的
knex('user')
.where('name', userId)
.update(settings)
关于mysql - 使用设置值数组通过 myCon.query 更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57578283/