MySQL Login/Register 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
  • Hallo, ich werde dir Heute zeigen wie du ein Login/Register System mit MySQL machst.
    Ich arbeite hier mit der MySQL Verison r34.


    Hier das Include + Plugin + libmysql.dll: mysql-r34-win.rar



    Was du alles dafür brauchst



    ■ Standart kenntnisse im Scripten
    ■ a_mysql.inc include
    ■ mysql.dll plugin
    ■ XAMPP
    ■ geduld
    ■ eine verbindung mit dem XAMPP MySQL server


    So dann fangen wir mal an...


    Als erstes müssen wir oben im Script zwei Dialoge definieren:
    #define DIALOG_LOGIN deine dialogid
    #define DIALOG_REGISTER deine dialogid


    So damit haben wir schonmal die Dialoge erstellt jetzt gehen wir nach OnPlayerConnected,
    und fragen ab ob für diesen Spieler schon ein Eintrag gemacht wurde:


    public OnPlayerConnected(playerid)
    {
    new query[164];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(query,sizeof(query),"SELECT ID FROM user WHERE Username='%s'",name);
    mysql_function_query(dbhandle,query,true,"OnUserCheck","i",playerid);
    return 1;
    }
    So und damit sagen wir der Datenbank das er die Zeile ID (SELECT ID) aus der Tabelle user (FROM user) auswählen soll wenn der Username mit
    einem Eintrag übereinstimmt (WHERE Username='%s').


    Dann haben wir mit dem befehl " mysql_function_query(dbhandle,query,true,"OnUserCheck","i",playerid); " der DB gesagt das er die Formatierte query an die DB gesendet werden soll. Mit dem " true " geben wir an ob wir etwas von der DB zurück beckommen wollen true für ja false für nein. Wenn wir dies auf true stellen müssen wir in der zeile danach ein neun public erstellen das währe in diesem fall "OnUserCheck", dann wollen wir noch die playerid dabei haben und müssen dafür dahinter ("i",playerid) eingeben.


    So jetzt sind wir soweit das wir abfragen ob der Account schon besteht oder nicht:
    public OnUserCheck(playerid)
    {
    new num_rows, num_field;
    cache_get_data(num_rows,num_field,dbhandle);
    if(num_rows==0)
    {
    //Register
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Registrierung","Willkommen auf (dein server name)\nEs wurde kein eintrag in unserer Datenbank für dich gefunden!\nUm dies zu ändern gib bitte ein Gewünschtes Passwort ein.","Registrieren","Abbrechen");
    }
    else
    {
    //Login
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Login","Willkommen auf (dein server name)\nWir haben deinen Account in unserer Datenbank Gefunden.\nUm dich einzuloggen gib bitte dein Passwort ein.","Einloggen","Abbrechen");
    }
    return 1;
    }
    So jetzt wir abgefragt ob der Account besteht oder nicht und die jeweiligen dialoge werden angezeigt.
    Mit cache_get_data(num_rows,num_field,dbhandle); fragen wir die einträge ab...
    Wenn wir das gemacht haben können wir abfragen ob ein eintrag besteht oder nicht.
    Das geht mit if(num_rows==0).
    Und wenn kein eintrag besteht öffnet sich der Register dialog und wenn er besteht der login dialog.
    Aber wir dürfen nicht vergessen ein forward erstellen:


    forward OnUserCheck(playerid);


    jetzt kommen wir zuerst zu dem register dialog und es geht weiter unter OnDialogResponse:


    if(dialogid==DIALOG_REGISTER)
    {
    if(response)
    {
    new name[MAX_PLAYER_NAME],query[164],passwort[35];
    GetPlayerName(playerid,name,sizeof(name));
    if(strlen(inputtext)>=8)
    {
    mysql_escape_string(inputtext,passwort,dbhandle);
    format(query,sizeof(query),"INSERT INTO user (Username,Passwort,Level,Geld) VALUES ('%s','%s','%i','%i'')",name,passwort,1,50000,);
    mysql_function_query(dbhandle,query,false,"","");
    SetPlayerScore(playerid,1);
    GivePlayerMoney(playerid,50000);
    sInfo[playerid][id]=cache_get_field_content_int(0,"ID",dbhandle);
    }
    else
    {
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Registrierung","Willkommen auf (dein Server name)\nEs wurde noch kein eintrag von dir in unserer Datenbank gefunden!\n Um dies zu ändern gib bitte ein Gewünschtes Passwort ein.\nDEIN PASSWORT MUSS MINDESTENS 8 ZEICHEN BEINHALTEN!!!","Registrieren","Abbrechen");
    }
    }
    else
    {
    Kick(playerid);
    }
    }


    Jetzt haben wir den Dialog fertig. Wir haben als erstes abgefragt ob der Spieler mindesten 8 zeichen als passwort genutzt hat. Dann haben wir mit mysql_escape_string ein Befehl gemacht das er abfragt ob ein Spieler der Versucht ein Command in den Dialog zu schreiben der die MySQL DB abstürzen lassen kann oder andere ähnliche dinge und sie dann entfernt. Als nächstes haben wir wieder einen Befehl an die DB gesendet das er einen Eintrag machen soll und zwar mit INSERT INTO user das er etwas in die DB user folgende spalten eintragen soll: (Username,Passwort,Level,Geld) dann müssen wir noch angeben was er in welche daten er in welche spalte eintragen soll und das geht mit VALUES ('%s','%s','%i','%i','%i') und am ende müssen wir die parameter angeben z.b. wie bei diesem " name,passwort,1,50000 "...


    Jetzt kommen wir zum Login:


    if(dialogid==DIALOG_LOGIN)
    {
    if(response)
    {
    new name[MAX_PLAYER_NAME],query[164],passwort[35];
    GetPlayerName(playerid,name,sizeof(name));
    if(strlen(inputtext)>0)
    {
    mysql_escape_string(inputtext,passwort,dbhandle);
    format(query,sizeof(query),"SELECT * FROM user WHERE Username='%s' AND Passwort='%s'",name,passwort);
    mysql_function_query(dbhandle,query,true,"OnPasswortResponse","i",playerid);
    }
    else
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Login","Willkommen auf (dein server name)\nWir haben deinen Account in unserer Datenbank Gefunden.\nUm dich einzuloggen gib bitte dein Passwort ein.\nUNGÜLTIGE EINGABE","Einloggen","Abbrechen");
    }
    }
    else
    {
    Kick(playerid);
    }
    }


    So hiermit haben wir wieder zuerst die eingabe auf Angriffe gesichert und machen wieder einen Befehl an die DB. Mit ( SELECT * ) sagen wir ihm das er aus der Tabelle user ( FROM user ) alles außwählen soll und fragen ab ob der Username mit dem Passwort übereinstimmt ( WHERE Username='%s' AND Passwort='%s' ). Dann machen wir wieder einen neuen public:


    public OnPasswortResponse(playerid)
    {
    new num_fields, num_rows;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows==1)
    {
    //Richtig
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    SetPlayerScore(playerid,cache_get_field_content_int(0,"Level",dbhandle));
    sInfo[playerid][id] = cache_get_field_content_int(0,"ID",dbhandle);
    SetPlayerScore(playerid,cache_get_field_content_int(0,"Level",dbhandle));
    GivePlayerMoney(playerid,cache_get_field_content_int(0,"Geld",dbhandle));
    }
    else
    {
    //Falsch
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Login","Willkommen auf (dein Server name)\nWir haben deinen Account in unserer Datenbank Gefunden.\nUm dich einzuloggen gib bitte dein Passwort ein.\nFALSCHES PASSWORT!!!","Einloggen","Abbrechen");
    }
    return 1;
    }
    Jetzt habe wir wieder eine abfrage mit cahce_get_data gemacht aber diesmal gilt dies nicht dafür ob ein eintrag gemacht wurde sondern ob das passwort übereinstimmt. Dann haben wir die daten aus der DB auf die daten des Spielers überschrieben das geht mit
    sInfo[playerid][Level] (das ist ein eigenes erstelltes enum) sInfo[playerid][Level][playerid] = cache_get_field_content_int(0,"Level",dbhandle);
    das ( "Level" ) steht für den Zeilen namen aus der user Tabelle ... Damit haben wir ein fertiges Login/Register System für MySQL ich hoffe das ich dir Helfen konnte und bin für weitere fragen verfügbar.


    MfG: MrMultiGamer

  • Und was hast du jetzt großartig gemacht, außer die Video-Tutorial Reihe von MrMonat niederzuschreiben ?
    Du nutzt die normale 'format' Funktion und escapest strings manuel, obwohl du genau so gut 'mysql_format' benutzen kannst.
    Wieso 'mysql_function_query' und nicht 'mysql_tquery' ?
    Du gettest den Namen der Spieler mehrmals, anstatt ihn einmalig in einer globalen Variable zu speichern.

  • Dann kann er doch auch gleich mysql_pquery benutzen :thumbup:

    Und was hast du jetzt großartig gemacht, außer die Video-Tutorial Reihe von MrMonat niederzuschreiben ?
    Du nutzt die normale 'format' Funktion und escapest strings manuel, obwohl du genau so gut 'mysql_format' benutzen kannst.
    Wieso 'mysql_function_query' und nicht 'mysql_tquery' ?
    Du gettest den Namen der Spieler mehrmals, anstatt ihn einmalig in einer globalen Variable zu speichern.