use*_*590 5 mysql node.js node-mysql
我有一个数组'flag',我在我的函数中更改了该数组的值.现在我需要将其更新到数据库中,但我无法这样做.我已经在表格中有标志列.我不知道如何更新表中变量标志的值
如果我试试
connection.query('UPDATE visentry SET flag = "flag" ', function(err,rows,fields) { }
Run Code Online (Sandbox Code Playgroud)
它使用值标志更新列标志.如果我尝试以下
var sql = 'UPDATE visentry SET flag= ?';
connection.query(sql,[{flag:flag}], function(err,rows,fields) {
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误
错误:ER_PARSE_ERROR:您的SQL语法中有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的''附近使用正确的语法
请给我任何建议
它足够聪明来处理数组:
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) { });
Run Code Online (Sandbox Code Playgroud)
如果您想使用第一种方法,那么您应该使用变量,而不是查询中的字符串。正确的语法是:
connection.query('UPDATE visentry SET flag = "' + flag + '"', function(err,rows,fields) { });
Run Code Online (Sandbox Code Playgroud)
但这种方法不够安全,您可能想要转义标志值(引号和其他特殊字符)并使其对 sql 友好。
为此,您可以使用如下代码(阅读更多内容 - Making a javascript string sqlFriendly):
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
}
});
}
Run Code Online (Sandbox Code Playgroud)
因此,这种方法的最佳实践可能是:
connection.query('UPDATE visentry SET flag = "' + mysql_real_escape_string(flag) + '"', function(err,result) { });
Run Code Online (Sandbox Code Playgroud)