这是我第一次在这里提问,有点紧张......
我昨天遇到了一个错误,我在我的sqlite3_exec()
项目中使用了iOS
,但它出了问题。
我执行了更新操作,并且回调SQLITE_DONE
,errormsg
也为空,但我更新的列已更改为0!
例如:
sprintf(statement, "update table set name = '%s' where id = '%s'", "Micheal Jackson", "1")
当操作完成后,我打开了数据库文件,发现名称为0,其中id为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();