[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
  • Es ging eigentlich darum, dass ,,nur" vor hatte, in der Tabelle den Spieler auf online = 1 zu setzten sobald er sich eingeloggt hat.
    Da wollte ich nicht mitten in der OnPlayerConnect die MySQL Abfrage mit drinnen haben.

    Solltest du auch gar nicht. Das UPDATE-Query solltest du erst nach erfolgreichem Login absenden, somit steht das Query im public OnUserLogin, nach dem Auslesen der Caches.


    Der Code dann dort:
    new query[128];
    mysql_format(handle, query, sizeof(query), "UPDATE users SET online = 1 WHERE id = %d", PlayerInfo[playerid][p_id]);
    mysql_pquery(handle, query);

  • Solltest du auch gar nicht. Das UPDATE-Query solltest du erst nach erfolgreichem Login absenden, somit steht das Query im public OnUserLogin, nach dem Auslesen der Caches.
    Der Code dann dort:
    new query[128];mysql_format(handle, query, sizeof(query), "UPDATE users SET online = 1 WHERE id = %d", PlayerInfo[playerid][p_id]);mysql_pquery(handle, query);

    Oh tut mir leid, habe es auch erst nach erfolgreichen Login im Script stehen, hab gerade nur zu schnell gedacht und daher direkt OnPlayerConnect erwähnt.


    Super, dann hast du mir weiterhelfen! Vielen Dank für deine Zeit und Geduld, wird bestimmt nicht das letzte mal gewesen sein.


    Mach dir ein schönen Samstag, gehe jetzt erst mal Steak essen :D


    David

  • Super, dann hast du mir weiterhelfen! Vielen Dank für deine Zeit und Geduld, wird bestimmt nicht das letzte mal gewesen sein.

    Gerne! Bei Fragen einfach im entsprechenden Thread oder in der Scripting Base melden.




    Mach dir ein schönen Samstag, gehe jetzt erst mal Steak essen

    Danke, gleichfalls! Lass es dir schmecken und ess eins für mich mit! :D

  • In diesem Tutorial steckt so viel Mühe drin, das ist einfach unglaublich! Mit Abstand das beste Tutorial was ich bisher lesen durfte, es wurde einfach alles bis ins kleinste Detail perfekt erklärt :) !


    Danke Jeffry, besser hätte man es nicht machen können :good:


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Hast du diesen stock im Code stehen? Füge den ganz unten in deinem Gamemode ein:
    stock MySQL_SetupConnection(ttl = 3)
    {
    print("[MySQL] Verbindungsaufbau...");
    //mysql_log(); //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren

    handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBSE);

    //Prüfen und gegebenenfalls wiederholen
    if(mysql_errno(handle) != 0)
    {
    //Fehler im Verbindungsaufbau, prüfe ob ein weiterer Versuch gestartet werden soll
    if(ttl > 1)
    {
    //Versuche erneut eine Verbindung aufzubauen
    print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
    printf("[MySQL] Starte neuen Verbindungsversuch (TTL: %d).", ttl-1);
    return MySQL_SetupConnection(ttl-1);
    }
    else
    {
    //Abbrechen und Server schließen
    print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
    print("[MySQL] Bitte prüfen Sie die Verbindungsdaten.");
    print("[MySQL] Der Server wird heruntergefahren.");
    return SendRconCommand("exit");
    }
    }
    printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", _:handle);
    return 1;
    }

  • Hast du diesen stock im Code stehen? Füge den ganz unten in deinem Gamemode ein:
    stock MySQL_SetupConnection(ttl = 3){ print("[MySQL] Verbindungsaufbau..."); //mysql_log(); //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBSE); //Prüfen und gegebenenfalls wiederholen if(mysql_errno(handle) != 0) { //Fehler im Verbindungsaufbau, prüfe ob ein weiterer Versuch gestartet werden soll if(ttl > 1) { //Versuche erneut eine Verbindung aufzubauen print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden."); printf("[MySQL] Starte neuen Verbindungsversuch (TTL: %d).", ttl-1); return MySQL_SetupConnection(ttl-1); } else { //Abbrechen und Server schließen print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden."); print("[MySQL] Bitte prüfen Sie die Verbindungsdaten."); print("[MySQL] Der Server wird heruntergefahren."); return SendRconCommand("exit"); } } printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", _:handle); return 1;}

    Hab ich danke,


    Sehr schönes Tutorial! 10/10

  • Yo, kleine Sache die mir aufgefallen ist, kann aber auch sein das ich falsch liege (nicht getestet):


    Wir haben eine Funktion um ein Account zu speichern:



    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;
    }



    forward OnUserLogin(playerid);
    public OnUserLogin(playerid)
    {
    //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
    new rows;
    cache_get_row_count(rows);
    if(rows == 0)
    {
    //Der Spieler hat ein falsches Passwort eingegeben
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
    }
    else
    {
    //Es existiert ein Ergebnis, das heißt der Spieler hat das richtige Passwort eingegeben
    //Wir lesen nun die erste Zeile des Caches aus (ID 0)
    cache_get_value_name_int(0, "id", PlayerInfo[playerid][p_id]);
    cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
    cache_get_value_name_int(0, "money", PlayerInfo[playerid][pMoney]);
    cache_get_value_name_int(0, "kills", PlayerInfo[playerid][pKills]);
    cache_get_value_name_int(0, "deaths", PlayerInfo[playerid][pDeaths]);
    PlayerInfo[playerid][pLoggedIn] = true;
    SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt.");
    GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
    }
    return 1;
    }





    forward OnUserRegister(playerid);
    public OnUserRegister(playerid)
    {
    //Der Spieler wurde in die Datenbank eingetragen, es wird die id ausgelesen
    PlayerInfo[playerid][p_id] = cache_insert_id();
    SendClientMessage(playerid, 0x00FF00FF, "[Konto] Registration erfolgreich.");
    return 1;
    }


    Dort wird zuvor abgefragt ob der Spieler bereits eingeloggt ist.
    Die Variable wird aber nur bei OnUserLogin auf true gesetzt, bei OnUserRegister wird sie nicht auf true gesetzt.
    OnUserLogin wird aber nachdem registrieren nicht aufgerufen, also würde sich eigentlich der Account nicht speicher, richtig?
    Habe ich etwas übersehen oder falsch verstanden? Wäre komisch wenn's wirklich nicht funktionieren würde und das bisher keinem aufgefallen ist..




    @Jeffry


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Ich hab es getestet, funktioniert super!

  • Die Variable wird aber nur bei OnUserLogin auf true gesetzt, bei OnUserRegister wird sie nicht auf true gesetzt.
    OnUserLogin wird aber nachdem registrieren nicht aufgerufen, also würde sich eigentlich der Account nicht speicher, richtig?
    Habe ich etwas übersehen oder falsch verstanden? Wäre komisch wenn's wirklich nicht funktionieren würde und das bisher keinem aufgefallen ist..

    Du hast absolut Recht. Dem Code nach ist es so, dass die Statistiken, die zwischen Registration und dem ersten Verlassen des Servers liegen, nicht gespeichert werden, ich habe das gerade auch nochmal ausprobiert, ist tatsächlich so.
    Nachdem man sich per Login Funktion einloggt, gibt es keine Probleme, da speichert es normal wie es soll.
    Das ist mir beim Test des Tutorials gar nicht aufgefallen und interessanterweise auch sonst noch niemandem bisher aufgefallen.


    Das ist auf jeden Fall ein Fehler im Tutorial und auch im Beispielcode. Ich werde das morgen ausbessern.
    Vielen Dank für deinen Hinweis!




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


    EDIT:


    Das Tutorial wurde für die Version R41-2 aktualisiert.
    Außerdem wurde der von JustMe.77 gemeldete Fehler behoben.
    Der Fehler kann wie folgt im eigenen Code ausgebessert werden:
    Es muss in OnUserRegister folgende Zeile eingefügt werden:
    PlayerInfo[playerid][pLoggedIn] = true;
    Es ist dringend empfohlen, diese Korrektur im Code vorzunehmen, sofern der Spieler sich nach der Registration nicht anmelden muss.



    Bei der Aktualisierung des Plugins auf R41-2 muss der Code, bis auf oben genannte Fehlerkorrektur, nicht angepasst werden.
    Es ist lediglich zu beachten, dass von dieser Version an die libmysql.dll durch die libmariadb.dll ersetzt wurde. Diese Datei muss nach dem Download des neuen Plugins im Hauptverzeichnis des Servers ausgetauscht werden.



    Fragen zur Aktualisierung dürfen gerne in diesem Thread über die Antworten-Funktion gestellt werden.


    Viele Grüße
    Jeffry 8)

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hast du eventuell die static Version für Linux am Start? Finde bei GitHub nur die normale Linux Version.
    Hätte da noch eine weitere Frage: Muss log-core.so auch geladen werden? Ist das ein Plugin was ins Plugins Ordner muss oder kommt das ins Hauptverzeichnis @Jeffry ?


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Hast du eventuell die static Version für Linux am Start? Finde bei GitHub nur die normale Linux Version.

    Scheint jetzt wohl ausgelagert zu sein, in der "mysql-R41-2-Debian8-static.tar.gz"
    https://github.com/pBlueG/SA-MP-MySQL/releases/tag/R41-2



    Hätte da noch eine weitere Frage: Muss log-core.so auch geladen werden? Ist das ein Plugin was ins Plugins Ordner muss oder kommt das ins Hauptverzeichnis @Jeffry ?

    Ich habe kein Linux System auf dem ich das testen kann, ich gehe aber davon aus (weil es bei Windows auch so ist) dass die log-core.so in das Hauptverzeichnis des Servers muss.
    Wenn du es ausprobieren kannst, würde ich mich über eine Rückmeldung, ob dem wirklich so ist, freuen.

  • Habe das bereits versucht, es möchte einfach nicht klappen.
    Das Plugin befindet sich im Plugins Ordner und dann nochmal im Hauptverzeichnis, trotzdem wird das irgendwie nicht erkannt..



    Mit freundlichen Grüßen
    JustMe.77 8)

  • Post vom 21.05.2017:
    Oh. Dann melde dich am besten wenn du wieder zu Hause bist, damit wir eine Zeit ausmachen können.
    Falls möglich kannst du es ja bis dahin noch weiter versuchen, vielleicht findest du das Problem noch.
    Kannst die log-core ja auch mal in andere Verzeichnisse kopieren, vielleicht klappt es irgendwo, weil bisher hat es eigentlich bei allen geklappt, zumindest findet sich weder im englischen Forum noch hier ein anderer Lösungsweg, als die Datei im Hauptverzeichnis abzulegen. Außer mit Hauptverzeichnis ist bei Linux "root" gemeint? Kannst ja auch mal versuchen, oder in einem Ordner, wo die anderen Libraries drin liegen.



    __________________________________
    EDIT:


    Das Tutorial wurde an die neuste MySQL Plugin Version R41-3 angepasst.
    Es sind keine Änderungen im Code notwendig. Es müssen lediglich die Download-Dateien des Plugins entsprechend ersetzt werden, um die neue Version nutzen zu können. Danach muss der Code einmal neu kompiliert werden.


    Zusätzlich habe ich zu den Downloads noch ein Verweis auf die Include von JustMe.77 hinzugefügt: [INCLUDE] Einzigartige Login/Register TextDraws
    In den dortigen Downloads findet sich ein fertiger Filterscript, der den Code dieses Tutorials beinhaltet.
    Vielen Dank an @JustMe.77 hierfür!

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: MySQL R41-3

  • Beitrag von Emrys. ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: gelöst! ().
  • do.de - Domain-Offensive - Domains für alle und zu super Preisen