我有一个运行正常的日志记录命令,唯一的问题是我无法完成命令的off
部分。如果公会匹配,我需要它删除两个记录(guildid, channel)
。
这就是我尝试过的。
if (args[0] === 'off') {
message.channel.send('Logging turned off!');
const del = db.prepare('DELETE FROM logging WHERE guildid = ?;');
del.run({
guildid: `${message.guild.id}`
});
return;
看照片,当args off
运行时,如果公会内容与以下内容匹配,我需要它删除公会内容(495602 ...)和频道内容(<#5290 ...)行会所在的公会。
答案 0 :(得分:0)
对于将来希望如何做的任何人,这就是答案。 编辑:直到2天大声笑才能标记为答案
if (args[0] === 'off') {
message.channel.send('Logging turned off!');
db.prepare(`DELETE FROM logging WHERE guildid = '${message.guild.id}'`).run();
return;
答案 1 :(得分:0)
您当前的答案是使用准备好的语句的不正确方法。如果使用姿势的方式,则可以进行SQL注入,因为您没有将要在语句中使用的值解释为值,而是将其用作整体语句的一部分,然后运行不带参数的语句。这意味着我可能会提供一个可能无法完全按照您的预期做的值。
例如,以下内容什么都不做,
const $rowid = "3 OR rowid = 4";
const deleteStatement = db.prepare("DELETE FROM lorem WHERE rowid = $rowid");
deleteStatement.run({$rowid});
deleteStatement.finalize();
但这会删除行号为3或4的元素:
const $rowid = "3 OR rowid = 4";
const deleteStatement = db.prepare(`DELETE FROM lorem WHERE rowid = ${$rowid}`);
deleteStatement.run();
deleteStatement.finalize();
相反,请看一下sqlite3 documentation here。
您实际上需要对准备好的语句进行参数化,如下所示:
const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database(":memory:");
db.serialize(function() {
// Make the table
db.run("CREATE TABLE lorem (info TEXT)");
// Create some dummy data
const insertStatement = db.prepare("INSERT INTO lorem VALUES (?)");
for (let i = 0; i < 5; i++) {
insertStatement.run(`My Data ${i}`);
}
insertStatement.finalize();
// Delete some data
const deleteStatement = db.prepare("DELETE FROM lorem WHERE rowid = $rowid");
deleteStatement.run({
$rowid: 3
});
deleteStatement.finalize();
// Print elements
db.each("SELECT rowid AS id, info FROM lorem", (err, {id, info}) => console.log(`${id}: ${info}`));
});
db.close();