MySQL -> Data truncated for column



  • Ich sag ja: verwende SQL-Parameter (s. FAQ-Beitrag http://www.c-plusplus.net/forum/viewtopic-var-t-is-39273.html)...

    Du übergibst ja den Wert als String (d.h. in Anführungsstrichen).

    P.S: Ich hoffe, dies ist bisher kein öffentlich verfügbares Programm (Stichwort: SQL-Injection http://de.wikipedia.org/wiki/SQL-Injection)



  • Vielen Dank für die Antwort, ich werde das jetzt mal ändern und testen. Eine Frage habe ich noch, wie können den in meiner Applikation SQL-Injections angewendet werden, ich meine es gibt keine Möglichkeit irgendwo etwas einzugeben? Viele Grüsse, Maik



  • So, hab jetzt mal alles geändert, leider funktioniert das immer noch nicht und ich glaube so langsam ich bin einfach zu blöd dafür. Ich poste hier mal meinen Code:

    int nummer = 246;
    	ADOQuery4->SQL->Clear();
    	ADOQuery4->SQL->Add("UPDATE automatenverwaltung.abrechnung_erfassung");
    	ADOQuery4->SQL->Add("SET (MWST_SPIELER) VALUES (:MWST_SPIELER)");
    	ADOQuery4->SQL->Add("WHERE NUMMER = '" + IntToStr(nummer) + "'");
    	ADOQuery4->Parameters->ParamByName("MWST_SPIELER")->Value = mwst_vom_spieler_gezahlt;
    	ADOQuery4->ExecSQL();
    

    Die Fehlermeldung lautet ADOQuery4: Parameter 'MWST_SPIELER' nicht gefunden.

    Hab ich was falsch geschrieben? Der Parameter wird doch definiert, ParamCheck steht übrigens auf false...

    Wäre nett wenn noch mal jemand Helfen könnte,

    LG, Maik



  • Hallo

    Um SQL Injection anwenden zu könenn, ist natürlich eine direkte Eingabe notwendig (Berüchtigt waren und sind Websiten, die erkennbar SQL-Anweisungen bzw. Teile davon in URLs verwenden und ungeprüft übernehmen). Falls die Werte deiner Variablen wirklich nicht direkt vom Benutzer manipuliert werden können (bereits eine gefilte Eingabe, die nur Zahlen zuläßt, reicht), kann erstmal keine Injection ausgeführt werden.
    Aber guter Stil ist das trotzdem nicht, denn du gewöhnst dich an dieses laxe Umsetzen, auch wenn du dann irgendwann mit Texteingaben zu tun hast...
    Merke : Nicht die Benutzeroberfläche sollte deine Daten schützen, sondern deine Programmlogik, nur so erreichst du eine saubere Trennung von GUI und Logik.

    bis bald
    akari



  • Hallo

    Hab ich was falsch geschrieben? Der Parameter wird doch definiert, ParamCheck steht übrigens auf false...

    Sollte ParamCheck nicht eher auf true stehen?

    BCB-Hilfe schrieb:

    In einer Anwendung, die keine parameterisierten Abfragen verwendet, könnte ParamCheck auf false gesetzt werden, aber in allen anderen Fällen sollte ParamCheck true sein.

    bis bald
    akari



  • @akari: Danke für deine Antwort, ich hatte nur in einem anderen Beitrag gelesen, dass ParamCheck auf false stehen muss wenn die Parameter im Code zugewiesen werden, selbst nach Umstellung auf true erhalten ich immer noch den selben Fehler.

    LG, Maik



  • hier stand blödsinn...

    mfg
    xXx



  • Je nach Datenbank-Provider kann es sein, daß man die Parameternamen exakt übernehmen muß, d.h. inkl. des Doppelpunkts.
    Probiere daher mal:

    ParamByName(":MWST_SPIELER")
    

    Edit: ich muß aber zugeben, daß ich mich mit MySql nicht wirklich auskenne.

    P.S. Dein Update-Befehl sieht eigenartig aus - ich kenne eigentlich nur:

    SET MWST_SPIELER = :MWST_SPIELER
    

    'VALUES' kenne ich nur beim Insert-Befehl.

    Und auch die Nummer könntest du als Parameter übergeben:

    ADOQuery4->SQL->Add("WHERE NUMMER = :NUMMER");
    ADOQuery4->Parameters->ParamByName(":NUMMER")->Value = IntToStr(nummer);
    

    So ersparst du dir jeweils den richtigen Datentyp explizit übergeben zu mässen (d.h. bei Strings immer an die Hochkommata zu denken, bei DateTime immer das Datenbank-Format benutzen zu müssen etc.).
    Ein wichtiger Vorteil bei den Parametern ist auch noch das sog. Escapen bzw. Quoten, d.h. wenn z.B. innerhalb des Textes selber einfache Anführungsstriche oder sonstige Sonderzeichen (z.B. der Backslash '\') vorkommen: "It's bad".

    akari:
    Danke auch für deine wundervolle Erklärung bzgl. der Verwendung von SQL-Parametern.



  • Th69 schrieb:

    Je nach Datenbank-Provider kann es sein, daß man die Parameternamen exakt übernehmen muß, d.h. inkl. des Doppelpunkts.

    Echt? Hab ich ja noch nie gesehen (was aber nichts heißen muss 😉 ). Aber meiner Meinung nach leitet der Doppelpunkt nur Parameter ein, damit der SQL-Parser erkennt, was Parameter sind.

    Ich frage mich allerdings gerade, ob Parameter den gleichen Namen haben dürfen, wie Felder?!?

    ParamCheck muss auf true sein, da sonst die Parameterliste nicht aktualisiert wird, wenn der Select (zur Laufzeit) genändert wird.

    Was passiert denn, wenn Du die Abfrage vorbereitest, bevor Du den Parameter setzt?



  • Also ich komme hier nicht weiter, wäre toll wenn mir jemand sagen könnte ob ich bei der UPDATE-Routine in Verbindung mit MySQL überhaupt Parameter verwenden kann...

    LG, Maik



  • Trag doch bitte mal den Select direkt in die Query ein und schau, ob er die Parameter dann findet.



  • Was meinst du mit SELECT? Ich mache hier eine UPDATE-Routine. Kann er denn die Parameter überhaupt finden wenn die Abfrage direkt in die Query schreibe? Ich meine die Parameter werden bei mir ja im Code erst definiert...

    LG, Maik



  • So, ich habe nun noch mal im Netz recherhiert, es gibt für den UPDATE-Befehl keine definitv keine Möglichkeit Parameter zu übergeben...War also alles umsonst, und ich fange ganz oben im Thread wieder an. Kann sich jemand den Fehler erklären? Ich habe keine Ahnung...

    LG,

    Maik



  • maikmueller schrieb:

    So, ich habe nun noch mal im Netz recherhiert, es gibt für den UPDATE-Befehl keine definitv keine Möglichkeit Parameter zu übergeben...

    Wärst Du so freundlich, die Quelle zu verlinken? Mich interessiert, woher diese Einschränkung kommt. Danke!



  • Zu dem SQL:

    * du kannst dir im Debugger mal den String geben und in einer mysql-Konsole ausführen und schauen was passiert
    * hast du die Lokale beachtet? Nicht dass FloatToStr ein Dezimalkomma verwendet und mysql ein Dezimalpunkt erwartet



  • @witte:

    Habe das Problem gerade erkannt, habe tatsächlich vergessen den String mit Punkt zu formatieren. Jetzt funktioniert es, danke an Alle...

    LG, Maik


Anmelden zum Antworten