更正node-mysql的UPDATE查询语法
我有一个数组“标志”,我已经改变了我的函数中的数组的值。 现在我需要更新到数据库,但我无法这样做。 我已经在桌上有了旗帜专栏。 我不知道如何更新表中variables标志的值
如果我尝试
connection.query('UPDATE visentry SET flag = "flag" ', function(err,rows,fields) { }
它用值标志更新列标志。 如果我尝试以下
var sql = 'UPDATE visentry SET flag= ?'; connection.query(sql,[{flag:flag}], function(err,rows,fields) {
它给出了一个错误
错误:ER_PARSE_ERROR:您的SQL语法中有错误; 检查与您的MySQL服务器版本相对应的手册,在第1行附近使用正确的语法
任何build议,请
处理数组足够聪明:
var sql = 'UPDATE visentry SET flag= ? WHERE row_name = ?'; var row_name = 'blah_blah_blah'; connection.query(sql,[flag, row_name], function(err,rows,fields) { });
如果你想使用你的第一种方法,比你应该使用一个variables,而不是你的查询中的string。 正确的语法是:
connection.query('UPDATE visentry SET flag = "' + flag + '"', function(err,rows,fields) { });
但是这种方法不够安全,你可能想要逃避标志(引号和其他特殊字符)的值,并使其对SQL友好。
你可以使用这个目的的一些代码(阅读更多 – 使一个JavaScriptstringSQL友好 ):
function mysql_real_escape_string (str) { return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) { switch (char) { case "\0": return "\\0"; case "\x08": return "\\b"; case "\x09": return "\\t"; case "\x1a": return "\\z"; case "\n": return "\\n"; case "\r": return "\\r"; case "\"": case "'": case "\\": case "%": return "\\"+char; // prepends a backslash to backslash, percent, // and double/single quotes } }); }
所以,这种方法的最佳实践可能是:
connection.query('UPDATE visentry SET flag = "' + mysql_real_escape_string(flag) + '"', function(err,result) { });
用对象replace数组,
connection.query('UPDATE visentry SET flag = ?', {flag: flag})
或者添加对自定义格式化程序的支持,并像这样写:
connection.query("UPDATE visentry SET flag = :flag", { flag: flag });
考虑下面的代码片段:
connection.query('UPDATE visentry SET ?', {flag: flag}, function(err, result)
要么
connection.query('UPDATE visentry SET flag = ?', [flag], function(err, result)
要么
connection.query("UPDATE visentry SET flag = :flag", { flag: flag });