Я использую 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+");";
}
Пожалуйста помоги. благодаря
Все эти ответы ужасно ошибочны. Строковая интерполяция для выполнения 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.
sql = "INSERT INTO Login (_id,username,password,manager_id) " \
"VALUES ("+i,userName,password,j+");";
Это вздор. Вы не можете создавать строки, добавляя нестрочные значения к массиву символов или указателю; и оператор запятой не добавляет запятую к строке, но вместо этого отменяет значение предыдущего выражения после выполнения своих побочных эффектов. Это означает, что все выражение эквивалентно
sql = "INSERT..." + i;
который добавляет значение i
(1) к адресу строкового литерала, чтобы получить указатель на второй символ; поэтому общий результат - NSERT INTO Login (_id,username,password,manager_id) VALUES (
Вы хотите использовать std::string
. В С++ 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();
Я на 80% уверен, что так оно и должно быть... не уверен, потому что его не чистый SQL, а.. yep
sql = "INSERT INTO 'Login' ('_id', 'username', 'password', 'manager_id') " \
"VALUES ("+i+", '"+userName+"', '"+password+"', "+j+");";
Похож на то, что проблема с оператором VALUES:
VALUES ("+i,userName,password,j+");";
должно быть
"VALUES ("+std::to_string(i)+","+userName+","+password+","+std::to_string(j)+");";
Если у вас нет std :: to_string (нет С++ 11), вам нужен другой способ конвертировать int в std :: string, например stringstream.
Вы не можете создавать строки вроде этого..
У вас есть два варианта. Используйте 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).
sql = "INSERT INTO Login (_id,username,password,manager_id) " \ "VALUES ("+i,userName,password,j+");";
Запятая-оператор делает это какsql = "INSERT INTO Login (_id,username,password,manager_id) " \ "VALUES ("+i;
/ * плюс другое барахло, которое фактически игнорируется (как вычисляются выражения , но отбрасываются) * /