【问题标题】:Node sql syntax error节点sql语法错误
【发布时间】:2017-11-22 19:32:31
【问题描述】:

我对使用 node 和 express 有点陌生,我正在尝试在我的 node 应用程序中简单地插入 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);
        });
    }

我尝试了单引号、双引号、表名周围的反引号,但没有任何效果。没有看到任何类似的问题,所以我想我会碰碰运气。

谢谢!

【问题讨论】:

  • year 是 MySQL 的保留字。您需要在使用它的任何地方使用反引号转义该列。
  • 啊不知道。更改我的列名可能会更容易吗?
  • 从长远来看肯定会容易得多。 dYear 是我的首选。

标签: mysql sql node.js syntax


【解决方案1】:

我认为您需要两件事来修复此代码。

1) Aaron Dietz 是正确的。您需要在年份列上使用反引号

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);
    });
}

让我知道这是否适合您。

【讨论】:

  • 你是对的......我只是假设双引号会解释我的语法。但现在我有一个不同的问题......我的一些值(如标题和代码)中有空格,并且抛出错误。我试过这个(“courseData[i].title”),但它仍然只是打印字符串文字。
  • 你在 MySQL 中也需要反引号,对吗? (我更像是一个 SQL Server 人)所以您需要在字符串部分中合并反引号,而不更改您从 JavaScript 对象中获取的变量。查看更新的答案。
  • 警告此代码易受 SQL 注入攻击。不要在 SQL 查询中连接值,使用参数化查询。
  • 你是对的。过于关注最初的问题。现在更新答案。
  • @jcaron 你是对的,但这基本上是扔掉的代码,我只需要插入数据,我不需要再这样做了。
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 2015-01-31
  • 2015-03-22
  • 2015-04-04
相关资源
最近更新 更多