所以我正在使用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);
它有效,我能够插入这两个值。
为什么不是第一个工作?请有人帮忙
谢谢
答案 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主要是一种自由格式语言,在第一个代码块的行末端不需要那些\
字符。