[jTuT] MySQL R41-4 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)

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
  • Das wird so nicht klappen, du wirst das Geld zwar in der Datenbank stehen haben, aber nach dem Register nicht bekommen.


    Mache es so:
    if(dialogid == DIALOG_REGISTER)
    {
    //Spieler hat Abbrechen gewählt
    if(!response) return Kick(playerid);


    //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
    if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrierung", "Bitte registrieren Sie sich:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");


    //Wenn alles passt wird der Spieler in der Datenbank angelegt
    //Als Verschlüsselung für das Passwort wird MD5 verwendet
    new query[256];
    mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, level, money) VALUES ('%e', MD5('%e'),1,2500)", PlayerInfo[playerid][pName], inputtext);


    //Das Query wird abgesendet und die playerid an OnUserRegister übergeben
    mysql_pquery(handle, query, "OnUserRegister", "d", playerid);

    PlayerInfo[playerid][pMoney] = 2500;
    PlayerInfo[playerid][pLevel] = 1;
    GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
    SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
    return 1;
    }


    public OnPlayerSpawn(playerid)
    {
    if(PlayerInfo[playerid][pErsterLogin] == 0)
    {
    PlayerInfo[playerid][pErsterLogin] = 1;
    //Tutorial(playerid);
    }
    else if(PlayerInfo[playerid][pErsterLogin] >= 1)
    {

    }
    return 1;
    }


    Das Ganze unter OnPlayerSpawn zu regeln ist nicht gut, da das ja jedes mal aufgerufen wird, wenn der Spieler spawnt.
    Was höchstens gehen würde wäre:


    public OnPlayerSpawn(playerid)
    {
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
    SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
    if(PlayerInfo[playerid][pErsterLogin] == 0)
    {
    PlayerInfo[playerid][pErsterLogin] = 1;
    //Tutorial(playerid);
    }
    else if(PlayerInfo[playerid][pErsterLogin] >= 1)
    {

    }
    return 1;
    }


    Dann wird das Geld beim Spawn jedes mal wieder korrekt gesetzt, zu dem was in der Variable steht.

  • Jeffry,


    Ich habe auch versucht ein System zu machen, mit deinem Tut, hat alles so weit geklappt - also ganz nettes Tut, nur was mich stört ist:


    Wenn ich mit dieser Cache Funktion was speichere und dann was in der Datenbank verändere (durch ein CP) dann spinnt der ganze Server rum ( leute können nicht connten, und so weiter...)


    Dann war ich doch wieder gezwungen auf die alte Speicherung (R6) zuzugreifen.

  • Also ich habe es einfach nur gespeichert beim Disconnect:


    C
    public OnPlayerDisconnect(playerid, reason)
    {
    	SaveUserStats(playerid);
    	return 1;
    }



    Mir kommt es so vor, als geht das ganze System nur, wenn der Code in dem Arbeitsspeicher genau so ist, wie die Datenbank davor war.


    Wenn der Server aber an ist, ich mich vorhin eingeloggt habe ( den Server laufen gelassen habe) und was in der Datenbank verändert habe, konnte ich mich nicht mehr einloggen, ich wurde einfach gespawnt und fertig.
    Ohne eine Passwort abfrage..


    Man kann den Server doch nicht ständig bei 200 Usern neu starten, nur weil ein User was im CP ändert...

  • Man kann den Server doch nicht ständig bei 200 Usern neu starten, nur weil ein User was im CP ändert...

    Das stimmt allerdings.
    Was hast du denn geändert? Etwas an der Struktur, oder einen Wert?


    Es wäre interessant da mal die Logs zu sehen, von dem Login, zusammen mit dem Code davon, einmal wenn es klappt, und einmal wenn es nicht klappt. Könntest du das generieren lassen und dann posten?

  • Moin ich bins mal wieder :D


    Bei mir speichert er jetzt überhaupt nichts mehr beim Disconnecten und auch nicht wenn ich es per Timer jede Minuten speichern lasse speichert er nix auch wenn ich mir Adminlevel gebe er speichert es nicht in der Datenbank. Woran kann das liegen? Hier das SaveUserStats Stock:



    stock SaveUserStats(playerid)
    {
    //Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nicht
    if(!PlayerInfo[playerid][pLoggedIn]) return 1;



    //Ansonsten speichere sie
    new query[256];
    mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', admin = '%d', money = '%d', kills = '%d', deaths = '%d', team = '%d', fraktion '%d', member '%d', leader '%d', rang '%d' WHERE id = '%d'",
    PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][pTeam], PlayerInfo[playerid][pFrak], PlayerInfo[playerid][pMember], PlayerInfo[playerid][pLeader], PlayerInfo[playerid][pRang], PlayerInfo[playerid][p_id]);



    //Das Query wird abgesendet
    mysql_pquery(handle, query);
    return 1;
    }

  • Beitrag von [KoSoVa] ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Fehler gefunden. ().
  • (06.03.2016 / 15:07)


    Du kannst die Werte die du auslesen willst, gleich wie Integers auch, mit einem SELECT Query auswählen, mit mysql_pquery in ein Callback übergeben, und dann mit http://wiki.sa-mp.com/wiki/MySQL/R33#cache_get_field_content auslesen. Vom Prinzip her genau gleich, nur dass du cache_get_field_content nutzt, anstatt cache_get_field_content_int.


    =======================================


    Edit (19.03.2016):
    Ich habe im Start-Post die Formatierung der Spoiler repariert, sodass deren Inhalt nun wieder versteckt ist und auf Wunsch ausgeklappt werden kann.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • @Jeffry


    Eine kleine Frage:


    Muss man beim letzten Speichervorgang (also beim disconnect) nicht auch den Cache löschen?
    Weil wenn der Cache und die Datenbank nicht stimmen (durch Veränderung vom CP) dann wird der User nicht mehr richtig geladen..

  • Muss man beim letzten Speichervorgang (also beim disconnect) nicht auch den Cache löschen?

    Nur wenn du zuvor den Cache mit http://wiki.sa-mp.com/wiki/MySQL/R33#cache_save gespeichert hast würde das Sinn machen.
    Ansonsten hast du ja keine Möglichkeit auf den entsprechenden Cache zuzugreifen. Der dürfte nach Ausführung eines Callbacks mit Cache auch automatisch weg sein, sofern man ihn nicht speichert, sonst müsste man das ja immer machen (Ausnahme: mysql_query! -> sollte aber sowieso nicht verwendet werden).

  • Hey habe ein problem er speichert meine daten nicht in der daten bank



    stock SaveUserStats(playerid)
    {
    //Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nicht
    if(!PlayerInfo[playerid][pLoggedIn]) return 1;



    //Ansonsten speichere sie
    new query[256];
    mysql_format(handle,query,sizeof(query),"UPDATE users SET level = '%d', money = '%d', kills = '%d', deaths ='%d' WHERE id = '%d'",
    PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);




    //Das Query wird abgesendet
    mysql_pquery(handle, query);
    return 1;


    bekomme keine errors nichts aber er ändert nichts in der db wenn ich in der db aber geld auf 20k setze bekommt es der spieler
    finde den fehler nicht

  • Hast du mal versucht
    PlayerInfo[playerid][pMoney]
    in dem Code oben mit
    GetPlayerMoney(playerid)
    zu ersetzen?


    Alternativ kannst du dort wo du dem Spieler mit GivePlayerMoney das Geld gibst auch
    PlayerInfo[playerid][pMoney] += betrag;
    hinschreiben.

  • Das PlayerInfo[playerid][pMoney] ist ja nur eine Variable, die einen Wert enthält, den du rein schreibst.
    Wenn du dort nirgends im Code - außer beim Laden - einen Wert rein schreibst, dann verändert sich der Wert auch nicht.


    Gleiches natürlich bei Kills/Deaths/..., da musst du auch an den entsprechenden Stellen die Variablen füllen, oder im Speicher-/Lade-Code mit deinen Variablen ersetzen.

  • Was geht denn hier falsch ?




    SA-MP Dedicated Server
    ----------------------
    v0.3.7-R2, (C)2005-2015 SA-MP Team


    [16:08:44] filterscripts = "" (string)
    [16:08:44]
    [16:08:44] Server Plugins
    [16:08:44] --------------
    [16:08:44] Loading plugin: nativechecker
    [16:08:44] Loaded.
    [16:08:44] Loading plugin: mysql
    [16:08:44] >> plugin.mysql: R39-3 successfully loaded.
    [16:08:44] Loaded.
    [16:08:44] Loaded 2 plugins.


    [16:08:44]
    [16:08:44] Filterscripts
    [16:08:44] ---------------
    [16:08:44] Loaded 0 filterscripts.


    [16:08:44] Error: Function not registered: 'mysql_close'
    [16:08:44] Error: Function not registered: 'mysql_format'
    [16:08:44] Error: Function not registered: 'mysql_pquery'
    [16:08:44] Error: Function not registered: 'cache_get_row_count'
    [16:08:44] Error: Function not registered: 'cache_insert_id'
    [16:08:44] Error: Function not registered: 'cache_get_field_content_int'
    [16:08:44] Error: Function not registered: 'mysql_connect'
    [16:08:44] Error: Function not registered: 'mysql_errno'
    [16:08:44] [MySQL] Verbindungsaufbau...
    [16:08:44] [MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: 1
    [16:08:44] Script[gamemodes/Untitled.amx]: Run time error 20: "Invalid index parameter (bad entry point)"
    [16:08:44] Number of vehicle models: 0
    [16:08:47] [connection] 127.0.0.1:54872 requests connection cookie.
    [16:08:48] [connection] incoming connection: 127.0.0.1:54872 id: 0
    [16:08:48] [join] Jay_Simpsons has joined the server (0:127.0.0.1)
    [16:09:00] [part] Jay_Simpsons has left the server (0:1)


    Funktionieren tut das Script nur warum die Fehler ?

  • Script[gamemodes/Untitled.amx]: Run time error 20: "Invalid index parameter (bad entry point)"


    Für diesen Fehler fehlt dir folgender Code über OnGameModeInit:


    C
    main()
    {
    	print("\n----------------------------------");
    	print(" Blank Gamemode by your name here");
    	print("----------------------------------\n");
    }

    ____________________________________________________



    C
    Error: Function not registered: 'mysql_close'
    Error: Function not registered: 'mysql_format'
    Error: Function not registered: 'mysql_pquery'
    Error: Function not registered: 'cache_get_row_count'
    Error: Function not registered: 'cache_insert_id'
    Error: Function not registered: 'cache_get_field_content_int'
    Error: Function not registered: 'mysql_connect'
    Error: Function not registered: 'mysql_errno'

    Die Funktionen gibt es in deiner MySQL Version nicht. Welche Version willst du denn verwenden? Womöglich hilft es schon, die Include sowie das Plugin einmal zu ersetzen, ggf. auch die libmysql. ;)

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen