Запрос ВСТАВКИ MySQL не добавляет никаких данных

#mysql #node.js

Вопрос:

У меня есть приложение узла, которое вставляет некоторые данные в базу данных. Проблема в том, что при выполнении INSERT INTO запроса данные не добавляются в базу данных. После выполнения INSERT запроса я запустил SELECT один для тестирования, и он вернул пустой список. Я также запросил базу данных из DataGrip, и это также показало items , что таблица полностью пуста.

Это мой код, который, насколько я могу судить, является правильным:

 let items = require("../data/items.json");
for (let [categoryName, itemList] of Object.entries(items)) {
    if (categoryName !== "all") {
        for (let item of itemList) {
            let itemInfo = Object.entries(item);
            bot.con.query(`INSERT INTO items (id, desc, category) VALUES ('${itemInfo[0][0]}', '${itemInfo[0][1]}', '${categoryName}')`, (err, rows) => {
                // do nothing
            });
        }
    }
}
 

ИЗМЕНИТЬ: MySQL теперь возвращает синтаксическую ошибку, хотя я не уверен, где в моем запросе ошибка.

В этом и заключается ошибка:

 Error: ER_PARSE_ERROR: 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 'desc, category) VALUES ('STOCK_OF_STONKS', 'Stock Of Stonks', 'oddities')' at line 1
    at Query.Sequence._packetToError (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
    at Query.ErrorPacket (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)
    at Protocol._parsePacket (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    at Parser._parsePacket (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Parser.js:433:10)
    at Parser.write (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Parser.js:43:10)
    at Protocol.write (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Protocol.js:38:16)
    at Socket.<anonymous> (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/Connection.js:88:28)
    at Socket.<anonymous> (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/Connection.js:526:10)
    at Socket.emit (events.js:315:20)
    at addChunk (internal/streams/readable.js:309:12)
    --------------------
    at Protocol._enqueue (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Protocol.js:144:48)
    at Connection.query (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/Connection.js:198:25)
    at Object.hourly (/Volumes/NO NAME/College/Computing/NEA/hypstats/utils/gen.js:32:33)
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  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 'desc, category) VALUES ('STOCK_OF_STONKS', 'Stock Of Stonks', 'oddities')' at line 1",
  sqlState: '42000',
  index: 0,
  sql: "INSERT INTO items (id, desc, category) VALUES ('STOCK_OF_STONKS', 'Stock Of Stonks', 'oddities')"
}
 

Комментарии:

1. Что произойдет, если вы проверите err параметр в обратном вызове?

2. Ведение err журнала, похоже, напечатало загадочную ошибку, которая по какой-то причине скрывалась. В нем говорится, что в моем синтаксисе есть ошибка, хотя я не уверен, где это?

Ответ №1:

используйте его:

 bot.con.query("insert into items set ?", {id: X, desc: Y, category: Z})
 

X , Y и Z-ваши переменные.

Ответ №2:

Попробуйте изменить свою программу, чтобы использовать этот код.

  let itemInfo = Object.entries(item);
 let query = `INSERT INTO items (id, desc, category) VALUES ('${itemInfo[0][0]}', '${itemInfo[0][1]}', '${categoryName}')`;
 bot.con.query(query, (err, rows) => {
       if (err) return console.error ('query error', query, err);
 });
 

Вы увидите свой запрос на ВСТАВКУ и, вероятно, сможете определить свою проблему. Ваша проблема, вероятно, заключается в строке данных, содержащей ' где-то символ.

Чтобы исправить это, измените свой код на что-то вроде этого (не отлажено)

  let itemInfo = Object.entries(item);
 let query = 'INSERT INTO items (id, desc, category) VALUES (?, ?, ?)';
 bot.con.query(query, [itemInfo[0][0], itemInfo[0][1], categoryName],
               (err, rows) => {
                 if (err) return console.error ('query error', query, err);
               });
 

Это так называемый параметризованный запрос. Это позволяет избежать ' проблемы и избежать SQL-инъекции.