2014-01-21 7 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 (" + я, имя пользователя, пароль, J +") ; ';', comma-operator делает его как 'sql = 'INSERT INTO Login (_id, username, password, 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

Я попробую i t out.Now – user3213758

1

Похоже, вы проблемы с VALUES заявление:

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

должен быть

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

Если у вас нет зЬй :: 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]' to binary 'operator +' – user3213758

4
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. В 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 и сформируйте 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) после использования.

Смежные вопросы