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

    • davdeveloper schrieb:

      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:

      PAWN-Quellcode

      1. new query[128];
      2. mysql_format(handle, query, sizeof(query), "UPDATE users SET online = 1 WHERE id = %d", PlayerInfo[playerid][p_id]);
      3. mysql_pquery(handle, query);
    • Jeffry schrieb:

      davdeveloper schrieb:

      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:

      PAWN-Quellcode

      1. 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
    • davdeveloper schrieb:

      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.



      davdeveloper schrieb:

      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
    • Neu

      Hast du diesen stock im Code stehen? Füge den ganz unten in deinem Gamemode ein:

      PAWN-Quellcode

      1. stock MySQL_SetupConnection(ttl = 3)
      2. {
      3. print("[MySQL] Verbindungsaufbau...");
      4. //mysql_log(); //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren
      5. handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBSE);
      6. //Prüfen und gegebenenfalls wiederholen
      7. if(mysql_errno(handle) != 0)
      8. {
      9. //Fehler im Verbindungsaufbau, prüfe ob ein weiterer Versuch gestartet werden soll
      10. if(ttl > 1)
      11. {
      12. //Versuche erneut eine Verbindung aufzubauen
      13. print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
      14. printf("[MySQL] Starte neuen Verbindungsversuch (TTL: %d).", ttl-1);
      15. return MySQL_SetupConnection(ttl-1);
      16. }
      17. else
      18. {
      19. //Abbrechen und Server schließen
      20. print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
      21. print("[MySQL] Bitte prüfen Sie die Verbindungsdaten.");
      22. print("[MySQL] Der Server wird heruntergefahren.");
      23. return SendRconCommand("exit");
      24. }
      25. }
      26. printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", _:handle);
      27. return 1;
      28. }
      Alles anzeigen
    • Neu

      Jeffry schrieb:

      Hast du diesen stock im Code stehen? Füge den ganz unten in deinem Gamemode ein:

      PAWN-Quellcode

      1. 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
    • Neu

      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:

      PAWN-Quellcode

      1. stock SaveUserStats(playerid)
      2. {
      3. //Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nicht
      4. if(!PlayerInfo[playerid][pLoggedIn]) return 1;
      5. //Ansonsten speichere sie
      6. new query[256];
      7. mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', money = '%d', kills = '%d', deaths = '%d' WHERE id = '%d'",
      8. PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);
      9. //Das Query wird abgesendet
      10. mysql_pquery(handle, query);
      11. return 1;
      12. }
      Alles anzeigen


      PAWN-Quellcode

      1. forward OnUserLogin(playerid);
      2. public OnUserLogin(playerid)
      3. {
      4. //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
      5. new rows;
      6. cache_get_row_count(rows);
      7. if(rows == 0)
      8. {
      9. //Der Spieler hat ein falsches Passwort eingegeben
      10. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
      11. }
      12. else
      13. {
      14. //Es existiert ein Ergebnis, das heißt der Spieler hat das richtige Passwort eingegeben
      15. //Wir lesen nun die erste Zeile des Caches aus (ID 0)
      16. cache_get_value_name_int(0, "id", PlayerInfo[playerid][p_id]);
      17. cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
      18. cache_get_value_name_int(0, "money", PlayerInfo[playerid][pMoney]);
      19. cache_get_value_name_int(0, "kills", PlayerInfo[playerid][pKills]);
      20. cache_get_value_name_int(0, "deaths", PlayerInfo[playerid][pDeaths]);
      21. PlayerInfo[playerid][pLoggedIn] = true;
      22. SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt.");
      23. GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
      24. }
      25. return 1;
      26. }
      Alles anzeigen



      PAWN-Quellcode

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


      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 :)
    • Neu

      JustMe.77 schrieb:

      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:

      PAWN-Quellcode

      1. stock SaveUserStats(playerid){//Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nichtif(!PlayerInfo[playerid][pLoggedIn]) return 1;//Ansonsten speichere sienew 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 abgesendetmysql_pquery(handle, query);return 1;}


      PAWN-Quellcode

      1. forward OnUserLogin(playerid);public OnUserLogin(playerid){//Query wurde ausgeführt und das Ergebnis im Cache gespeichertnew rows;cache_get_row_count(rows);if(rows == 0){//Der Spieler hat ein falsches Passwort eingegebenShowPlayerDialog(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;}



      PAWN-Quellcode

      1. forward OnUserRegister(playerid);public OnUserRegister(playerid){//Der Spieler wurde in die Datenbank eingetragen, es wird die id ausgelesenPlayerInfo[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
      Ich hab es getestet, funktioniert super!
    • Neu

      JustMe.77 schrieb:

      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:

      PAWN-Quellcode

      1. 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)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jeffry ()


    • Neu

      JustMe.77 schrieb:

      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"
      github.com/pBlueG/SA-MP-MySQL/releases/tag/R41-2


      JustMe.77 schrieb:

      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.
    • Neu

      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..

      Spoiler anzeigen



      ----------
      Loaded log file: "server_log.txt".
      ----------


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


      [11:22:55] filterscripts = "" (string)
      [11:22:55]
      [11:22:55] Server Plugins
      [11:22:55] --------------
      [11:22:55] Loading plugin: mysql.so
      [11:22:55] Failed (log-core.so: cannot open shared object file: No such file or directory)
      [11:22:55] Loading plugin: crashdetect.so
      [11:22:55] CrashDetect v4.15.1 is OK.
      [11:22:55] Loaded.
      [11:22:55] Loading plugin: SKY.so
      [11:22:55] Loaded.
      [11:22:55] Loading plugin: sscanf.so
      [11:22:55]


      [11:22:55] ===============================


      [11:22:55] sscanf plugin loaded.


      [11:22:55] Version: 2.8.2


      [11:22:55] (c) 2012 Alex "Y_Less" Cole


      [11:22:55] ===============================


      [11:22:55] Loaded.
      [11:22:55] Loading plugin: nativechecker.so
      [11:22:55] Loaded.
      [11:22:55] Loaded 4 plugins.


      [11:22:56]
      [11:22:56] Filterscripts
      [11:22:56] ---------------
      [11:22:56] Loaded 0 filterscripts.


      [11:22:56] Error: Function not registered: 'mysql_close'
      [11:22:56] Error: Function not registered: 'mysql_format'
      [11:22:56] Error: Function not registered: 'mysql_pquery'
      [11:22:56] Error: Function not registered: 'cache_get_row_count'
      [11:22:56] Error: Function not registered: 'cache_insert_id'
      [11:22:56] Error: Function not registered: 'cache_get_value_name_int'
      [11:22:56] Error: Function not registered: 'mysql_connect'
      [11:22:56] Error: Function not registered: 'mysql_errno'
      [11:22:56] [debug] Run time error 19: "File or function is not found"
      [11:22:56] [debug] mysql_close
      [11:22:56] [debug] mysql_format
      [11:22:56] [debug] mysql_pquery
      [11:22:56] [debug] cache_get_row_count
      [11:22:56] [debug] cache_insert_id
      [11:22:56] [debug] cache_get_value_name_int
      [11:22:56] [debug] mysql_connect
      [11:22:56] [debug] mysql_errno
      [11:22:56] [debug] Run time error 19: "File or function is not found"
      [11:22:56] [debug] mysql_close
      [11:22:56] [debug] mysql_format
      [11:22:56] [debug] mysql_pquery
      [11:22:56] [debug] cache_get_row_count
      [11:22:56] [debug] cache_insert_id
      [11:22:56] [debug] cache_get_value_name_int
      [11:22:56] [debug] mysql_connect
      [11:22:56] [debug] mysql_errno
      [11:22:56] Script[gamemodes/wonderland.amx]: Run time error 19: "File or function is not found"
      [11:22:56] Number of vehicle models: 0

      Mit freundlichen Grüßen
      JustMe.77 :)
    • Neu

      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.