Синтаксическая ошибка в nodejs с mysql рядом с '?'

я пытаюсь получить доступ к базе данных mysql и nodejs. Во время обучения я столкнулся с синтаксической ошибкой в ​​​​скрипте, и я понятия не имею, как исправить синтаксис.

var express = require('express');
var router = express.Router();
var db=require('../database');
router.get('/form', function(req, res, next) { 
res.render('users'); 
});
router.post('/create', function(req, res, next) {

// store all the user input data
const userDetails=req.body;

// insert user data into users table
var sql = 'INSERT INTO users SET ?';
db.query(sql, userDetails,function (err, data) { 
  if (err) throw err;
     console.info("User dat is inserted successfully "); 
});
res.redirect('/users/form');  // redirect to user form page after inserting the data
}); 
module.exports = router;

вот ошибка:

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 '?' at line 1",
sqlState: '42000',
index: 0,
sql: 'INSERT INTO users SET ?'

для справки: я узнал этот код от связь

Спасибо за ответ @Amadan, так что в моем случае у меня есть 5 столбцов в таблице пользователей. Как мне написать синтаксис? столбец состоит из идентификатора, полного имени, адреса электронной почты, города и страны.

lvsilver 05.05.2022 05:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы не можете передавать данные типа {field1: 1, field2: 2, field3: 3}. передайте это «ВСТАВИТЬ В пользователей SET field1 = ?, field2 = ?»;

const userDetails=[
                    1, // this value is field1
                    2, // this value is field2
                  ];

// insert user data into users table
var sql = 'INSERT INTO users SET field1 = ?, field2 = ?';
db.query(sql, userDetails,function (err, data) { 
  if (err) throw err;
     console.info("User dat is inserted successfully "); 
});
Ответ принят как подходящий

Я не уверен, какова конкретная реализация функции db.query, но вы, вероятно, хотите что-то вроде этого (я получил схему db из вашего другого комментария):

let sql = 'INSERT INTO users SET id=?, fullName=?, emailAddress=?, city=?, country=?';
db.query(sql, userDetails, function (err, data) { 
  if (err) {
     throw err;
  }
  console.info("User dat is inserted successfully "); 
});

Если это не сработает, попробуйте вместо этого установить переменную SQL:

let sql = 'INSERT INTO users (id, fullName, emailAddress, city, country) VALUES (?, ?, ?, ?, ?)';

Я предполагаю, что переменная userDetails ссылается на объект следующего типа: { id, fullName, emailAddress, city, country }.

SQL требует вопросительного знака для каждого столбца при каждой вставке при использовании подготовленных операторов. Функция db.query может пытаться вставить объект непосредственно в виде строки, что может вызвать проблему, поскольку ваша схема имеет 5 столбцов. Синтаксис JSON объекта stringified также может вызвать жалобу анализатора SQL.

Если это не сработает, я хотел бы посмотреть на вашу схему. Ваша функция, кажется, отправляет объект req.body напрямую в базу данных, что означает, что пользователь отправляет идентификатор непосредственно в базу данных. Это довольно редко, обычно идентификатор строки генерируется сервером или столбцом автоинкремента в базе данных.

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

Другие вопросы по теме