2014-01-21 38 views
0

我正在使用c/C++与sqlite。 我的代码如下所示编译,但输入密码后,我遇到了这个错误。插入语句的语法错误

SQL error: near "NSERT": syntax error 

我无法确定语法错误的确切位置。

代码

#include <stdio.h> 
#include <stdlib.h> 
#include <sqlite3.h> 
#include <string> 
#include <iostream> 


void insertIntoTable(std::string userName,std::string password); 

int main() { 
    std::string userName; 
    std::string password; 
    std::cout << "Enter a user name" << std::endl; 
    std::cin >> userName; 
    std::cout << "Enter a password" << std::endl; 
    std::cin >> password 
    insertIntoTable(userName,password); 
} 

//method to insert into table 
void insertIntoTable(std::string userName,std::string password) { 
    sqlite3 *db; 
    char *zErrMsg = 0; 
    int rc; 
    const char *sql; 
    int i = 1; 
    int j = 1; 

    rc = sqlite3_open("test.db", &db); 
    if(rc) 
    { 
     fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
     exit(0); 
    }else 
    { 
     fprintf(stderr, "Opened database successfully\n"); 
    } 
    //query 
    sql = "INSERT INTO Login (_id,username,password,manager_id) " \ 
     "VALUES ("+i,userName,password,j+");"; 
} 

请帮助。感谢

+1

在该表达式中,'SQL = “INSERT INTO登录(_id,用户名,密码,MANAGER_ID)” \ “VALUES(” + 1,用户名,密码,J +“) ;“;”,逗号运算符使其像“sql =”INSERT INTO登录(_id,用户名,密码,manager_id)“\ ”VALUES(“+ i;'/ *加上其他有效忽略的垃圾表达式被评估但被丢弃)*/ – user2864740

回答

2

所有这些答案都是非常错误的。用于SQL查询执行的字符串插值是进入注入地的快车。没有理由为什么你应该使用它。

正确的方法是使用sqlite3_bind将值与预备语句中的占位符绑定,即代码应该是这样的:

sql = "INSERT INTO Login (_id,username,password,manager_id) " 
     "VALUES (?, ?, ?, ?);"; 
sqlite3_stmt* stmt; 
rc = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, nullptr); 
// handle rc 
// Now bind the parameters. 
sqlite3_bind_int(stmt, 1, i); 
sqlite3_bind_text(stmt, 2, userName.c_str(), userName.size(), SQLITE_TRANSIENT); 
sqlite3_bind_text(stmt, 3, password.c_str(), password.size(), SQLITE_TRANSIENT); 
sqlite3_bind_int(stmt, 4, j); 
// Now execute. 
+0

我会试试我现在 – user3213758

1

貌似你VALUES语句有问题:

VALUES ("+i,userName,password,j+");"; 

应该

"VALUES ("+std::to_string(i)+","+userName+","+password+","+std::to_string(j)+");"; 

如果你没有的std :: to_string(没有C++ 11)你需要一些其他方式将int转换为std :: string,就像stringstream一样。

+0

SQL错误:接近“)”:语法错误 – user3213758

1

我80%肯定这是它应该如何成为...不知道,因为它不是纯粹的SQL,但..是的

sql = "INSERT INTO `Login` (`_id`, `username`, `password`, `manager_id`) " \ 
    "VALUES ("+i+", '"+userName+"', '"+password+"', "+j+");"; 
+0

错误:类型为'const char *'和'const char [4]'的二进制'operator +'为无效操作数' – user3213758

4
sql = "INSERT INTO Login (_id,username,password,manager_id) " \ 
     "VALUES ("+i,userName,password,j+");"; 

这是无稽之谈。您不能通过将非字符串值添加到C样式字符数组或指针来构建字符串;并且逗号运算符不会将逗号附加到字符串,而是在执行其副作用后丢弃先前表达式的值。这意味着整个表达式等价于

sql = "INSERT..." + i; 

这增加的i的值(1)到一个字符串以得到一个指向第二个字符的地址;所以总体结果是NSERT INTO Login (_id,username,password,manager_id) VALUES (

您想使用std::string。在C++ 11,有方便的功能,以数字转换为字符串:

std::string sql = "INSERT INTO Login (_id,username,password,manager_id) " 
        "VALUES (" + std::to_string(i) + ',' 
          + userName + ',' 
          + password + ',' 
          + std::to_string(j) + ");"; 

历史上,你需要一个字符串流

std::stringstream s; 
s << "INSERT INTO Login (_id,username,password,manager_id) VALUES (" 
    << i << ',' << userName << ',' << password << ',' << j << ");"; 
std::string sql = s.str(); 
+0

+1 C++ 03和C++ 11种方式 – legends2k

+0

谢谢你的帮助和你的解释 – user3213758

1

您不能建立这样的字符串..

您有两种选择:使用std::string并使用+ operator形成string。或者,如果你想与char*追求然后用下面的代码

char *sql = malloc (NumberOfCharYouNeed); //allocate sufficient chars for your purpose. 

sprintf (sql, "INSERT INTO Login (_id,username,password,manager_id) VALUES (\"+%d%s%s%d+\")",i,userName,password,j); 

注意:您使用后请确认您免费(SQL)。