function sqlQuery(strings, ...values) {
let query = '';
for (let i = 0; i < strings.length; i++) {
query += strings[i];
if (i < values.length) {
const value = values[i];
if (typeof value === 'number') {
query += value;
} else if (typeof value ==='string') {
query += `'${value.replace(/'/g, "\\\\'")}'`;
} else {
throw new Error('Unsupported value type for SQL query');
}
}
}
return query;
}
相比传统字符串拼接的优势
- 安全性:
- 传统字符串拼接容易受到 SQL 注入攻击,例如恶意用户输入
'; DROP TABLE users; --
会导致数据库表被删除。而上述实现对字符串类型的值进行了单引号转义处理,有效防止了这种情况。
- 类型检查:
- 传统字符串拼接不会对变量类型进行检查,可能会导致错误的 SQL 语句。这里明确对传入的变量进行类型检查,只允许数字和字符串类型,提高了查询的正确性。
- 代码可读性和维护性:
- 模板标签函数使 SQL 查询语句结构更清晰,字符串片段和变量分开,相比复杂的字符串拼接,更易于理解和修改。