簡體   English   中英

為什么我的SQL代碼出現語法錯誤?

[英]How come I'm getting a syntax error in my SQL code?

我在一行上看到一個錯誤

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 Injections,最好避免使用它。

謝謝,@基思。


但是,如果要在字符串中使用變量,則需要組合不同的字符串或使用模板文字

PS:如果您仍然非常想使用模板文字,則可以檢查此節點包 ,它是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 ); 

MySQL中的SQL參數不僅是將參數傳遞給查詢的一種便捷方法,而且如果您不想因SQL注入問題而打開自己的站點,這也是必須的。

您需要進行的更改非常少。

首先將查詢更改為->

const INSERT_PRODUCTS_QUERY = 
   'INSERT INTO products(name, price) VALUES(?, ?)'

當您使用此查詢時,將參數作為第二個參數傳遞。

connection.query(SELECT_ALL_PRODUCTS_QUERY, 
  [name, price],
  (err, results) => {

模板文字不是用簡單的引號引起來,而是用反引號“`”引起來

它應該變成:

const INSERT_PRODUCTS_QUERY =  `INSERT INTO products(name, price) VALUES('${name}',${price})`

您沒有正確提供文字,請按以下方式修改查詢,這是可以相應更改的PHP表示形式。

INSERT INTO products(name, price) VALUES('".${name}."','".${price}."');

文字值的單引號與語言單引號是不明確的,這破壞了查詢語法。

這不是實現此目的的最佳方法,因為它打開了對SQL Injection的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM