Почему он выдает синтаксическую ошибку в MySQL

0

Это мой html файл

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Node delivered HTML </title>

</head>
<body>
   <div>
    <h1>Send JSON to Node</h1>
        <button onClick="sendJSON()">Send</button>
        <p id ="result"></p>

   </div>
<script>
 var myData = [
    {
        "author": "Bill",
        "title": "Chris",
        "genre": "Chrisdss",
        "price": 20
    },
    {
        "author": "Bill",
        "title": "Chrisss",
        "genre": "Chrdsdss",
        "price": 24
    }
    ]

function sendJSON(){

console.log(myData);
var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance
xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
       document.getElementById("result").innerHTML =
       this.responseText;
    }
 };
xmlhttp.open("POST", "http://localhost:3000");
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.send(JSON.stringify(myData));

}

</script>
</body>
</html>

И это мой файл server.js

const express = require('express')
const bodyParser = require('body-parser')
const mysql = require('mysql');
const path = require('path')
const app = express()

var TABLE = 'table';
var books =[]
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "0december"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");

});



app.get('/', function(req, res) {
  res.sendFile(path.join(__dirname+ '/frontend.html'));
});

app.post('/', function(req, res) {

var jsondata = req.body;
var values = [];
console.log(req.body);
for(var i=0; i< jsondata.length; i++){
  values.push([jsondata[i].author,jsondata[i].title,,jsondata[i].genre,,jsondata[i].price]);
}

//Bulk insert using nested array [ [a,b],[c,d] ] will be flattened to (a,b),(c,d)
con.query('INSERT INTO table (author,title,genre,price) VALUES ?', [values], function(err,result) {
  if(err) {
     res.send('Error');
     console.log(err);
  }
 else {
     res.send('Success');
  }
});
});


app.listen(3000, () => console.log('Books API listening on port 3000'))

Мой сервер работает отлично, но я пробовал много вещей, и я получаю синтаксическую ошибку SQL. Я также попробовал учебник W3C, но у меня все еще была такая же ошибка. Может быть, потому что мой db изменен неправильно?

Моя модель называется table и содержит id, author, title, genre, price id - auto-increment, все - строка, кроме цены, которая является типом float. Почему я получаю синтаксическую ошибку, хотя мой синтаксис точно такой же, как и в учебниках?

EDIT: Ошибка sqlMessage: "У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с таблицей (автор, название, жанр, цена). VALUES ("Билл", "Крис", "NULL", "Chrisdss"), NULL\'в строке 1', sqlState: '42000', index: 0, sql: 'INSERT INTO table (автор, название, жанр, цена) VALUES (\' Bill\', \' Chris\', NULL, "Chrisdss", NULL, 20), ("Билл", "Chrisss", NULL, "Chrdsdss", NULL, 24.1) '}

  • 1
    Показать сообщение об ошибке
  • 0
    table - плохой выбор имени для таблицы, потому что это зарезервированное слово. Вы должны попытаться изменить имя таблицы или обернуть его в обратные пометки в вашем запросе, что-то вроде этого. INSERT INTO `table` (aut...
Показать ещё 1 комментарий
Теги:
express
syntax

1 ответ

1

Вероятное решение

Для запроса con.query('INSERT...?', [values],... для работы значения должны содержать массивы длиной 4, содержащие значения автора, названия, жанра, цены.

Однако значения содержат массивы длиной 6.

Вы должны удалить нули из массивов внутри значений, заменив

values.push([jsondata[i].author,jsondata[i].title,,jsondata[i].genre,,jsondata[i].price]);

с

values.push([jsondata[i].author,jsondata[i].title,jsondata[i].genre,jsondata[i].price]);

Теперь значения содержат массивы длиной 4, а объемная вставка должна работать.

Альтернативно решение

Если нули предназначены, вы должны указать, где они должны быть вставлены.

+ Изменить

'INSERT INTO table (author,title,genre,price) VALUES ?'

в

'INSERT INTO table (author,title,null_field_1,genre,null_field_2,price) VALUES ?'

где null_field_i - это поле, которое вы хотите заполнить нулем.

  • 0
    Итак, во-вторых, удаляет значения NULL? Теперь я получаю этот код: «ER_WRONG_VALUE_COUNT_ON_ROW», errno: 1136, sqlMessage: «Число столбцов не соответствует значению в строке 1», sqlState: «21S01», индекс: 0, sql: «INSERT INTO books (автор , название, жанр, цена) ЗНАЧЕНИЯ ((\ 'Bill \', \ 'Chris \', \ 'Chrisdss \', 20), (\ 'Bill \', \ 'Chrisss \', \ 'Chrdsdss \', 24.1)) '}
  • 1
    Дополнительная запятая добавляет <пустой слот> в массив, который интерпретируется как NULL. Что касается ошибки, то ваш запрос кажется правильным, но он имеет дополнительный набор фигурных скобок вокруг ваших значений. Попробуйте передать значения или [[values]] вместо [values].

Ещё вопросы

Сообщество Overcoder
Наверх
Меню