更正 node-mysql 的更新查询语法
Correct UPDATE query syntax for node-mysql
我有一个数组 'flag' 并且我已经在我的函数中更改了该数组的值。现在我需要将其更新到数据库中,但我无法这样做。我已经在 table 中有标志列。我不知道如何更新 table
中变量标志内的值
如果我尝试
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) {
报错
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 '' at line 1
有什么建议吗
用对象替换数组,
connection.query('UPDATE visentry SET flag = ?', {flag: flag})
或者添加对custom formatter的支持,这样写:
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 });
它足够聪明来处理数组:
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) { });
如果您想使用第一种方法,那么您应该使用变量,而不是查询中的字符串。正确的语法是:
connection.query('UPDATE visentry SET flag = "' + flag + '"', function(err,rows,fields) { });
但这种方法不够安全,您可能想要转义标志值(引号和其他特殊字符)并使其 sql 友好。
您可以为此目的使用一些类似这样的代码(阅读更多 - Making a javascript string sql friendly):
function mysql_real_escape_string (str) {
return str.replace(/[[=12=]\x08\x09\x1a\n\r"'\\%]/g, function (char) {
switch (char) {
case "[=12=]":
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) { });
我有一个数组 'flag' 并且我已经在我的函数中更改了该数组的值。现在我需要将其更新到数据库中,但我无法这样做。我已经在 table 中有标志列。我不知道如何更新 table
中变量标志内的值如果我尝试
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) {
报错
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 '' at line 1
有什么建议吗
用对象替换数组,
connection.query('UPDATE visentry SET flag = ?', {flag: flag})
或者添加对custom formatter的支持,这样写:
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 });
它足够聪明来处理数组:
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) { });
如果您想使用第一种方法,那么您应该使用变量,而不是查询中的字符串。正确的语法是:
connection.query('UPDATE visentry SET flag = "' + flag + '"', function(err,rows,fields) { });
但这种方法不够安全,您可能想要转义标志值(引号和其他特殊字符)并使其 sql 友好。
您可以为此目的使用一些类似这样的代码(阅读更多 - Making a javascript string sql friendly):
function mysql_real_escape_string (str) {
return str.replace(/[[=12=]\x08\x09\x1a\n\r"'\\%]/g, function (char) {
switch (char) {
case "[=12=]":
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) { });