【问题标题】:SQL Parse Error when using node-mysql使用 node-mysql 时出现 SQL 解析错误
【发布时间】:2013-12-29 15:58:43
【问题描述】:

当我尝试使用 node-mysql 在 MYSQL 数据库上调用查询时,我遇到了解析错误。我很确定查询有效。毫无疑问,它通过 phpmyadmin 运行。

Message.save = function(message, callback){
    db.query("INSERT INTO e_message (chatid, message, userid) VALUES(" + message.chatid + ", '" + message.message +"', " + message.userid + "); SELECT * FROM e_message WHERE chatid = " + message.chatid + " ORDER BY timestamp DESC LIMIT 0, 1;", 
    function(err, rows, fields){
        console.log(err);
        callback(err, new Message(rows[0]));
    });
}

我收到以下错误:

{ [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 'SELECT * FROM e_message WHERE chatid = 1 ORDER BY timestamp DESC LIMIT 0, 1' at line 1]
  code: 'ER_PARSE_ERROR',
  errno: 1064,
  sqlState: '42000',
  index: 0 }

通过console.log()查询看起来像这样:

INSERT INTO e_message (chatid, message, userid) VALUES(1, 'test123', 1);
SELECT * FROM e_message WHERE chatid = 1 ORDER BY timestamp DESC LIMIT 0, 1;

我不知道这有什么问题......

编辑: 如果我把它分成两个查询,我会得到我想要的结果:

Message.save = function(message, callback){
    db.query("INSERT INTO e_message (chatid, message, userid) VALUES(" + message.chatid + ", '" + message.message +"', " + message.userid + ");", function(err, rows, fields){
        db.query("SELECT * FROM e_message WHERE userid = " + message.userid + " AND chatid = " + message.chatid + " ORDER BY timestamp DESC LIMIT 0, 1;", function(err, rows, filds){
            callback(err, new Message(rows[0]));
        });
    });
}

谢谢!

【问题讨论】:

  • 在一个查询中执行 2 条 sql 语句会不会有问题?尝试先将它们分成两个查询,看看是否有帮助。
  • 将您的查询分成 2 个查询。有 2 个单独的查询。
  • 另外,在查询方法中尝试使用数组参数,这样更简洁,而且还可以为你进行字符串转义。
  • 如果我将其拆分为两个查询并且两个用户同时保存一条消息,则结果可能不正确。 (因为节点是异步的......)编辑:好的,我可以过滤用户 ID 来解决这个问题。

标签: javascript mysql node.js node-mysql


【解决方案1】:

node-mysql 默认情况下不允许您在单个查询中发出多个 SQL 语句。

为此,您需要在创建连接时设置multipleStatements 连接选项。

请注意,允许这样做可能/将使您面临 SQL 注入的风险,尤其是在将语句构建为字符串时。例如,如果您的message.userid 被设置为字符串1);drop database production;SELECT (,那么您就有麻烦了。

在这种情况下,您真正​​想要的可能是执行插入操作,然后使用第二个 SELECT LAST_INSERT_ID() 获取插入最新记录的 ID。它将返回会话的最新插入的自增键,即不会受到其他连接/会话的其他插入的影响。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2010-09-10
    • 2018-12-31
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多