MySQL Speicherung

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
  • Guten Abend Community,
    Ich hab vorhin immer mit Dini geschrieben und wollte nun mein jetziges Gamemode mit MySQL schreiben.
    Nun es klappte eigentlich alles wunderbar bis jetzt, bevor ich sah das wenn man sich registriert in der Datenbank alles -1 ist, zb. wenn man sein Kontostand anschaut steht dort -1.


    mysql_query("CREATE TABLE IF NOT EXISTS `accounts` (`id` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(28), `Passwort` varchar(28),`Level` int(4), `Geld` int(28), `Adminlevel` int(4), `Language` varchar(28), `Cop` int(4), `Banned` int(4), `Bank` int(28) PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1");

    Einmal editiert, zuletzt von Zreeq ()

  • stock SavePlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 1)
    {
    new query[500];
    SpielerInfo[playerid][pGeld] = GetPlayerMoney(playerid);
    format(query, sizeof(query), "UPDATE `accounts` SET `Level`='%d', `Geld`='%d', `Adminlevel`='%d', `Language`='%d', `Cop`='%d', `Banned`='%d', `Bank`='%d' WHERE `Name`='%s'",
    SpielerInfo[playerid][pLevel],
    SpielerInfo[playerid][pGeld],
    SpielerInfo[playerid][pAdminlevel],
    SpielerInfo[playerid][pLanguage],
    SpielerInfo[playerid][pCop],
    SpielerInfo[playerid][pBanned],
    SpielerInfo[playerid][pBank],
    GetSpielerName(playerid));
    mysql_query(query);
    }
    }
    return 1;
    }


    stock LoadPlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME);
    SpielerInfo[playerid][pLevel] = mysql_GetInt("accounts", "Level", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pGeld] = mysql_GetInt("accounts", "Geld", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pAdminlevel] = mysql_GetInt("accounts", "Adminlevel", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pLanguage] = mysql_GetInt("accounts", "Language", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pCop] = mysql_GetInt("accounts", "Cop", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pBanned] = mysql_GetInt("accounts", "Banned", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pBank] = mysql_GetInt("accounts", "Bank", "Name", SpielerInfo[playerid][pBank]);
    if(GetPVarInt(playerid, "Banned") == 1)
    }
    return 1;
    }

  • Er spuckt mir nur dies aus:


  • Die Anführungszeichen sind nur für Strings (%s) und nicht für Integer (%d) gedacht. Die Backticks kannst Du getrost missachten, da hier eine SQL injection so gut wie unmöglich ist, wenn man ordentlich programmiert.
    Debug Dir mal den Query.

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)

  • 1. Du brauchst nicht jeden Wert in ´´ bzw. '' angeben.
    Zeichnketten musst du in '' angeben, den Rest nicht (es sei denn der Feldname ist ein "spezielles" Wort wie z.B. SELECT)
    Außerdem kannst du die Leerzeichen wegmachen, das spart Platz:

    SQL
    UPDATE accounts SET Level=%d,Geld=%d,Adminlevel=%d,Language=%d,Cop=%d,Banned=%d,Bank=%d WHERE Name='%s'


    2. Damit MySQL nach dem ersten Fund nicht weitersucht, kann

    SQL
    LIMIT 1


    an den Query gehängt werden. Der muss sich ja nicht totsuchen ^^


    3. Wenn du zwischen Groß- und Kleinschreibung unterscheiden möchtest,
    verwende statt "WHERE Name='%s'":

    SQL
    WHERE Name = BINARY '%s' LIMIT 1


    4. Alle Zeichketten sollten mit mysql_real_escape bzw. mysql_format in Verbindung mit %e überprüft werden,
    weil es sonst sein kann, dass ein Syntax-Fehler auftritt.


    Beispiel:
    Admin A bannt User A mit dem Banngrund: "Beleidigung: 'Trottel'"
    Der Syntax würde dann so aussehen:

    SQL
    UPDATE accounts SET Bangrund='Beleidigung: 'Trottel'' WHERE ....


    Das gäbe ein Syntaxfehler (ich hoffe es ist verständlich warum).


    5. Werte aus den Tabellen sollten mit

    SQL
    SELECT * FROM accounts WHERE ...


    herausgelesen werden. Das geht schneller und ist besser fürs Script.


    6. Wenn der Spieler connected, sollte zuerst überprüft werden ob der Spieler existiert.
    Wenn nicht, wird er in die Datenbank eingetragen (INSERT INTO...).
    Wenn er existiert wird das Passwort herausgelesen und abgefragt.



    Hoffe ich konnte dir ein paar Tipps geben :)