javascript - 为什么我的 SQL 代码中出现语法错误?
问题描述
我收到一条错误消息,上面写着
const INSERT_PRODUCTS_QUERY = 'INSERT INTO products(name, price) VALUES('${name}',${price})';
我知道错误来自单引号,'${name}'
但我也尝试删除单引号以试图摆脱此错误,但仍然收到错误消息:
{
"code": "ER_PARSE_ERROR",
"errno": 1064,
"sqlMessage": "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{name}, ${price})' at line 1",
"sqlState": "42000",
"index": 0,
"sql": "INSERT INTO products(name, price) VALUES(${name}, ${price})"
}
这是我的代码:
const express = require('express');
const cors = require('cors');
const mysql = require('mysql');
const app = express();
const SELECT_ALL_PRODUCTS_QUERY = 'SELECT * FROM products';
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'react_sql'
});
connection.connect(err => {
if(err) {
return err;
}
});
app.use(cors());
app.get('/', (req, res) => {
res.send('go to /products to see products')
});
app.get('/products/add', (req, res) => {
const { name, price } = req.query;
const INSERT_PRODUCTS_QUERY = 'INSERT INTO products(name, price) VALUES('${name}',${price})';
connection.query(INSERT_PRODUCTS_QUERY, (err, results) => {
if(err) {
return res.send(err);
} else {
return res.send('successfully added products');
}
});
})
app.get('/products', (req, res) => {
connection.query(SELECT_ALL_PRODUCTS_QUERY, (err, results) => {
if(err) {
return res.send(err)
} else {
return res.json({
data: results
})
}
});
});
app.listen(4000, () => {
console.log("listening port 4000");
});
解决方案
我不太了解 SQL 及其查询,所以对于这个主题(字符串、安全性等),请听听其他人的意见。
正如您在评论中看到的那样,这会将代码打开到 SQL 注入,最好避免使用它。
谢谢,@Keith。
但是如果你想在你的字符串中使用变量,要么你需要组合不同的字符串片段,要么你应该使用模板文字。
PS:如果您仍然非常非常想使用模板文字,您可以查看这个用于 NodeJS 的节点包。sql-template-strings
注意反引号:``
const name = "foo";
const price = 100;
const INSERT_PRODUCTS_QUERY = `INSERT INTO products(name, price) VALUES('${name}',${price})`;
console.log( INSERT_PRODUCTS_QUERY );
推荐阅读
- java - ORA-00905: missing keyword in case statement
- visual-studio-code - 使用 Mac 在 VS 上创建新项目
- sql - 为什么 postgreSQL INSERT 语句中复合类型的语法不同,并且取决于数据类型是命名还是未命名的事实?
- batch-processing - 在批处理脚本中过滤字符串中的单词
- android - Android ConstraintLayout 移动微调器的位置
- angular - 如何检索分组在 forkJoin 中的多个可观察对象的报告进度?
- java - Java Asm wrap new 特定类初始化实例
- amazon-web-services - SageMaker 端点部署尝试查找依赖文件时一直失败
- java - 将地图转换为对象列表
- javascript - 如何在javascript中解析数据