如何为JavaScript中Inquirer.prompt的答案创建函数参数?含MySQL
解决你的SQL参数传递与注入问题
我明白你想让addToTable函数更灵活易用,但当前代码有两个关键问题需要修正:一是你传递的是字符串字面量"data.department_name"而非实际用户输入值,二是直接拼接SQL语句存在严重的SQL注入风险。下面是修复后的方案:
核心问题分析
你当前调用addToTable("department_name" , "data.department_name" , "department", "name" )时,第二个参数是字符串"data.department_name",所以SQL语句会直接插入这个字符串,而不是用户输入的部门名称。另外,直接拼接用户输入到SQL里是非常危险的操作,恶意用户可以通过输入特殊字符篡改你的数据库。
修复后的代码
我们可以利用MySQL的参数化查询(占位符?)来安全传递值,同时动态获取用户输入:
function addToTable(prompt_name, table_name, table_col) { inquirer.prompt([ { type: "input", name: prompt_name, message: `Type the ${prompt_name}?` } ]).then(function(data) { // 使用参数化查询,?是占位符,值放在数组里传递 const query = `INSERT INTO ${table_name} (${table_col}) VALUES (?)`; connection.query(query, [data[prompt_name]], function(err, res) { if (err) throw err; console.log(`Successfully added ${data[prompt_name]} to ${table_name}!`); }); }); }; // 调用方式:只需要传入提示名称、表名、列名 addToTable("department_name", "department", "name");
关键改进点
- 移除冗余的
prompt_answer参数:通过data[prompt_name]动态获取用户输入的值,因为prompt_name就是你定义的输入字段name属性,这样更灵活。 - 使用参数化查询:用
?作为值的占位符,把用户输入的值放在数组里作为connection.query的第二个参数,MySQL会自动处理转义,彻底避免SQL注入。 - 模板字符串优化:用ES6模板字符串代替字符串拼接,让代码更易读。
这样修改后,你的函数不仅能正确传递用户输入的变量值,还能保证数据库操作的安全性,同时保持了函数的易用性。
内容的提问来源于stack exchange,提问作者Mr. Dawit
相关产品推荐
相关产品推荐

