синтаксическая ошибка с оператором вставки

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 Login (_id,username,password,manager_id) " \ "VALUES ("+i,userName,password,j+");"; Запятая-оператор делает это как sql = "INSERT INTO Login (_id,username,password,manager_id) " \ "VALUES ("+i; / * плюс другое барахло, которое фактически игнорируется (как вычисляются выражения , но отбрасываются) * /
Теги:
sqlite3

5 ответов

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
    Я попробую это. Теперь
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. В С++ 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 способов
  • 0
    спасибо за вашу помощь и ваши объяснения
1

Я на 80% уверен, что так оно и должно быть... не уверен, потому что его не чистый SQL, а.. yep

sql = "INSERT INTO 'Login' ('_id', 'username', 'password', 'manager_id') "  \
     "VALUES ("+i+", '"+userName+"', '"+password+"', "+j+");"; 
  • 0
    ошибка: недопустимые операнды типов «const char *» и «const char [4]» для двоичного «оператора +»
1

Похож на то, что проблема с оператором 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.

  • 0
    Ошибка SQL: рядом с ")": синтаксическая ошибка
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).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню