Ошибка синтаксиса SQL узла

Я немного новичок в использовании узла и экспресса, и я пытаюсь сделать простую вставку в базу данных mysql в своем приложении узла, но я продолжаю получать ER_PARSE_ERROR [i].year, courseData[i].term....

Я пытаюсь просто просмотреть массив объектов курса (courseData), вставив каждое значение в имена своих столбцов. Вот где я нахожусь

for (var i = 0; i < courseData.length; i++){
        var i = 1;
        let sql = "INSERT INTO Course (year, term, code, title, " 
                    + "capacity, enrollment, credits, "
                    + "mon, tue, wed, thu, fri, sat, " 
                    + "instructorLast, instructorFirst, " 
                    + "startDate, endDate, building, room) "
                   + "VALUES (courseData[i].year, courseData[i].term, courseData[i].code, "
                    + "courseData[i].title, courseData[i].capacity, courseData[i].enrollment, "
                    + "courseData[i].credits, courseData[i].mon, courseData[i].tue, "
                    + "courseData[i].wed, courseData[i].thu, courseData[i].fri "
                    + "courseData[i].sat, courseData[i].instructorLast, courseData[i].instructorFirst, "
                    + "courseData[i].startDate, courseData[i].endDate, courseData[i].building, courseData[i].room); ";

        db.query(sql, function(err, result, fields){
            console.log(err);
        });
    }

Я пробовал одинарные кавычки, двойные кавычки, обратные галочки вокруг имени моей таблицы, но ничего не сработало. Не видел похожих вопросов, поэтому решил попытать счастья.

Благодарю вас!


person user7392939    schedule 22.11.2017    source источник
comment
year — это зарезервированное слово MySQL. Вам нужно будет экранировать этот столбец обратными кавычками везде, где вы его используете.   -  person Aaron Dietz    schedule 22.11.2017
comment
Ах не знал этого. Возможно, было бы проще изменить имя моего столбца, нет?   -  person user7392939    schedule 22.11.2017
comment
В долгосрочной перспективе точно будет намного легче. dYear мой выбор.   -  person Aaron Dietz    schedule 22.11.2017


Ответы (1)


Я думаю, вам нужны две вещи, чтобы исправить этот код.

1) Аарон Дитц прав. Вам нужны обратные кавычки в столбце года

2) В настоящее время вы вставляете строковое значение вашего имени объекта вместо вашего объекта. Например, вы вставляете «courseData[i].title» вместо актуального содержимого этой части объекта. Кроме того, конкатенация кода sql подвержена атакам с внедрением sql. Используйте методы экранирования, как описано здесь https://github.com/mysqljs/mysql.

for (var i = 0; i < courseData.length; i++){
    var i = 1;
    let sql = `INSERT INTO Course (dyear, term, code, title,
                capacity, enrollment, credits,
                mon, tue, wed, thu, fri, sat,
               instructorLast, instructorFirst,
                startDate, endDate, building, room)
               VALUES (?, ? , ?, ?, ?, ?, ?, ?, ?,
               ?,?,?,?,?,?,?,?,?,?)`;
    let inserts = [courseData[i].year, courseData[i].term, 
              courseData[i].code, courseData[i].title, 
              courseData[i].capacity, courseData[i].enrollment, 
              courseData[i].credits, courseData[i].mon, 
              courseData[i].tue, courseData[i].wed, 
              courseData[i].thu, courseData[i].fri, 
              courseData[i].sat, courseData[i].instructorLast, 
              courseData[i].instructorFirst, courseData[i].startDate, 
              courseData[i].endDate, courseData[i].building, 
              courseData[i].room];
    sql = mysql.format(sql, inserts);

    db.query(sql, function(err, result, fields){
        console.log(err);
    });
}

Дайте мне знать, если это работает для вас.

person Imre_G    schedule 22.11.2017
comment
Вы правы... Я просто предположил, что двойные кавычки интерпретируют мой синтаксис. Но теперь у меня другая проблема... некоторые из моих значений, таких как заголовок и код, содержат пробелы и ошибки. Я пробовал это (courseData[i].title), но он все еще просто печатает строковый литерал. - person user7392939; 22.11.2017
comment
Вам нужны обратные кавычки для них и в MySQL, верно? (Я больше разбираюсь в SQL Server). Поэтому вам нужно включить обратные кавычки в строковую часть, не изменяя переменные, которые вы берете из объекта JavaScript. Смотрите обновленный ответ. - person Imre_G; 23.11.2017
comment
Предупреждение, этот код уязвим для атак путем внедрения кода SQL. НЕ объединяйте значения в запросе SQL, используйте параметризованные запросы. - person jcaron; 23.11.2017
comment
Ты прав. Был слишком сосредоточен на исходной проблеме. Обновление ответа сейчас. - person Imre_G; 23.11.2017
comment
@jcaron, вы правы, но это в основном код для выброса, мне нужно только вставить данные, и мне не нужно будет делать это снова. - person user7392939; 23.11.2017
comment
@MohammadAl-Abbasi От вредных привычек избавиться трудно. Это, безусловно, самая распространенная уязвимость, наиболее часто используемый вектор атаки, несмотря на то, что ее легче всего исправить. Одноразовый код ДЕЙСТВИТЕЛЬНО используется повторно, а ответы на SO тем более. Спасибо Imre_G за исправление. - person jcaron; 23.11.2017
comment
@jcaron действительно, я собираюсь сосредоточиться на предотвращении SQL-инъекций в разных частях моего приложения. Спасибо за ответ! - person user7392939; 24.11.2017