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
相关产品推荐
相关产品推荐

