MSQL Speichert als "Null"

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • hallo Breadfish


    ich habe folgendes Problem und zwar


    wenn ich ein Fahrzeug kaufe steht im MSQL als "NULL"


    hier der beweis



    hoffe ihr könnt mir da helfen


  • Also folgendes mal ausbessern.

    • es heißt nicht &f sondern %f (und hier würde ich es beschränken auf %.1f)
    • desweiteren sind Anführungszeichen hier vollkommen fehl am Platz, weil es ein Float oder Double ist

    NULL wird eigentlich nur als Standardwert gesetzt, wenn kein Inhalt vorhanden ist. (sofern Du das so eingestellt hast)


    Mach Dein SQL-Abfrage direkt mal in phpmyadmin.

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)

  • desweiteren sind Anführungszeichen hier vollkommen fehl am Platz, weil es ein Float oder Double ist

    Das ist kein Fehler, man muss die Zeichen bei Double und Floats nicht setzen, kann man aber. Bei Strings hingegen ist das Pflicht.


    Bearbeite aber mal den ersten Punkt von @Jony, und versuche es danach erneut. Steht dann wieder NULL in der Tabelle?

  • Das ist kein Fehler, man muss die Zeichen bei Double und Floats nicht setzen, kann man aber. Bei Strings hingegen ist das Pflicht.
    Bearbeite aber mal den ersten Punkt von @Jony, und versuche es danach erneut. Steht dann wieder NULL in der Tabelle?

    Es ist ein Fehler. Es mag Dir vielleicht von SQL keinen Fehler ausgeben, ist aber trotzdem falsch. Anführungszeichen signalisieren, dass jetzt ein String (Zeichenkette) kommt. Hier kommt aber kein String, und kann daher ebenfalls zu einem Fehleintrag kommen.
    Hier nochmal Informationen zu den Grundinformationen zu MySQL

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)

  • OK, ich dachte immer dass das egal wäre. Na gut, habe ich wieder was dazu gelernt. :good:


    # EDIT:
    @Jony
    Das, was du hier drunter geschrieben hast, wusste ich, aber vielleicht gut, dass du das nochmals ansprichst. :)

    Einmal editiert, zuletzt von AirM4X ()

  • OK, ich dachte immer dass das egal wäre. Na gut, habe ich wieder was dazu gelernt. :good:

    Ebenfalls möchte ich noch hinzufügen, was viele ebenfalls falsch interpretieren. Die sog. Backticks werden nur eingesetzt, sofern man von MySQL sog. Schlüsselwörter als Tabelle oder Felder nutzt. (MySQL reserviert einige Wörter für sich und können nur anhand der Backticks als Tabelle bzw. Feld gekennzeichnet werden!)
    Deswegen sollte man immer darauf achten, keine Schlüsselwörter als Bennenung für Felder bzw. Tabellen zu nehmen.

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)

  • meint ihr das hier

    Nein, du hattest '&f' stehen, es muss aber '%f' heißen.
    Die Ticks sind dort schon richtig.


    Aber du kannst die drei Queries zu einem zusammenführen, mache es so:
    public OnPlayerBuyCar(playerid,Model,Preis,Autohaus)//CARSYS
    {
    if(IsPlayerConnected(playerid) && !Dtc_PlayerHaveCar[playerid][Dtc_PlayerKey[playerid]])
    {
    CallRemoteFunction("M_GivePlayerMoney","id",playerid,-Preis);
    Gas[Model] = GetGasMax(GetVehicleModel(Model));
    SetParkPlatz(playerid,Autohaus);
    new name[MAX_PLAYER_NAME], str[700], x = Dtc_PlayerKey[playerid];
    GetPlayerName(playerid, name, sizeof name);
    mysql_format(handle, str, sizeof(str), "INSERT INTO `carsystem` (`CarOwner`) VALUES ('%s_%d');", name, x);
    mysql_pquery(handle, str);
    format(str, sizeof(str), "UPDATE `carsystem` SET `CarModel`='%d', `CarPos_X`='%f', `CarPos_Y`='%f', `CarPos_Z`='%f', `CarPos_A`='%f', `CarNitro`='0', `CarHyd`='0', `CarWheel`='0', `CarAusp`='0'",
    Model, PlayerCar[playerid][x][CarPos_x], PlayerCar[playerid][x][CarPos_y], PlayerCar[playerid][x][CarPos_z],PlayerCar[playerid][x][CarRotate]);
    format(str, sizeof(str), "%s, `CarSideL`='0', `CarSideR`='0', `CarFB`='0', `CarRB`='0', `CarSpoiler`='0', `CarRoof`='0', `CarHood`='0', `CarVents`='0', `CarLamps`='0'",str);
    format(str, sizeof(str), "%s, `CarPJ`='0', `CarC1`='0', `CarC2`='0', `Preis`='%d', `Neon`='0' , `Plate`='0', `Number`='GBN-0', `Gesperrt`='0', `Sperrpreis`='0', `Kralle`='0' WHERE `CarOwner` = '%s_%d'", str, Preis, name, x);
    mysql_pquery(handle, str);
    OnPlayerCarLogin(playerid);
    printf("OnPlayerBuyCar (%s_%d)",name,x);
    }
    return 1;
    }
    Das spart Ressourcen.

  • Nein, du hattest '&f' stehen, es muss aber '%f' heißen.Die Ticks sind dort schon richtig.


    Aber du kannst die drei Queries zu einem zusammenführen, mache es so:
    public OnPlayerBuyCar(playerid,Model,Preis,Autohaus)//CARSYS{ if(IsPlayerConnected(playerid) && !Dtc_PlayerHaveCar[playerid][Dtc_PlayerKey[playerid]]) { CallRemoteFunction("M_GivePlayerMoney","id",playerid,-Preis); Gas[Model] = GetGasMax(GetVehicleModel(Model)); SetParkPlatz(playerid,Autohaus); new name[MAX_PLAYER_NAME], str[700], x = Dtc_PlayerKey[playerid]; GetPlayerName(playerid, name, sizeof name); mysql_format(handle, str, sizeof(str), "INSERT INTO `carsystem` (`CarOwner`) VALUES ('%s_%d');", name, x); mysql_pquery(handle, str); format(str, sizeof(str), "UPDATE `carsystem` SET `CarModel`='%d', `CarPos_X`='%f', `CarPos_Y`='%f', `CarPos_Z`='%f', `CarPos_A`='%f', `CarNitro`='0', `CarHyd`='0', `CarWheel`='0', `CarAusp`='0'", Model, PlayerCar[playerid][x][CarPos_x], PlayerCar[playerid][x][CarPos_y], PlayerCar[playerid][x][CarPos_z],PlayerCar[playerid][x][CarRotate]); format(str, sizeof(str), "%s, `CarSideL`='0', `CarSideR`='0', `CarFB`='0', `CarRB`='0', `CarSpoiler`='0', `CarRoof`='0', `CarHood`='0', `CarVents`='0', `CarLamps`='0'",str); format(str, sizeof(str), "%s, `CarPJ`='0', `CarC1`='0', `CarC2`='0', `Preis`='%d', `Neon`='0' , `Plate`='0', `Number`='GBN-0', `Gesperrt`='0', `Sperrpreis`='0', `Kralle`='0' WHERE `CarOwner` = '%s_%d'", str, Preis, name, x); mysql_pquery(handle, str); OnPlayerCarLogin(playerid); printf("OnPlayerBuyCar (%s_%d)",name,x); } return 1;}
    Das spart Ressourcen.

    Auch nochmal dazu, die Ticks sind einfach falsch. Genauso wie die Anführungszeichen..

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)

  • Wenn du Resourcen sparen möchtest, entfern auch noch die Leerzeichen (zwischen den Werten und Kommas) in deinem Query-String. Sieht zwar MIT schöner aus, aber überflüssig.
    NULL ist ein Wert der MySQL Datenbank. Wenn du beim Erstellen der Tabelle NULL (nicht 0) Werte als Vorgabe eingestellt hast, wird NULL dort eingefügt, wo du keine Werte beim INSERT angibst.


    Dein Problem deutet also daraufhin, sofern ich das richtig gelesen habe (habs nur kurz überflogen), daß dein INSERT korrekt ausgeführt wird, dein anschließender UPDATE nicht.


    Übrigens, wieso fragst du vorher nicht ab, ob es mit diesen Werten (ID) nicht schon ein Eintrag gibt. Gibt es ihn, UPDATE, ansonsten INSERT. So, wie du das machst, erstellst du immer mit INSERT einen neuen Eintrag und aktualisiert ihn mit UPDATE dann.

  • Auch nochmal dazu, die Ticks sind einfach falsch. Genauso wie die Anführungszeichen..

    Nein.


    Sowohl die ` bei den Spaltenbezeichnern, als auch die ' bei den Werten sind ein Garant dafür, dass es auf jeden Fall klappt, da ein Wert als String (z.B.) ohne ' nicht funktioniert, und eine Spalte die z.B. Alter heißt ohne ` auch nicht funktioniert. Es ist daher zu empfehlen, wenn man sicher gehen will, diese immer zu setzen.

  • Nein.
    Sowohl die ` bei den Spaltenbezeichnern, als auch die ' bei den Werten sind ein Garant dafür, dass es auf jeden Fall klappt, da ein Wert als String (z.B.) ohne ' nicht funktioniert, und eine Spalte die z.B. Alter heißt ohne ` auch nicht funktioniert. Es ist daher zu empfehlen, wenn man sicher gehen will, diese immer zu setzen.

    Dann lies die MySQL Dokumentation nochmals. Vor allem Stichworte ANSI-MySQL, etc.
    Am besten auch hier mal lesen: https://www.sitepoint.com/comm…useful-information/2716/4


    Aber ist nur meine Meinung.

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)

  • Das macht es aber keineswegs falsch.In vielen Fällen sind sie eben optional.


    Wenn es deine Meinung ist, dann ist das in Ordnung.
    Ich hingegen empfehle es, vor allem MySQL Anfängern, die ` und ' zu nutzen, um Fehler zu vermeiden.

    Doch, weil es desöfteren von My(SQL) Syntax Fehler auspucken kann. Steht aber alles in den Links die ich gepostet habe.
    Ich bin der Meinung, wenn man jemand was erklärt, dann auch nach gewissen Standards. (Solche Sachen sind in so.g. Guide-lines geregelt.)

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)

  • Versuch es mal so. K.A. obs funktioniert. Sollte auch selbsterklärend sein.


    Nachtrag:
    übrigens empfehl ich dir Standardwerte bei deiner Tabelle einzutragen. Dann brauchst du die Felder nicht immer mit 0 zu füllen, da das MySQL selber dann tut. Verkürzt deinen String auch immens und spart etwas Resourcen ;).

  • Doch, weil es desöfteren von My(SQL) Syntax Fehler auspucken kann.

    Poste bitte mal ein Beispiel, bei dem ein vorhandener, optional gesetzter Tick, in MySQL, einen Fehler erzeugt.
    Das dürfte ja kein Problem sein, wenn es so oft vorkommt.
    Ansonsten solltest du von deiner Aussage, dass es falsch ist, Abstand nehmen. Falsch ist es in gepostetem Code ohnehin nicht.



    Meiner Erfahrung nach kommt es fast immer zu Fehlern durch fehlende Ticks, daher wie gesagt die Empfehlung für Anfänger, die Ticks immer zu setzen. Das heißt ja im Umkehrschluss nicht, dass man ihnen nicht erklärt, dass sie optional sind. Es fängt nur nicht jeder als Profi an, daher gilt Anfangs erst mal, Fehler so gut wie möglich zu vermeiden. Das ist meine Meinung und Erfahrung.

  • Poste bitte mal ein Beispiel, bei dem ein vorhandener, optional gesetzter Tick, in MySQL, einen Fehler erzeugt.Das dürfte ja kein Problem sein, wenn es so oft vorkommt.
    Ansonsten solltest du von deiner Aussage, dass es falsch ist, Abstand nehmen. Falsch ist es in gepostetem Code ohnehin nicht.



    Meiner Erfahrung nach kommt es fast immer zu Fehlern durch fehlende Ticks, daher wie gesagt die Empfehlung für Anfänger, die Ticks immer zu setzen. Das heißt ja im Umkehrschluss nicht, dass man ihnen nicht erklärt, dass sie optional sind. Es fängt nur nicht jeder als Profi an, daher gilt Anfangs erst mal, Fehler so gut wie möglich zu vermeiden. Das ist meine Meinung und Erfahrung.

    Ich will die Diskussion hier nicht ausarten lassen. Als Beispiel nenne ich hier mal beliebte JOIN-Statements, wo oft der Fehler gemacht werden, die ohne Backticks nicht passieren würden. Es geht hier um das falsche setzen von Backticks.
    Das wird Dir einen Fehler ausgeben

    SQL
    `test.test2`


    Und die Lösung wäre


    Code
    `test`.`test2`

    das zieht sich in mehreren Situationen durch. Ebenfalls setzen viele auch Backticks anstatt Anführungszeichen.


    Und verstehe nicht meinen Satz falsch, ich sagte, dass es desöfteren vorkommt. Hier scheinst Du mich wohl falsch verstanden zu haben.


    Ich sage mal so, wenn man My(SQL) an sich nicht verstanden hat, sowie was Schlüsselwörter sind, ist das in meinen Augen eher ein Grundlegendes Problem. Ich sage mal so, es ist nicht falsch, da habe ich mich ungenau ausgedrückt, sondern einfach nicht von so My(SQL) vorgesehen. Du darfst nicht vergessen, das My(SQL) an sich auch viele Syntax-Fehler ohne eine Fehlermeldung bereinigt.


    Ich wollte hier keine Diskussion anstoßen, und klinke mich hier auch aus. Aber ich wollte eigentlich nur mal klarstellen, was eigentlich Backticks und deren Verwendung ist.

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)