Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言-将字符串参数插入sqlite数据库%s不';行不通_C_Database_Sqlite - Fatal编程技术网

C语言-将字符串参数插入sqlite数据库%s不';行不通

C语言-将字符串参数插入sqlite数据库%s不';行不通,c,database,sqlite,C,Database,Sqlite,因此,我使用sqlite创建了以下数据库: sql = "CREATE TABLE COMPANY(" \ "NAME TEXT PRIMARY KEY NOT NULL," \ "LAST TEXT," \ "PIN INT," \ "DL INT,"\ "SSN INT,"\ "EMAIL

因此,我使用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-this column:John”

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

当我使用这行代码时:

sprintf (sql,"INSERT INTO ATM (NAME,PIN) VALUES ('john',%d);",number);
它起作用了,我能够插入这两个值

为什么第一个不起作用?请有人帮忙


谢谢你

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

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

希望这对您有所帮助

您在第一段代码中缺少开头的
。这意味着,它将为您提供如下信息:

INSERT INTO ATM (NAME,PIN) VALUES (John',42);
这可能就是为什么它将不带引号的
John
视为列名而不是字符串

声明应为:


另外两件事。除非您确定变量的来源,否则盲目地将它们注入SQL语句是一个坏主意,并且会让您面临SQL注入攻击


第二,C语言基本上是一种自由格式语言,您不需要在第一个代码块中的行尾使用那些
\
字符。

正如我希望您使用的那样,我将用准备好的语句复制您的代码

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);
}

使用<代码> SaveTf创建您的语句为<强>不安全> /强>强>易出错,您应该了解

您应该真正考虑使用SaveTFF创建查询字符串不安全和容易出错。
sprintf (sql,"INSERT INTO ATM (NAME,PIN) VALUES ('%s',%d);",text,number);
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);
}