MySQL Accountsystem - Probleme

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 nach einer langen Pause wollte ich wieder Anfangen mit einem kleinem Gamemode,
    ich habe das Tutorial von MrPawn verwendet (LINK) ich habe eigentlich alles so geschrieben
    wie er, leichte Optimierungen durch andere Forum User. Nun wenn ich auf den Server join
    kommt kein Dialog es kommt einfach nichts da es noch ein Blank Script ist kann ich einfach auf
    Spawn klicken und es tut sich nichts kein Dialog kein garnichts..


    Ich vermute es liegt an der Datenbank Verbindung da ich so lange nichts mehr damit am Hut hatte
    weis ich aber auch nicht mehr genau wo da jetzt das Problem ist.



    //EDIT1 (MySQL Daten hinzugefügt)

    /* MySQL */
    #define MYSQL_HOST "127.0.0.1"
    #define MYSQL_USER "root"
    #define MYSQL_DATA "samp"
    #define MYSQL_PASS ""

    //EDIT2 (Enum und Datenbank hinzugefügt)

    enum PD {
    pEingeloggt,
    pGeld,
    pLevel,
    };
    new pInfo[MAX_PLAYERS][PD];


    - heftig abhängig von Karli Kugelblitz Choco Drinks

    Einmal editiert, zuletzt von Pride ()

  • Zitat

    [18:12:08] [WARNING] CMySQLHandle::Create - connection already exists


    Du hast bereits eine Verbindung zur Datenbank, du musst nicht nochmal eine machen. Daher wird wohl auch das Query nicht, oder nicht korrekt abgesendet. Prüfe das mal, die Warnung sollte auf jeden Fall nicht kommen.

  • Ich habe gerade den ganzen Server noch mal geschlossen und gestartet nun die Log.


    Wieder

    Code
    [WARNING] CMySQLHandle::Create - connection already exists


    und eine Verbindung wird doch hier erstellt oder liege ich dort Falsch?
    //EDIT PWN Code berichtigt.

    public OnGameModeInit()
    {
    DisableInteriorEnterExits();
    ShowNameTags(1);
    EnableStuntBonusForAll(0);
    SetGameModeText("Roleplay Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    Handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATA, MYSQL_PASS);
    if(mysql_errno() < 1)print("MySQL: Die Verbindung wurde erfolgreich hergestellt."),mysql_log(LOG_ALL); else print("MySQL: Die Verbindung zur MySQL Datenbank konnte nicht hergestellt werden | Der Server wird nun heruntergefahren."), SendRconCommand("exit");
    return 1;
    }

    Demnach müsste doch nur eine Verbindung erstellt werden weil nirgendswo anders im Script ist mysql_connect.

    - heftig abhängig von Karli Kugelblitz Choco Drinks

    2 Mal editiert, zuletzt von Pride ()

  • Du baust nach dem mysql_tquery die Verbindung erst auf? Das scheint nicht richtig.
    Hast du vielleicht in einem anderen geladenen Code noch ein mysql_connect das ausgeführt wird?


    Alternativ kannst du in diesem Code auch das mysql_connect komplett entfernen und einfach die Connection ID 1 verwenden, die scheint ja zu existieren.
    Also:
    new MySQL = 1;
    mysql_tquery(MySQL, //etc...);

  • Das ist mir jetzt ein wenig peinlich diese Worte in meine Tastatur reinzuhauen aber ich habe bei.. ach seh selbst :D

    public OnPlayerRequestClass(playerid, classid)
    {
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    Handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATA, MYSQL_PASS);
    if(mysql_errno() < 1)print("MySQL: Die Verbindung wurde erfolgreich hergestellt."),mysql_log(LOG_ALL); else print("MySQL: Die Verbindung zur MySQL Datenbank konnte nicht hergestellt werden | Der Server wird nun heruntergefahren."), SendRconCommand("exit");
    return 1;
    }


    Nun habe ich es dort entfernt und bei OnGameModeInit eingefügt... doch wenn ich auf dem Server join wieder nichts..


    MySQL Log:

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Werde jetzt wahrscheinlich für ne halbe Stunde nicht antworten bin Essen aber noch eins jetzt bekomme ich ein Dialog kann auch ein PW eingeben und oben steht auch "Dein Account wurde erstellt." nur wenn ich dann ausmache und in die Datenbank schaue steht da kein Eintrag hier mal die Log.


    Ich bereue die Script Pause.. soviele Fragen in meinem Kopf :D

    - heftig abhängig von Karli Kugelblitz Choco Drinks

    3 Mal editiert, zuletzt von Pride ()


  • if(dialogid == DIALOG_REGISTER)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    if(strlen(inputtext) < 4)return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Anmeldung", "Dein Passwort ist zu kurz!", "Anmelden", "Abbrechen");
    new query[256], key[50], name[MAX_PLAYER_NAME];
    format(key, sizeof(key), inputtext);
    mysql_escape_string(Spielername(playerid), name);
    mysql_escape_string(key, key);
    format(query, sizeof(query), "INSERT INTO (username, passwort) VALUES ('%s',MD5('%s'))", name, key);
    mysql_tquery(Handle, query);
    SendClientMessage(playerid, 0xFFFFFFFF, "Dein Account wurde erstellt.");
    GivePlayerMoney(playerid, 50000);
    SetPlayerScore(playerid, 10);
    }

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Ah, siehste, noch ein Fehler.
    Ich ändere das gleich in meinem Post in dem Tutorial. EDIT: Geändert.


    format(query, sizeof(query), "INSERT INTO (username, passwort) VALUES ('%s',MD5('%s'))", name, key);
    zu:
    format(query, sizeof(query), "INSERT INTO user (username, passwort) VALUES ('%s',MD5('%s'))", name, key);

  • Meine Schuld wenn ich nur C & P mache und du solltest eventuell 'passwort' mit 'd' (password) schreiben sonst kommen da noch mehr fragen auf. ^^
    Weil in dem Tutorial von MrPawn immer 'password' verwendet wird.
    Ich teste es mal eben..

    - heftig abhängig von Karli Kugelblitz Choco Drinks

    Einmal editiert, zuletzt von Pride ()

  • Meine Schuld wenn ich nur C & P mache und du solltest eventuell 'passwort' mit 'd' (password) schreiben sonst kommen da noch mehr fragen auf. ^^


    Kein Problem. Im Gegenteil, das ist gut, so finden wir alle restlichen Fehler. Sollte jetzt aber passen.
    Er hat nur einmal "password" verwendet, sonst immer "passwort", in den Queries zumindest, daher habe ich es zu "passwort" geändert.

  • Er hat nur einmal "password" verwendet, sonst immer "passwort"


    Bin ja schon still :p


    Wenn ich jetzt auf den Server komme kann ich mich mit dem Dialog registrieren es wird auch ein Eintrag in der Datenbank gemacht nun reloggte ich um zu
    testen ob ich mich jetzt anmelden muss aber nein, ich muss mir wieder ein Acc. erstellen.



    public OnPlayerConnect(playerid)
    {
    new query[256];
    format(query, sizeof(query), "SELECT * FROM user WHERE username='%e'", Spielername(playerid));
    mysql_tquery(Handle, query, "UserCheck", "i", playerid);
    ClearChat(playerid);
    return 1;
    }


    stock Spielername(playerid)
    {
    new name[24];
    GetPlayerName(playerid, name, 24);
    return name;
    }


    forward UserCheck(playerid);
    public UserCheck(playerid)
    {
    new num_rows, num_fields;
    cache_get_data(num_rows, num_fields, Handle);
    if(num_rows == 0)
    {
    //Register..
    ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Neuanfang", "Herzlich willkommen, auf unserem Server\nBitte erstelle nun ein neuen Charakter.", "Anmelden", "Abbrechen");
    }
    else
    {
    //Login..
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Dein Charakter wartet schon auf dich, los logg dich ein.", "Anmelden", "Abbrechen");
    }
    }

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Bin ja schon still :p


    War keine Kritik gegen dich, nur eine generelle Anmerkung warum ich es gemacht habe. Ich begründe meine Aktionen immer um Fragen zu vermeiden. ;)


    Ändere:
    format(query, sizeof(query), "SELECT * FROM user WHERE username='%e'", Spielername(playerid));
    zu:
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e'", Spielername(playerid));

  • Hab ich auch nicht als Kritik aufgefasst wollte nur den Unterhaltungs Wert heben da meine beiden Monitore voll mit Script Sprache sind :D


    Noch ne Frage ist das noch aktuell mit dem

    Code
    new num_rows, num_fields;
    cache_get_data(num_rows, num_fields, Handle);


    In seinem Tutorial hat irgendwer mal als Antwort geschrieben dort gibt es schon bessere Varianten
    ich würde gern von Anfang an nur das beste lernen. ^^

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Nun wenn man vom Teufel spricht ich habe glaube ich ein Fehler in dieser Ecke.

    forward OnPasswordResponse(playerid);
    public OnPasswordResponse(playerid)
    {
    new num_fields, num_rows;
    cache_get_data(num_rows, num_fields);
    if(num_rows == 0)
    {
    //Passwort falsch..
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung - Passwort falsch", "Dein Passwort ist nicht richtig\nsolltest du es vergessen haben\nmelde dich im Forum.", "Anmelden", "Abbrechen");
    }
    else
    {
    //Passwort richtig..
    SendClientMessage(playerid,gelb, "Erfolgreich eingeloggt.");
    pInfo[playerid][pEingeloggt] = 1;
    LoadAccount(playerid);
    SpawnPlayer(playerid);
    }
    return 1;
    }


    Ich kann mich Registrieren bekomme mein "Test" Geld und "Test" Level dann logge ich mich aus doch wenn ich mich nun anmelden möchte
    kommt mein Passwort ist falsch.. Ich teste es eben nochmal mit nem neuen Acc. eventuell hab ich echt nen falsches Pw drinnen x'D
    Aber eigentlich sollte ich es richtig eingetippt haben.

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Hier einmal das Spieler speichern:

    /* Account Speichern und Laden */
    stock LoadAccount(playerid)
    {
    pInfo[playerid][pEingeloggt] = 1;
    pInfo[playerid][pGeld] = cache_get_field_content_int(0, "Geld", Handle), GivePlayerMoney(playerid, pInfo[playerid][pGeld]);
    pInfo[playerid][pLevel] = cache_get_field_content_int(0, "Level", Handle), SetPlayerScore(playerid, pInfo[playerid][pLevel]);
    pInfo[playerid][pAdmin] = cache_get_field_content_int(0, "Adminlevel", Handle), SetPlayerScore(playerid, pInfo[playerid][pAdmin]);
    return 1;
    }
    stock SpielerSpeichern(playerid)
    {
    if(!pInfo[playerid][pEingeloggt])return 1;
    new query[128];
    mysql_format(Handle, query, sizeof query, "UPDATE `users` SET `Geld`='%i',`Level`='%i',`Adminlevel`='%i' WHERE `username`='%e'",GetPlayerMoney(playerid),GetPlayerScore(playerid),pInfo[playerid][pAdmin],Spielername(playerid)),
    mysql_pquery(Handle, query, "", "");
    return 1;
    }


    Ich habe auch gerade den MD5 Code kopiert und in den Dialog als Passwort eingefügt ist auch falsch wird ja auch eigentlich wieder
    zurück ins normale Passwort gehasht aber irgendwie kann ich da eingeben was ich will es kommt immer Passwort ist falsch,
    hab es mit nem Neuen Acc. auch getestet es ist das richtige Passwort.

    - heftig abhängig von Karli Kugelblitz Choco Drinks