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