我正在使用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+");";
}
请帮忙。感谢
答案 0 :(得分: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();
答案 1 :(得分: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.
答案 2 :(得分: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一样。
答案 3 :(得分:1)
我80%肯定这是它应该如何...不确定因为它不是纯粹的SQL而是......是的
sql = "INSERT INTO `Login` (`_id`, `username`, `password`, `manager_id`) " \
"VALUES ("+i+", '"+userName+"', '"+password+"', "+j+");";
答案 4 :(得分:1)
你不能像这样构建字符串..
您有两个选项..使用std::string
并使用string
形成+ operator
。或者,如果您希望使用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)。