Удаление записей в базе данных

У меня есть команда регистрации, которая работает отлично, единственная проблема, я не могу закончить 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;

Глядя на фото, когда арги off мне нужно удалить содержимое гильдии (495602...) и содержимое канала (<# 5290...), если содержимое гильдии совпадает с гильдией, в которой была выполнена команда.

3 ответа

Ваш текущий ответ - неправильный способ использовать подготовленное утверждение. Если вы используете способ, которым вы себя представляете, вы открываете себя для внедрения SQL-кода, потому что вы не интерпретируете значение, которое вы хотите использовать в операторе, как значение, вы используете его как часть общего оператора, а затем запускаете оператор без параметров, Это означает, что я потенциально мог бы предоставить значение, которое могло бы не делать то, что, как вы думаете, будет.

Например, следующее ничего не сделает,

const $rowid = "3 OR rowid = 4";
const deleteStatement = db.prepare("DELETE FROM lorem WHERE rowid = $rowid");
deleteStatement.run({$rowid});
deleteStatement.finalize();

Но это удалит элементы с rowid 3 или 4:

const $rowid = "3 OR rowid = 4";
const deleteStatement = db.prepare(`DELETE FROM lorem WHERE rowid = ${$rowid}`);
deleteStatement.run();
deleteStatement.finalize();

Вместо этого взгляните на документацию sqlite3 здесь.

Вы должны на самом деле параматизировать ваше подготовленное утверждение, как показано ниже:

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

Для любого в будущем, смотрящего, как это сделать, это был ответ. РЕДАКТИРОВАТЬ: не могу пометить в качестве ответа до 2 дней лол

if (args[0] === 'off') {
message.channel.send('Logging turned off!');
db.prepare(`DELETE FROM logging WHERE guildid = '${message.guild.id}'`).run();
return;

Поздно к better-sqlite3партия:

      const del = db.prepare('DELETE FROM logging WHERE guildid = ?');
del.run(message.guild.id)
Другие вопросы по тегам