Where Clause mit Variable



  • Hallo,

    mein 2. kleines Problem heute.

    wxString uname = m_loginusername->GetValue();
    .
    .
    .
    wxSQLite3ResultSet pass = db->ExecuteQuery(wxT("SELECT pass FROM users WHERE uname='"+uname+"'"));
    

    ... produziert wieder diesen Fehler ....

    ambiguous overload for 'operator+' in 'operator+(const wxChar*, const wxString&)(((const wxString&)((const wxString*)(&uname)))) + "\'"'|
    

    Ich weiß nun das er mir sagt das ich nen Zeiger mit einem String verbinden will, allerdings dachte ich es sind beides Strings. 😕 Ich steh aufn Schlauch.

    Darf ich euch noch einmal um Hilfe bitten ?

    Der Nala


  • Mod

    Nein, Sachen die du im Quelltext zwischen "" stehen hast, sind vom Typ const char[] . Je nachdem, was wxString genau ist, gibt es bestimmt einen Konstruktor, mit dem du aus const char* einen wxString machen kannst.



  • Also ich habs nun mit dieser Quelle
    http://wiki.wxwidgets.org/WxString

    versucht umzusetzen, allerdings ist mir das noch nicht ganz gelungen.

    wxString query = wxT("SELECT pass FROM users WHERE uname='"+(const char*)uname.mb_str(wxConvUTF8)+"'");
    

    Die Fehlermeldung lautet nun so:

    invalid operands of types `const wchar_t[37]' and `const char*' to binary `operator+'|
    

    Hat noch jemand nen Tipp für mich ?



  • wxT ist anscheinend ein Makro, was in deinem Fall so definiert wurde, dass es ein L einem Stringliteral voranstellt. Also wxT("hello") --> L"hello" . Das erklärt auch Deine Fehlermeldung; denn L"hello" ist ein Array vom Typ const wchar_t[37] und hat als solches keinen überladenen + Operator. Du musst deine Stringkonstante also erst zu einem wxString konvertieren.



  • krümelkacker schrieb:

    ...denn L"hello" ist ein Array vom Typ const wchar_t[37] ...

    Ist natürlich eine 6 statt 37 in diesem Fall. 😉



  • Spätestens jetzt bin ich total verwirrt 😉 Ich weiß grad nicht mehr was ich zu was konvertieren soll .....

    EDIT:
    Gibt es bei der ganzen Sache nicht die möglichkeit das in der Art zu lösen ?

    wxString query = wxT("SELECT pass FROM users WHERE uname='%s'"),uname
    


  • Ich glaube ich komme dem ganzen etwas näher.

    wxString uname = m_loginusername->GetValue();
    		if (un == uname)
    		{
                char* chars = "SELECT pass FROM users WHERE uname = '%s'",uname;
                wxString query(chars, wxConvUTF8);
                wxSQLite3ResultSet pass = db->ExecuteQuery(query);
    

    Allerdings bekomme ich nun den hinweis das "uname" eine nicht verwendete Variable sei und die Abfrage funktioniert noch nicht.


  • Mod

    Was ich dir eigentlich sagen wollte, ist, dass du es genau andersrum machen solltest als du es nach meinem Rat gemacht hast 😮

    Du solltest den const char * in einen WxString umwandeln, nicht umgekehrt. WxString kennt nämlich den Operator +, const char* nicht.

    Etwas wie dies sollte funktionieren:

    wxSQLite3ResultSet pass = db->ExecuteQuery(wxT(wxString::FromAscii("SELECT pass FROM users WHERE uname=\'")+uname+wxString::FromAscii("\'")));
    

    Beachte außerdem, dass ich die Hochkommata ' durch die Escape-Sequenz \' ersetzt habe, da dein Compiler ansonsten verwirrt sein dürfte.



  • Danke SeppJ

    Wenn ich deinen Code direkt in mein Prog einsetze ommt folgende Fehlermeldung

    In member function `virtual void SEAdminDialog::m_BTNLoginOnButtonClick(wxCommandEvent&)':|
    `LwxString' has not been declared|
    `FromAscii' was not declared in this scope|
    |26|warning: unused variable 'FromAscii'|
    ||=== Build finished: 2 errors, 1 warnings ===|
    

    Ich hab es nun nach viel googlen und Samples anschauen folgendermaße gelöst:

    wxString query;
    query << wxT("SELECT pass FROM users WHERE uname = '") << uname << wxT("'");
                wxSQLite3ResultSet pass = db->ExecuteQuery(query);
    

    Funktionieren tut es wie gewünscht .... allerdings graut mir davor wenn ich dann gleich das erste mal Daten aus der DB gegen die ID (INT) auslese ... da geht das Thema sicher weiter ..... falls also wer Verbesserungsvorschläge hat nehm ich die gern mit 😃



  • allerdings graut mir davor wenn ich dann gleich das erste mal Daten aus der DB gegen die ID (INT) auslese ... da geht das Thema sicher weiter ..... falls also wer Verbesserungsvorschläge hat nehm ich die gern mit 😃

    Wie wär's damit, richtig C++ zu lernen? (so mit Buch und so) :p



  • nalamar schrieb:

    Funktionieren tut es wie gewünscht ....

    Bis jemand für uname

    '; DROP TABLE users;--
    

    eingibt. Du solltest dringend prüfen, ob deine Datenbank-API parametrisierte Abfragen anbietet.



  • krümelkacker schrieb:

    Wie wär's damit, richtig C++ zu lernen? (so mit Buch und so) :p

    Ich versuchs halt auf die harte "Learning by doing" tour - und ich danke jedem der sich die Zeit nimmt, auf meine Beiträge zu Antworten. 😃

    MFK schrieb:

    nalamar schrieb:

    Funktionieren tut es wie gewünscht ....

    Bis jemand für uname

    '; DROP TABLE users;--
    

    eingibt. Du solltest dringend prüfen, ob deine Datenbank-API parametrisierte Abfragen anbietet.

    Über die Gefahr der SQL-Injektions bin ich mir durchaus bewusst. Diese abzufangen steht auf meiner ToDO-Liste. Aber ich weiß auch, das die Leute die irgend wann mal mit dem Programm arbeiten können, davon auch nicht wirklich Ahnung haben, was das ganze nicht allzuweit oben auf meiner Liste ansiedelt. Aber trotzdem danke nochmal für den Hinweis! 👍

    Der Nala


Anmelden zum Antworten