[英]Multiple wildcards via prepared statements for node.js mysql query
我有一个像这样的JSON:
{"name":[{"tag":"Peter"}]}
而且我正在动态构建带有多个通配符的准备好的语句,如下所示:
var sqlVar;
sqlVar += existParams.map(field => {
if (field === 'name') {
function getValues(item, index) {
var getVal = [item.tag];
return `${field} LIKE ?`;
}
return '('+name.map(getValues).join(' OR ')+')';
} else {
return `(${field} = ?)`
}
}).join(" AND ");
var sql = "SELECT * FROM names "+sqlVar+"";
connection.query(sql,
...
function getValues(item, index) {
var getVal = [item.tag];
return '%' + getVal + '%';
}
return name.map(getValues);
//Further attempts
//var getResult = name.map(getValues);
//return getResult.split(",");
//return name.map(getValues).join(', ');
, function(err, rows) {
...
});
如果我有一个价值,那就很好。 在console.log(SQL)中,我可以看到:
SELECT * FROM names WHERE (name LIKE ?)
但是...如果我有多个值,例如:
{"name":[{"tag":"Peter"},{"tag":"Jack"}]}
我收到一个SQL错误:
sql: 'SELECT * FROM names WHERE (name LIKE \'%Peter%\', \'%Jack%\' OR name LIKE ?) }
...因此第二个值不会移到第二个位置。
...但是结果应该是:
sql: 'SELECT * FROM names WHERE (name LIKE \'%Jack%\' OR name LIKE \'%Peter%\') }
...因此在console.log(sql)中:
SELECT * FROM names WHERE (name LIKE ? OR name LIKE ?)
我缺少什么?如何获得第二个LIKE的第二个值,依此类推?
这是一个类似的示例,但是只有一个值: nodejs通过预准备语句向MySQL抛出错误,如查询
此处导致结果语句的唯一原因是'SELECT * FROM names WHERE (name LIKE \\'%Peter%\\', \\'%Jack%\\' OR name LIKE ?)
是您传递了一个嵌套数组,该数组的值为[['%Peter%', '%Jack%']]
而不是一个固定的数组。
使用给定的对象说,
const source = {"name":[{"tag":"Peter"}, {"tag":"Jack"}]}
然后,准备好的语句的查询值应为
const queryValues = source.name.map(({tag}) => `%${tag}%`);
// [ '%Peter%', '%Jack%' ]
connect.query(sql, queryValues, (err, rows) => {
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.