为什么我的SQL代码出现语法错误?

时间:2018-08-17 12:32:11

标签: javascript sql node.js debugging

我在显示以下内容的行上遇到错误

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");
});

4 个答案:

答案 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。