Node.js中参数化查询实现及查询行数输出异常解决
解决方案
1. 转换为参数化查询
原代码用字符串拼接参数存在SQL注入风险,改成参数化查询只需利用pool.execute的参数占位功能:
static async addServiceDetail(shopId,serviceId,genderTypeId,price,serviceName) { // 用?作为参数占位符,避免直接拼接字符串 const sql = `SELECT id from hc_servicesdetail WHERE shopId=? AND serviceId=? AND genderTypeId=?`; // 将参数以数组形式传入execute方法 const [rows, fields] = await pool.execute(sql, [shopId, serviceId, genderTypeId]); // 后续代码 }
这种方式不仅能防范SQL注入,还能避免参数含特殊字符导致的SQL语法错误。
2. 正确获取查询总行数
你看到[object object]是因为rows是数组对象,直接和字符串拼接会触发默认的toString方法。要获取总行数,取数组的length属性即可:
static async addServiceDetail(shopId,serviceId,genderTypeId,price,serviceName) { const sql = `SELECT id from hc_servicesdetail WHERE shopId=? AND serviceId=? AND genderTypeId=?`; const [rows, fields] = await pool.execute(sql, [shopId, serviceId, genderTypeId]); // 用模板字符串打印行数 console.log(`total rows are ${rows.length}`); // 判断条件要改成检查length,不能直接用数组和数字比较 if(rows.length < 1) { // further code } }
原代码里if(rows <1)永远不会生效,因为数组和数字比较会被转为NaN,NaN和任何数字比较结果都是false,必须通过rows.length判断结果集行数。
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

