sqlite3更新出错了

时间:2015-06-03 22:37:45

标签: database sqlite

这是我第一次在这里提问,有点紧张...... 我昨天遇到了一个错误,我在我的sqlite3_exec()项目中使用了iOS,但它出了问题。 我执行了更新操作,并且回调SQLITE_DONEerrormsg也为空,但我更新的列已更改为0!

例如:

sprintf(statement, "update table set name = '%s' where id = '%s'", "Micheal Jackson", "1")

当操作完成后,我打开了数据库文件,发现名称为0,其中id为1.这很奇怪! 还有其他人遇到过这个问题吗?

1 个答案:

答案 0 :(得分:0)

首先,使用查询参数(sqlite3_bind函数)代替sprintf和其他字符串操作操作将数据传递到SQL查询中。如果name中包含单引号,您的查询将会中断,恶意用户可以使用它来侵入您的数据库。

关于您的问题,请考虑以下示例:

sqlite> SELECT 1 = '1';
0

字符串'1'不等于数字1。您将id包装在单引号中,这使得它成为一个字符串,它不等于id列中的任何数字,因此不会更新任何内容。

执行此查询的正确方法是:

sqlite3_stmt* stmt;
int err = sqlite3_prepare(db, "update table set name = ? where id = ?", 0, NULL, NULL);
if(err != SQLITE_OK)
    abort(); // or some other error handling

sqlite3_bind_text(stmt, 1, "Micheal Jackson", 0, SQLITE_STATIC);
sqlite3_bind_int(stmt, 2, 1);

err = sqlite3_step(stmt);
if(err != SQLITE_DONE)
    abort();