Express.js中如何使用字符串数组构建MySQL的LIKE查询语句
问题原因
你原来的写法直接对数组做字符串拼接,JS会默认调用数组的toString()方法,最终生成的SQL语句是u.u_fullname LIKE "%user,country%",完全不符合查询需求,而且直接拼接用户传入的搜索关键词还存在SQL注入风险。
场景1:匹配任意一个搜索关键词(满足其中一个LIKE条件即可)
正确实现(带参数化查询,防注入)
let search = ["user","country"]; // 生成每个关键词对应的LIKE条件模板 const conditions = search.map(() => 'u.u_fullname LIKE ?').join(' OR '); // 给每个关键词拼接前后的%通配符 const params = search.map(keyword => `%${keyword}%`); // 最终的查询语句模板 const searchStmnt = `SELECT * FROM 你的表名 u WHERE ${conditions}`; // 执行查询示例(以mysql2库为例) const [results] = await connection.execute(searchStmnt, params);
最终执行的等效SQL语句为:
SELECT * FROM 你的表名 u WHERE u.u_fullname LIKE "%user%" OR u.u_fullname LIKE "%country%"
场景2:匹配所有搜索关键词(所有LIKE条件都要满足)
把上述代码里的join(' OR ')改成join(' AND ')即可:
const conditions = search.map(() => 'u.u_fullname LIKE ?').join(' AND ');
注意事项
- 不要直接把用户输入的搜索内容拼接到SQL语句里,必须用参数化查询的方式传入参数,避免SQL注入漏洞。
- 如果搜索的字段数据量较大,建议给对应字段加全文索引,用
MATCH AGAINST语法代替多个LIKE查询,查询效率会高很多。
内容的提问来源于stack exchange,提问作者Sairam Gouni
相关产品推荐
相关产品推荐

