我在显示以下内容的行上遇到错误
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");
});
答案 0 :(得分:1)
我对SQL及其查询的了解不多,因此对于这个主题(字符串,安全性等),请听别人讲。
正如您在注释中看到的那样,这将打开SQL注入代码,最好避免使用它。
谢谢@Keith。
但是,如果要在字符串中使用变量,则需要组合不同的字符串,或者应使用template literals。
PS:如果您仍然非常想使用模板文字,则可以检查this node package,它是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 );
答案 1 :(得分:1)
MySQL中的SQL参数不仅是将参数传递给查询的便捷方法,而且如果您不想因SQL注入问题而打开自己的站点,这也是必须的。
您需要进行的更改很小。.
首先将查询更改为->
int[]
当您使用此查询时,将参数作为第二个参数传递。
const INSERT_PRODUCTS_QUERY =
'INSERT INTO products(name, price) VALUES(?, ?)'
答案 2 :(得分:0)
Template literals的周围不是简单的引号,而是由反引号“`”
它应该变成:
const INSERT_PRODUCTS_QUERY = `INSERT INTO products(name, price) VALUES('${name}',${price})`
答案 3 :(得分:0)
您没有正确提供文字,请按以下方式修改查询,这是可以相应更改的PHP表示形式。
INSERT INTO products(name, price) VALUES('".${name}."','".${price}."');
文字值的单引号与语言单引号不明确,这会破坏查询语法。
这不是实现此目的的最佳方法,因为它会打开查询到SQL Injection。