You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord机器人经济系统中MySQL UPDATE语句执行后数据库无变更问题求助

解决你的Discord机器人余额更新无效问题

嘿,我一眼就揪出问题所在啦!你的代码里藏着一个低级但致命的错误,咱们一步步来搞定它:

1. 核心问题:UPDATE语句的WHERE条件写错了

看你写的sql2变量:

var sql2 = "UPDATE charaktery SET penize = '" + balnove + "' WHERE cislouctu = '" + balnove + "'";

这里的WHERE条件用了新余额balnove,但你本来应该匹配的是用户输入的账户编号clovek啊!这就导致数据库根本找不到符合条件的行,自然不会有任何数据变更。

把WHERE里的balnove改成clovek就好了:

var sql2 = "UPDATE charaktery SET penize = '" + balnove + "' WHERE cislouctu = '" + clovek + "'";

2. 必须补上的安全漏洞:避免SQL注入

你现在直接把用户输入拼接到SQL语句里,这是非常危险的SQL注入漏洞!别嫌麻烦,赶紧改用参数化查询,mysql模块原生支持这种写法,既安全又能避免引号转义的问题:

修复后的SELECT查询

db.query("SELECT penize FROM charaktery WHERE cislouctu = ?", [clovek], function(err, result) {
  // 原来的逻辑保持不变
});

修复后的UPDATE查询

// 用?作为参数占位符
var sql2 = "UPDATE charaktery SET penize = ? WHERE cislouctu = ?";
// 把参数放在数组里传入,顺序对应占位符
db.query(sql2, [balnove, clovek], function(err) {
  if (err) {
    console.error("更新余额时出错:", err);
    // 给用户返回错误提示,不要让用户摸不着头脑
    return interaction.reply({ content: "更新余额时发生错误,请联系管理员", ephemeral: true });
  }
  // 确认数据库更新成功后,再回复用户
  interaction.reply({ embeds: [newEmbed], ephemeral: true });
});

3. 额外优化建议:完善异步流程

你原来的代码里,interaction.reply是在UPDATE查询外面执行的,这可能会出现“已经回复用户,但数据库还没完成更新”的情况。把回复放在UPDATE的回调里,能保证用户看到回复时,数据已经成功更新了。

内容的提问来源于stack exchange,提问作者votavl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 12:42:42