如何使用动态数组使用where子句查询mysql数据库
Posted
技术标签:
【中文标题】如何使用动态数组使用where子句查询mysql数据库【英文标题】:how to query mysql database with where clause using dynamic array 【发布时间】:2014-06-01 11:43:47 【问题描述】:我正在尝试使用下面的 where 子句查询 mysql 数据库。
这里的popularTopicsNames是一个动态数组,它的长度和元素是变化的。
var scoreQuery=connection.query('SELECT * FROM LEADERBOARD WHERE SUBTOPIC IN ('+popularTopicsNames+')', function(err,result,fields)
if(err) throw err;
else
console.log(result);
【问题讨论】:
【参考方案1】:这将以更易读的方式解决问题。
var scoreQuery = connection.query(`SELECT * FROM LEADERBOARD WHERE SUBTOPIC IN (?)`, [popularTopicsNames],
(err, result, _fields) =>
if (err)
throw err;
else
console.log(result);
);
【讨论】:
【参考方案2】:如果它只是一个数组,那么你试图将它作为一个字符串传递,这是行不通的。
试试
var scoreQuery = connection.query("SELECT * FROM LEADERBOARD WHERE SUBTOPIC IN ('" + popularTopicsNames.map(mysql.escape).join("','") + "')",
function(err, result, fields)
if (err)
throw err;
else
console.log(result);
);
【讨论】:
括号内缺少开头和结尾的单引号。如果没有它们,您最终会得到数组中超过 1 个项目的无效 SQL。示例:SELECT * FROM LEADERBOARD WHERE SUBTOPIC IN (foo','bar) 另外,如果主题名称是用户提交的,那么应该先对其进行适当的转义,以防止SQL注入攻击。 我认为你需要类似popularTopicsNames.map(mysql.escape).join("','")
的东西。
@mscdex 你是对的,因为转义返回值用引号括起来。以上是关于如何使用动态数组使用where子句查询mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章
从选项(来自 rds - mysql)创建动态框架,提供带有 where 子句的自定义查询