2016-04-23 6 views
1

Ich arbeite an einem Projekt, wo der Benutzer einen Datensatz in eine SQLite-Datenbank einfügen kann. Die Abfrage wird kommen automatisch in dem folgende Verfahren erzeugt:C++ und SQLite - Wie führt man eine Abfrage aus, die durch Benutzereingaben gebildet wird?

string ID = ""; 
string title = ""; 
string password = ""; 

cout << "Insert ID:\n"; 
cin >> ID; 
cout << "Insert title of password:\n"; 
cin >> title; 
cout << "Insert password:\n"; 
cin >> password; 

string sql = "INSERT INTO test (ID,title,password) VALUES(" + ID + "," + title + "," + password + ");"; 

Wenn ich versuche, das Programm i die Fehler zu kompilieren:

classes.h:74:76: error: invalid operands of types ‘const char*’ and ‘const char [2]’ to binary ‘operator+’ 
    string sql = "INSERT INTO passwords (ID,title,password) VALUES (" + id + "," + title + "," + password 
                      ^
classes.h:78:42: error: invalid operands of types ‘int’ and ‘sqlite3_stmt*’ to binary ‘operator&’ 
    sqlite3_prepare(db, sql.c_str(), -1 &st, NULL); 

scheinen, dass er nicht mehr Charakter annehmen kann. Kann mir jemand zeigen, wie ich diesen Fehler beheben kann?

P.S. Ich bin neu in C++

Jede Hilfe wird geschätzt. Vielen Dank.

EDIT:

FULL CODE

sqlite3 *db; 
sqlite3_stmt * st; 
int id = 0; 
string title = ""; 
string password = ""; 

cout << "Insert ID:\n"; 
     cin >> id; 
     cout << "Insert title of password:\n"; 
     cin >> title; 
     cout << "Insert password:\n"; 
     cin >> password; 

     string sql = "INSERT INTO passwords (ID,title,password) VALUES (" + id + ',' + title + ',' + password + ");"; 

     if(sqlite3_open("pw.db", &db) == SQLITE_OK) 
     { 
      sqlite3_prepare(db, sql.c_str(), -1 &st, NULL); 
      sqlite3_step(st); 
     } 
     else 
     { 
      cout << "Failed to connect\n"; 
     } 
sqlite3_finalize(st); 
sqlite3_close(db); 
+1

Verwenden Sie nie rohe Benutzereingaben, um eine SQL-Abfrage zu bilden, es sei denn, Sie sollen zeigen, warum dies eine schlechte Idee ist. Es ist mir egal, ob es ein Spielzeugprojekt ist. – Yakk

+0

Ja, es ist ein Projekt für den persönlichen Gebrauch. – CMz

+1

'std :: to_string (id)' (unter der Annahme, dass der letzte Fehler in diesem Beitrag das * tatsächliche * Problem ist, wobei 'id' tatsächlich als 'int' deklariert ist). – WhozCraig

Antwort

3

sollten Sie vermeiden direkt von Benutzereingaben in SQL-Befehle wie das Einfügen, könnte ein Benutzer böswilligen Text eingeben, der die resultierende SQL-Anweisung absichtlich verändert.

Verwenden Sie stattdessen die Parameterbindung, damit Sie die String-Verkettung, die Sie versuchen, zu vermeiden. Ihr Code:

string sql = "INSERT INTO passwords (ID,title,password) VALUES (" + id + ',' + title + ',' + password + ");"; 

    if(sqlite3_open("pw.db", &db) == SQLITE_OK) 
    { 
     sqlite3_prepare(db, sql.c_str(), -1 &st, NULL); 
     sqlite3_step(st); 
    } 

wird

string sql = "INSERT INTO passwords (ID,title,password) VALUES (?,?,?)"; 

    if(sqlite3_open("pw.db", &db) == SQLITE_OK) 
    { 
     sqlite3_prepare(db, sql.c_str(), -1 &st, NULL); 
     sqlite3_bind_int(st, 1, ID); 
     sqlite3_bind_text(st, 2, title.c_str(), title.length(), SQLITE_TRANSIENT); 
     sqlite3_bind_text(st, 3, password.c_str(), password.length(), SQLITE_TRANSIENT); 
     sqlite3_step(st); 
    } 

die 1, 2 und 3 sind 1-basierte Parameterindizes. Siehe https://www.sqlite.org/c3ref/bind_blob.html

-1

Ihre Fehlermeldung zeigt, dass die ID als int in der Datenbank deklariert wird, aber es wird eine Zeichenfolge von C++ Code. Ändern Sie diese Zeile: string ID = ""; dazu: int ID;

+0

Die ID wird als Integer deklariert ... trotzdem habe ich den vollständigen Code hinzugefügt – CMz

+0

Überprüfen Sie auch die Anführungszeichen in der Anweisung . string sql = "INSERT INTO Passwörter (ID, Titel, Passwort) VALUES ('" + id +' ',' "+ title + '', '" + Passwort +' '); "; –

+0

Nur etwas nützliches http://stackoverflow.com/questions/11945980/sqlite-insert-statement-with-c gefunden –

0

Hinweis:

string str1 = "Chris";  
string res = string("hello ") + str1; 
Verwandte Themen