Zeichenketten zusammenfügen



  • Hallo,

    habe große Probleme Zeichenketten zusammenzufügen. Wie geht das richtig, meine Version (s.u.) ist nicht funktionstüchtig. Ich versuche über Usereingaben ein INSERT für eine MySQL-DB fertig zu machen.

    string vorname, name, telefon, matrikelnr, fh_standort, wohnort;
    	string query;
    
    	cout << "Vorname eingeben: ";
    	cin >> vorname;
    	cout << "Name eingeben: ";
    	cin >> name;
    	cout << "Standort der FH eingeben: ";
    	cin >> fh_standort;
    	cout << "Matrikelnr. eingeben: ";
    	cin >> matrikelnr;
    	cout << "Telefon eingeben: ";
    	cin >> telefon;
    	cout << "Wohnort eingeben: ";
    	cin >> wohnort;
    
    	query="INSERT INTO student(name,vorname,telefon,wohnort,matrikelnr,fh_standort) VALUES('";
    	query=strcat(query,name);
    	query=strcat(query,"','");
    	query=strcat(query,vorname);
    	query=strcat(query,"','");
    	query=strcat(query,telefon);
    	query=strcat(query,"','");
    	query=strcat(query,wohnort);
    	query=strcat(query,"','");
    	query=strcat(query,matrikelnr);
    	query=strcat(query,"','");
    	query=strcat(query,fh_standort);
    	query=strcat(query,"')");
    
    	cout << query << endl;
    


  • Zum Beispiel:

    query += name;
    

    Schau mal in der String Referenz.

    Edit: ⚠ Du solltest die Werte die der Benutzer eingibt auf jeden Fall escapen, bevor du ein Query damit erstellst, sonst könnnen ganz böse Sachen passieren. Stell dir mal vor, was passiert, wenn jemand O'Brian als Namen eingibt.



  • Hallo lomtas,

    Die Funktion strcat() ist nicht für die Zusammenarbeit mit der Klasse std::string sondern vielmehr für c-strings gedacht.
    Die Klasse std::string besitzt dafür eigene Methoden/operatoren.

    Beispiel für das Anhängen eines std::strings (oder char-Literals) an einen anderen std::string:

    std::string s1("Hallo "), s2("Welt!")
    s1 += s2; // oder s1 = s1 + s2;
    // s1 enthält jetzt "Hallo Welt!"
    

    Alternativ kannst du natürlich auch die Methode append() benutzen...

    P.S.: Außerdem solltest du bedenken, dass istream& operator>>(std::istream&, std::string& ) nur bis zum nächsten Whitespace (!) ließt. Falls du eine ganze Zeile einlesen möchtest, verwende die globale Funktion getline(std::istream&, std::string&).

    edit: to lateeee...

    Gruß, Caipi



  • Vielen Dank, das zusammensetzen funktioniert und schon habe ich die nächsten Probleme....

    mysql_query(mysql, query);
    

    Das will er jetzt nicht machen: "error C2664: 'mysql_query': Konvertierung des Parameters 2 von 'std::string' in 'const char *' nicht möglich". Was mache ich da bloß wieder?

    ProgChild schrieb:

    Edit: ⚠ Du solltest die Werte die der Benutzer eingibt auf jeden Fall escapen, bevor du ein Query damit erstellst, sonst könnnen ganz böse Sachen passieren. Stell dir mal vor, was passiert, wenn jemand O'Brian als Namen eingibt.

    Das kenne ich aus PHP schon sehr gut, nur fehlen mir die Funktionskenntnisse in C++ um das vernünftig umzusetzen. Was heißt escapen?

    Vielen Dank für eure Hilfe.

    @Caipi: Dein PS habe ich nicht verstanden.... 😕



  • query.c_str()
    

    Caipi´s PS besagt,dass wenn du Hans Mueller eingibst ,in deiner Variablen nachher nur Hans steht.Müller verbleibt im Stream.

    Gruss Spacelord



  • lomtas schrieb:

    Vielen Dank, das zusammensetzen funktioniert und schon habe ich die nächsten Probleme....

    mysql_query(mysql, query);
    

    Das will er jetzt nicht machen: "error C2664: 'mysql_query': Konvertierung des Parameters 2 von 'std::string' in 'const char *' nicht möglich". Was mache ich da bloß wieder?

    Du hast vergessen, dass du einen std::string in einen C String umwandeln musst.

    mysql_query(mysql, query.c_str ());
    

    lomtas schrieb:

    Das kenne ich aus PHP schon sehr gut, nur fehlen mir die Funktionskenntnisse in C++ um das vernünftig umzusetzen. Was heißt escapen?

    😮 Du weist nicht, was escapen ist? Dann sagst du jetzt besser nicht, welche Homepages du mit PHP und MySQL erstellt hast 🙄 ...

    Escapen bedeutet, dass du zum Beispiel ' durch /' ersetzt. In MySQL gibts ne Funktion, die das für dich macht mysql_escape_str oder so ähnlich. Musst du mal suchen.



  • Also was escapen ist weiß ich sehr gut. In PHP nutze ich dazu die Funktion addslashes(). Nur wie das in C++ ging wusste ich halt nicht. Wie gesagt bin ich ein umsteiger. Und wer es nicht glauben will kann sich unter www.youthwolfsburg.de gerne davon überzeugen, dass ich mit PHP und MySQL schon ganz gut umzugehen weiß.

    Du hast vergessen, dass du einen std::string in einen C String umwandeln musst.
    

    Ich habe es nicht vergessen, sondern einfach nicht gewusst... Danke für die Auskunft. Ich werde es ausprobieren.

    Finde es echt toll, dass ihr auch bei Anfängern so hilfsbereit seid.



  • lomtas schrieb:

    Also was escapen ist weiß ich sehr gut. In PHP nutze ich dazu die Funktion addslashes(). Nur wie das in C++ ging wusste ich halt nicht. Wie gesagt bin ich ein umsteiger. Und wer es nicht glauben will kann sich unter www.youthwolfsburg.de gerne davon überzeugen, dass ich mit PHP und MySQL schon ganz gut umzugehen weiß.

    Hab mich gerade vom Gegenteil überzeigt.

    Du solltest auf jeden Fall die Funktion mysql_escape_string für jeden String, den du vom Benutzer eingegeben bekommst, verwenden.

    Es wäre ohne Probleme mögliche, auf deiner Seite, durch das eingeben eines Bestimmten Benutzernamens, alle Tabellen deiner Datenbank zu löschen. Ich würd an deiner Stelle die Seite von Netz nehmen, oder zumindest den Benutzerlogin deaktivieren, bis du das repariert hast!!! ⚠



  • Gut, an der einen oder anderen Stelle habe ich das vergessen. Habe es jetzt aber ausgebessert. Zufrieden? Und noch eine Sache: Ich würde nicht an diesem einen Punkt festmachen wollen, ob sich jemand mit MySQL und PHP auskennt oder nicht. Aber ist ja auch egal eigentlich. Darum gings ja nicht.

    Gut, nun zum eigentlichen Problem wieder.

    mysql_query(mysql, "SELECT wert FROM test");
    res = mysql_store_result(mysql);
    row = mysql_fetch_row (res);
    

    Damit bekomme ich an der Stelle row[0] den Wert. Bisher habe ich unter php folgende Funktion benutzt: mysql_fetch_array. Damit konnte ich dann mit row['wert'] arbeiten. Gibt es das auch unter C++. Gibt's irgendwo vielleicht ne Übersicht mit den C++ mysql-Funktionen.

    Außerdem habe ich oft die Funktion mysql_num_rows benötigt. Gibt es die hier auch?

    Von welchem Typ muss die Variable sein, der ich mysql_fetch_array(res) zuweisen kann wenn es das gibt?



  • lomtas schrieb:

    Gut, an der einen oder anderen Stelle habe ich das vergessen. Habe es jetzt aber ausgebessert. Zufrieden?

    Ich muss nicht zufrieden sein. Ist nicht in meinem Interesse, dass deine Seite sicher ist.

    lomtas schrieb:

    Und noch eine Sache: Ich würde nicht an diesem einen Punkt festmachen wollen, ob sich jemand mit MySQL und PHP auskennt oder nicht.

    Naja... warum nicht? Ich meine wenn jemand meint, dass er sich gut auskennt, sollte er auf solche Dinge achten.

    lomtas schrieb:

    Aber ist ja auch egal eigentlich. Darum gings ja nicht.

    Ja

    lomtas schrieb:

    Damit bekomme ich an der Stelle row[0] den Wert. Bisher habe ich unter php folgende Funktion benutzt: mysql_fetch_array. Damit konnte ich dann mit row['wert'] arbeiten. Gibt es das auch unter C++. Gibt's irgendwo vielleicht ne Übersicht mit den C++ mysql-Funktionen.

    Hier solltest du das alles finden: http://www.mysql.org/doc/refman/4.1/en/c.html



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Datenbanken verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke, genau das habe ich gesucht. Leider ist mysql_fetch_array nicht dabei... 😞

    Die Seite habe ich übrigens vor über einem Jahr programmiert und man lernt ja auch dazu 😉 Deswegen habe ich es nach und nach ausgebessert, aber halt an ein oder anderer Stelle vergessen. Hast du noch ne gute Seite, die beschreibt was möglich ist, wenn man das vergisst? Was hast du gemacht um zu sehen, ob ich es vergessen habe oder nicht?



  • lomtas schrieb:

    Danke, genau das habe ich gesucht. Leider ist mysql_fetch_array nicht dabei... 😞

    Die Funktion entspricht in etwa mysql_fetch_field (). Das Problem ist, dass C kein Assoziativen Array kennt. Du müsstest also das Field in eine std::map packen, um das selber Resultat zu bekommen, wie in PHP. Wäre warscheinlich erstmal einfacher mit fetch_row zu arbeiten.

    lomtas schrieb:

    Die Seite habe ich übrigens vor über einem Jahr programmiert und man lernt ja auch dazu 😉 Deswegen habe ich es nach und nach ausgebessert, aber halt an ein oder anderer Stelle vergessen. Hast du noch ne gute Seite, die beschreibt was möglich ist, wenn man das vergisst? Was hast du gemacht um zu sehen, ob ich es vergessen habe oder nicht?

    Ich hab als benutzernamen einfach mal "asdf '; blubb" eingegeben und hab nen PHP fehler bekommen. Du solltest einfach mal in jede Benutzereingabe (auch in jeden URL Parameter) mal Strings mit Hochkommas oder Ähnlichem einsetzten.


Anmelden zum Antworten