Удаление записей в базе данных - PullRequest
0 голосов
/ 08 января 2019

У меня есть команда регистрации, которая работает отлично, единственная проблема - я не могу закончить раздел off команды. Мне нужно, чтобы удалить обе записи (guildid, channel), если гильдии совпадают. logging Это то, что я пробовал.

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 ...), если содержимое гильдии совпадает с гильдией команда была введена. </p>

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Ваш текущий ответ - неправильный способ использовать подготовленное утверждение. Если вы используете способ, которым вы себя представляете, вы открываете себя для внедрения 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();
0 голосов
/ 08 января 2019

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

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