C语言 - 将字符串参数插入sqlite数据库%s不起作用

时间:2015-03-23 02:03:38

标签: c database sqlite

所以我正在使用sqlite,我创建了这个数据库:

sql = "CREATE TABLE COMPANY("  \
     "NAME TEXT PRIMARY KEY    NOT NULL," \
     "LAST              TEXT," \
     "PIN               INT," \
     "DL                INT,"\
     "SSN               INT,"\
     "EMAIL             TEXT,"\
     "BALANCE           REAL );";

我正在尝试在NAME中插入一个值,但它不断给出错误“no such column:John

这是我尝试插入它的方式:(假设所有内容都已声明)

strcpy(text, "John");
sprintf (sql,"INSERT INTO ATM (NAME,PIN) VALUES (%s',%d);",text,number);

当我使用这行代码时:

sprintf (sql,"INSERT INTO ATM (NAME,PIN) VALUES ('john',%d);",number);

它有效,我能够插入这两个值。

为什么不是第一个工作?请有人帮忙

谢谢

3 个答案:

答案 0 :(得分:3)

我希望您使用prepared statement,我会用准备好的声明复制您的代码。

sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "INSERT INTO ATM (NAME,PIN) VALUES (?,?);", 41, &stmt, NULL);
if(stmt != NULL) {
    sqlite3_bind_text(stmt, 1, "John", SQLITE_TRANSIENT);
    sqlite3_bind_int(stmt, 2, number);
    sqlite3_step(stmt);
    sqlite3_finalize(stmt);
}

使用sprintf创建语句不安全容易出错,您应该了解SQL Injection

答案 1 :(得分:1)

你忘了放一个'在%s之前。这将是正确的句子

sprintf (sql,"INSERT INTO ATM (NAME,PIN) VALUES ('%s',%d);",text,number);

希望这有帮助

答案 2 :(得分:0)

您错过了第一个代码段中的开头'。这意味着,它会给你一些类似的东西:

INSERT INTO ATM (NAME,PIN) VALUES (John',42);

这可能就是为什么它将不带引号的John视为列名而不是字符串。

语句应该

sprintf (sql,"INSERT INTO ATM (NAME,PIN) VALUES ('%s',%d);",text,number);

另外两件事。除非你某些关于变量的来源,否则盲目地将它们注入SQL语句是一个坏主意,并且会让你接受SQL注入攻击。

其次,C主要是一种自由格式语言,在第一个代码块的行末端不需要那些\字符。