MySQL (Installation, Zugriff, Einstellungen, Login & Register Beispiel)

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
  • Heyho. Heute möchte ich euch mal erklären wie man mit MySQL bei Pawn arbeitet, in dem ich euch erkläre wie man ein kleines Login & Register System bastelt das auf MySQL basiert :)


    1. Was ist MySQL, und warum sollte ich das benutzen?
    MySQL steht für My Structured Query Language, was auf deutsch so viel heißt wie Strukturierte Abfragesprache. Strukturiert deshalb, weil es sich dabei ganz einfach um ein Tabellen System handelt. Das heißt ihr Speichert alle Daten in einer unbegrenzt* großen Tabelle bzw. in unbegrenzt* vielen Tabellen, und könnt jeden wert so wie ihr es wollt abfragen, ändern, löschen etc.. Zudem ist es auch sehr übersichtlich ;)
    Mal als kleines Beispiel:
    So sieht z.b eine Spieler Datei aus wenn man per ini speichert:

    Code
    Name: Maddin
    Level: 1
    Geld: 50000
    Kills: 5
    Tode: 3
    Health: 100.0


    Und bei MySQL Sieht das dann so aus:
    [table=6]
    [*]Name
    [*]Level
    [*]Geld
    [*]Kills
    [*]Tode
    [*]Health


    [*]Maddin
    [*]1
    [*]50000
    [*]5
    [*]3
    [*]100.0


    [*]Hans
    [*]2
    [*]100000
    [*]50
    [*]31
    [*]100.0


    [*]Peter
    [*]1
    [*]500
    [*]1
    [*]100
    [*]100.0
    [/table]


    Wie ihr seht wird bei MySQL eine einfache Tabelle angelegt, und es werden direkt alle Spieler untereinander gespeichert und nicht wie bei ini das man für jeden Spieler eine eigene Datei erstellen muss. Das ist auch äußerst praktisch wenn man zum Beispiel mal nachsehen will wer alles Admin Rechte hat, was ja bei ini etwas schwierig wird da man jede Datei einzeln öffnen muss.
    Ok, jetzt solltet ihr ungefähr wissen wie es funktioniert. Aber warum das ganze? Ich mein, mein Script läuft gut mit ini und da jetzt 100 Sachen um zu Scripten ist mir viel zu viel Arbeit...


    Die Frage lässt sich ganz gut mit stichworten beantworten.
    MySQL ist

    • Schneller als die ganzen File Systems (dini, fini, SSI etc.)
    • Übersichtlicher und leichter zu kontrollieren wenn etwas nicht stimmt
    • Extern!


    Extern? Ja genau, extern. MySQL wird auf einer MySQL-Datenbank gespeichert, welche sich auch extern bearbeiten lässt. Das heißt wenn ihr bei den Meisten Hostern nur zugriff über Web-FTP auf eure Dateien habt, könnt ihr MySQL auch über Programme die auf eurem PC installiert sind bearbeiten. Zudem gibt es auch viele andere Programmier- sprachen die auf MySQL zugreifen können. So könnt ihr zum Beispiel ein Control Panel per php erstellen was die Werte aus der Datenbank auslesen kann, ohne das diese auf dem Gleichen Server sein muss wie eurer Web Server. Aber das ist auch schon wieder eine andere Geschichte und darum gehts hier ja erst mal nicht ;)


    2. Installation von MySQL
    Dieser schritt bezieht sich nur darauf, wenn ihr MySQL (zum Beispiel zum testen) auf eurem localen PC installieren wollt. Auf den meisten Servern ist es schon vor installiert (und wenn nicht einfach bei eurem Hoster nachfragen).
    Als erstes müsst ihr dafür einen Localen MySQL Server erstellen. Das geht z.b ganz gut mit XAMPP. Wie ihr XAMPP Installiert wird hier gut erklärt, weshalb ich da hier nicht weiter drauf eingehen werde.
    Habt ihr den MySQL Server gestartet müsst ihr nun irgendwie auf die Datenbank zugreifen. Dafür gibt es mehrere Möglichkeiten. Zum einen Über euren Web Browser per phphmyadmin, zum anderen über Programme. Ich bevorzuge das ganze mit einem Programm zu machen, da es dort übersichtlicher ist und für Anfänger sicherlich auch einfacher. Das Programm nennt sich Navicat und ist als Lite Version auch Kostenlos verfügbar. Lasst euch von dem "Lite" nicht abschrecken, das reicht für unsere Bedürfnisse völlig aus ;)


    Ok, nun haben wir einen MySQL Server und ein Programm um darauf zuzugreifen. Aber was nun? Jetzt werden wir als erstes das Programm mit dem Server verbinden.
    Dafür öffnet ihr das Programm, geht oben auf File -> new Connection -> MySQL...
    Nun öffnet sich ein Fenster wo ihr Sachen eintragen müsst. Als erstes der Connection Name. Hier könnt ihr eurer Fantasie freien lauf lassen und Theoretisch rein schreiben was ihr wollt. Der Name ist dafür da um später im Programm die Datenbank wieder zu finden, da sie unter diesem nahmen gespeichert wird.
    Jetzt Host name/IP adress: Hier müsst ihr localhost rein schreiben, da ihr ja auf euren localen Server connecten wollt. Wenn ihr später auf die Datenbank eures Servers zugreifen wollt muss da natürlich eine andere Adresse rein. Der Port sollte 3306 sein. User Name ist der "Benutzername" der auf die Datenbank zugriff hat. Ihr könnt später auch mehrere Benutzer erstellen die dann zugriff haben. in unserem falle ist der Username root, und das Passwort wird leer gelassen da Standart mäßig kein Passwort eingestellt ist. Solltet ihr eins eingestellt haben werdet ihr es ja selbst wissen^^


    So, nun seid ihr mit dem MySQL Server verbunden. Aber es ist keine Datenbank da. Deshalb werden wir diese jetzt erstellen. Als erstes macht ihr Links im Programm einen Doppelklick auf eure Datenbank (erkennt ihr an dem Namen den ihr eingestellt habt). Nun sollte euch eine Datenbank angezeigt werden die information_schema heißt. Von der lasst ihr bitte die Finger! Nun macht ihr rechts klick z.b unter die Datenbank (Hauptsache in ein leeres Feld) und wählt dann New Database. Nun öffnet sich wieder ein Fenster wo ihr den Namen der Datenbank einstellen müsst. Diesen könnt ihr auch wieder frei wählen, nehmt aber am besten einen Namen den ihr auch wieder findet und den Ihr zuordnen könnt. Also so was wie SAMP_DB oder GTA_DB. Die anderen Felder lasst ihr so wie sie sind und Drück dann auf Ok. Und schon habt ihr eine Datenbank.


    3. Erstellen einer Tabelle
    So. Nun fehlt uns nur noch eine Tabelle in der wir die Spieler speichern. Dafür machen wir Doppelklick auf unsere gerade erstelle Datenbank, und finden nun auf der Rechten Seite ein leeres Fenster vor. In dieses leere Fenster macht ihr nun Rechtsklick, und wählt Execute SQL FIle und es erscheint ein neues Fenster. In diesem Fenster klickt ihr dann auf den Button mit den 3 Punkten und Wählt dann die Datei Database.sql aus die ich am ende des Thread angehängt habe und drückt dann auf Start. Sollte alles richtig sein steht in dem Fenster dann

    Code
    [Msg] Finished - 2 queries executed successfully
    --------------------------------------------------


    Dann klickt ihr auf Close. Sollte das rechte Feld immer noch leer sein einfach rechts klick und Refresh klicken.Das sollte dann so aussehen:

    Nun seht ihr eure erste Tabelle mit dem Namen accounts, wo ihr jetzt rechts klick drauf macht und dann auf Design Table klickt. Nun öffnet sich ein Fenster wo ich euch erklären kann wie genau das aufgebaut ist, damit ihr später auch neue Felder dazu machen könnt.
    Das ganze Sollte nun so aussehen:

    Die erste ziele ist die Auto Increment Spalte. Diese lassen wir so wie sie ist, da diese immer einen festen wert hat den wir nicht verändern.
    In der nächste Zeile sehen wir den Namen. Name Steht für den Namen der Spalte. varchar sagt aus was für ein wert es ist. Normalerweise arbeiten wir mit int, varchar und float.
    int = Integer (also eine Zahl)
    varchar = string (also eine Zeichenkette, wie z.b ein Name oder ein Passwort)
    float = ein Float wert (also eine zahl mit nachkomma stellen)
    in unserem Fall ist es also varchar, also ein string. Als nächstes kommt die Länge. Da wir ja aus Pawno wissen das ein Name Maximal 24 Zeichen lang sein kann, ist in unserem falle das Feld auf 24 Zeichen groß. Der Rest ist für uns eigentlich unwichtig.
    das gleiche ist nun auch bei den anderen Feldern, nur das dort dann halt int für Integer, also eine Zahl, oder float für einen Float wert steht.


    So. Damit hätten wir erst mal unsere Datenbank fertig eingerichtet. Nun folgt der Skript teil.


    4. Download & Installation des MySQL Plugins
    So, nun haben wir eine Datenbank mit der wir arbeiten können. Aber was uns noch fehlt ist ein MySQL fähiges Skript. Also fangen wir mit dem Installieren des Plugin an.
    Alles was ich in diesem Tutorial erkläre bezieht sich auf das MySQL Plugin R5 von G-sTyLeZzZ, wenn ihr also das von StrickenKid benutzt kann ich nicht dafür garantieren dass das auch so funktioniert.
    Also brauchen wir nun folgende Dinge:
    R5: Server Plugin (VS9)
    und
    libmysql.dll


    Die libmysql.dll Datei kommt in den gleichen Ordner wo auch eure samp-server.exe Datei ist.

    Die a_mysql.inc Datei kommt in euren pawno/includes Ordner zu den anderen Includes.

    Und die mysql.dll Datei kommt in euren plugins Ordner.

    Zu guter Letzt öffnen wir die Server.cfg Datei und fügen die Zeile "plugins mysql" hinzu, falls noch nicht vorhanden. Solltet ihr schon ein Plugin benutzen einfach mysql dazu schreiben und beides durch ein Leerzeichen trennen.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

    7 Mal editiert, zuletzt von maddin () aus folgendem Grund: Siehe 3. Post

  • 5. Der Skript Teil
    Jetzt geht es ans Skript. Also öffnen wir Pawno, erstellen ein Neues Skript und Entfernen erst mal den Filterscirpt Teil da wir ja einen Gamemode machen.
    Ganz oben ins Script kommt erst mal die include, also fügen wir unter die Zeile #include <a_samp> folgendes Hinzu:


    #include <a_mysql>
    #define SQL_HOST "127.0.0.1"
    #define SQL_USER "root"
    #define SQL_PASS ""
    #define SQL_DATA "samp_db"
    #define DIALOG_REGISTER (1)
    #define DIALOG_LOGIN (2)


    enum SpielerDaten
    {
    pName[MAX_PLAYER_NAME],
    pLevel,
    pGeld,
    pKills,
    pTode,
    Float:pHealth
    }
    new SpielerInfo[MAX_PLAYERS][SpielerDaten];


    Kurtze erklärung:
    #include <a_mysql> sollte wohl klar sein, das ist unsere mysql include die wir brauchen.
    SQL_HOST ist der host, also die IP Adresse der Datenbank auf die wir zugreifen wollen. Da wir erst mal nur mit unserem lokalen MySQL Server arbeiten schreiben wir da "127.0.0.1" rein.
    SQL_USER ist der Username der Zugriff auf die MySQL Datenbank hat. In unserem falle war das der user "root". Solltet ihr einen anderen erstellt haben müsst ihr diesen natürlich dort eintragen.
    SQL_PASS ist das Passwort das zu dem angegebenen Usernamen passt. Standardmäßig hatten wir ja kein Passwort eingestellt, weshalb wir dort nichts rein schreiben.
    SQL_DATA ist die Datenbank die wir erstellt haben. Da ich nicht weiß wie ihr eure genannt habt, nehme ich den Namen den ich ihr im Tutorial gegeben habe. Ihr müsst das natürlich entsprechend abändern.


    Die Anderen beiden defines sind unsere Dialoge die wir für den Login und das Registrieren brauchen.
    Dazu kommt noch das enum für die Spieler Daten, denn wir werden nur beim Login und Verlassen des Servers die Datenbank verändern. Alles andere wird über variablen geregelt.


    Nun geht ihr weiter zu
    public OnGameModeInit()
    und schreibt dort folgendes rein:
    Connect_To_Database();
    Diese Funktion werden wir benutzen um auf unsere Datenbank zu verbinden. Die Funktion selbst erstellen wir jetzt. Dafür Scrollt ihr ganz nach unten ins Script und fügt dort folgendes ein:
    stock Connect_To_Database()
    {
    mysql_connect(SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS); //Wir versuchen mit den Angaben die wir oben im Script gemacht haben uns mit dem MySQL Server zu verbinden.
    if(mysql_ping() == 1) //Es wird überprüft ob die Verbindung steht.
    {
    //Falls ja wird das in die Console geschrieben und die Funktion wird beendet.
    print("<-| [MYSQL] Verbindung zur Datenbank wurde erfolgreich hergestellt!");
    return true;
    }
    else
    {
    //Falls nicht wird erneut versucht eine Verbindung aufzubauen.
    print("<-| [MYSQL] Es konnte keine Verbindung zur Datenbank hergestellt werden!");
    print("<-| [MYSQL] Es wird erneut versucht eine Verbindung zur Datenbank herzustellen!");
    mysql_connect(SQL_HOST, SQL_USER, SQL_DATA, SQL_PASS);
    if(mysql_ping() == 1)
    {
    print("<-| [MYSQL] Es konnte im 2 Versuch eine Verbindung hergestellt werden!");
    return true;
    }
    else
    {
    //Falls das auch nicht Funktioniert wird der Server zur Sicherheit wieder heruntergefahren.
    print("<-| [MYSQL] Es konnte keine Verbindung zur Datenbank hergestellt werden!");
    print("<-| [MYSQL] Der Server wird nun beendet!");
    SendRconCommand("exit");
    return true;
    }
    }
    }


    Nun sind wir, theoretisch jedenfalls, mit der Datenbank verbunden. Aber was nun? Nun gehen wir zu
    public OnPlayerRequestClass(playerid, classid)
    Um unsere Login/Register Abfrage zu machen.
    public OnPlayerRequestClass(playerid, classid)
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 0) //Als erstes fragen wir ab ob der Spieler schon eingeloggt ist oder nicht, damit wir nicht bei jeder Skin Auswahl uns neu Einloggen müssen.
    {
    if(mysql_CheckAccount(playerid) == 0)//Wir überprüfen ob der Account Existiert, falls nicht Zeigen wir den Dialog zum Registrieren.
    {
    SendClientMessage(playerid, 0xFFFFFFFF,"________-> Willkommen auf auf meinem Server <-________");
    SendClientMessage(playerid, 0xFFFFFFFF,"Dein Account wurde nicht gefunden, bitte Registriere dich!");
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Register","Bitte Gib ein Passwort an:","Register","Exit");
    }
    else if(mysql_CheckAccount(playerid) == 1)//Falls doch zeigen wir den Dialog zum Einloggen.
    {
    SendClientMessage(playerid, 0xFFFFFFFF,"________-> Willkommen auf auf meinem Server <-________");
    SendClientMessage(playerid, 0xFFFFFFFF,"Dein Account wurde gefunden, bitte Log dich nun ein!");
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Bitte gib dein Passwort ein:","Login","Abbrechen");
    }
    }
    return 1;
    }


    Da die Funktion mysql_CheckAccount(playerid) nicht standardmäßig existiert, werden wir diese nun auch erstellen. Dafür gehen wir wieder nach unten ins Skript, und fügen folgendes Hinzu:
    stock mysql_CheckAccount(playerid)
    {
    new Query[128],Name[MAX_PLAYER_NAME],count;
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    mysql_real_escape_string(Name, Name);
    format(Query, sizeof(Query), "SELECT * FROM `accounts` WHERE `Name` = '%s'", Name);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    return count;
    }
    Diese Funktion gibt 0 Zurück wenn kein Account mit dem Angegebenen Namen existiert, und 1 Wenn er schon existiert.


    Nun gehen wir zu OnDialogResponse um unseren Login/Register Dialog fertig zu stellen.
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch(dialogid)
    {
    case DIALOG_REGISTER:
    {
    if(response)
    {
    if(strlen(inputtext) == 0) // Wenn kein Passwort angegebene wurde
    {
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Register","Das angegebene Passwort war zu Kurz...\nBitte Registrier dich jetzt mit einem Passwort:","Register","Abbrechen");
    return 1;
    }
    else
    {
    CreateAccount(playerid, inputtext); //Account wird erstellt
    SetPVarInt(playerid,"Eingeloggt",1); //Die variable wird auf 1 gesetzt, damit wir nun die Skin Auswahl benutzen können ohne wieder nach unserem Passwort gefragt zu werden.
    SpawnPlayer(playerid); //Wir lassen den Spieler Spawnen
    return 1;
    }
    }
    else
    {
    Kick(playerid); //Wenn auf Abbrechen geklickt wurde, wird der Spieler gekickt damit man ohne Account nicht Spielen kann.
    }
    }
    case DIALOG_LOGIN:
    {
    if(response)
    {
    if(strlen(inputtext) == 0) // Wenn kein Passwort angegebene wurde
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Das Angegebene Passwort war Falsch.\nBitte log dich jetzt mit dem richtigen Passwort ein:","Login","Abbrechen");
    return 1;
    }
    else
    {
    new SpielerName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, SpielerName, MAX_PLAYER_NAME);
    if(!strcmp(inputtext, mysql_ReturnPasswort(SpielerName), true)) // Wir holen uns das Passwort aus der MySQL Datenbank und überprüfen es mit dem angegebenen passwort.
    {
    SetPVarInt(playerid,"Eingeloggt",1); //Falls beide passwörter übereinstimmen wird die Variable auf 1 gesetzt damit wir die Skin auswahl benutzen können.
    LoadPlayer(playerid); //Der Spieler wird "geladen", speich es werden seine Daten aus der Datenbank geholt und in variablen gespeichert um diese im Skript zu verwenden.
    SpawnPlayer(playerid); //Wir lassen den Spieler Spawnen
    return 1;
    }
    else
    {
    //Wenn das Passwort falsch war, lassen wir erneut das Login fenster erscheinen damit der Spieler das Richtige Passwort eingibt.
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Das war das Falsche Passwort.\nBitte log dich jetzt mit dem richtigen Passwort ein:","Login","Abbrechen");
    return 1;
    }
    }
    }
    else
    {
    Kick(playerid); //Wenn auf Abbrechen geklickt wurde, wird der Spieler gekickt damit man ohne Account nicht Spielen kann.
    }
    }
    }
    return 1;
    }
    Wer jetzt versucht das ganze zu Compilen, sollte 3 Fehlermeldungen bekommen:

    Code
    undefined symbol "CreateAccount"
    undefined symbol "mysql_ReturnPasswort"
    undefined symbol "LoadPlayer"


    Das liegt daran, das diese drei Funktionen (noch) nicht existieren, was wir nun ändern werden. Dafür gehen wir wieder Ganz nach unten ins Script und fügen folgendes ein:
    stock CreateAccount(playerid, pass[])
    {
    new query[256],Name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    mysql_real_escape_string(Name,Name);
    mysql_real_escape_string(pass,pass);
    format(query, sizeof(query), "INSERT INTO `accounts` (`Name`, `Passwort`) VALUES ('%s', '%s')", Name, pass);
    mysql_query(query);
    return true;
    }
    Mit dieser Fuktion erstellen wir einen Account mit angegebenen Namen und Passwort in unserer Datenbank.
    stock mysql_ReturnPasswort(Name[])
    {
    new query[130], Get[130];
    mysql_real_escape_string(Name, Name);
    format(query, 128, "SELECT `passwort` FROM `accounts` WHERE `Name` = '%s'", Name);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(Get);
    mysql_free_result();
    return Get;
    }
    Mit der Funktion holen wir uns das Passwort aus der Datenbank, um es mit dem Angegebenen zu überprüfen.


    Nun fehlt noch LoadPlayer(playerid), womit wir die Daten aus der MySQL Datenbank raus suchen und diese in unseren variablen Speichern.
    stock LoadPlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))//Wir fragen ab ob der angegebene Spieler auch Online ist, und kein NPC ist (nur zur sicherhheit)
    {
    GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME); //Wir Speichern den Namen des Spielers in der Variable [i]SpielerInfo[playerid][pName][/i]
    SpielerInfo[playerid][pLevel] = mysql_GetInt("accounts", "Level", "Name", SpielerInfo[playerid][pName]); //Wir holen uns den wert der unter "Level" eingetragen ist und Speichern ihn in unserer Variable.
    SpielerInfo[playerid][pGeld] = mysql_GetInt("accounts", "Geld", "Name", SpielerInfo[playerid][pName]); //Wir holen uns den wert der unter "Geld" eingetragen ist und Speichern ihn in unserer Variable.
    SpielerInfo[playerid][pKills] = mysql_GetInt("accounts", "Kills", "Name", SpielerInfo[playerid][pName]); //Wir holen uns den wert der unter "Kills" eingetragen ist und Speichern ihn in unserer Variable.
    SpielerInfo[playerid][pTode] = mysql_GetInt("accounts", "Tode", "Name", SpielerInfo[playerid][pName]); //Wir holen uns den wert der unter "Tode" eingetragen ist und Speichern ihn in unserer Variable.
    }
    return 1;
    }
    Das ist sicher nicht die effizienteste Lösung, aber sie Ist übersichtlich und Anfängerfreundlich. Wer das Ganze trotzdem anders haben möchte, kann sich Hier mal anschauen wie sich das Ganze mit sscanf realisieren lässt.


    Ok weiter im Text. Wir haben jetzt also eine Funktion um die Daten des Spielers in unseren Server variablen zu Speichern. Aber moment, es Fehlen ja noch die Funktion/en die dort benutzt wurden.
    Das wäre in unserem Falle mysql_GetInt.


    mysql_GetInt Benutzen wir um einzelne Werte aus der Datenbank zu lesen und diese dann im Script zu verwenden. Dafür gehen wir wieder ganz nach unten, und fügen folgendes ein:
    stock mysql_GetInt(Table[], Field[], Where[], Is[])
    {
    new query[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Is, Is);
    format(query, 128, "SELECT `%s` FROM `%s` WHERE `%s` = '%s'", Field, Table, Where, Is);
    mysql_query(query);
    mysql_store_result();
    new sqlint = mysql_fetch_int();
    mysql_free_result();
    return sqlint;
    }
    Als erklärung:
    mysql_GetInt gibt den Integer zurück, der an der angegebenen Position in der angegebenen Tabelle liegt.

    • Table[] - Die Tabelle in der der Wert liegt.
    • Field[] - Das Feld (die Spalte) in der der Wert liegt.
    • Where[] - Das Feld (die Spalte) in der Nach der Bedingung gesucht wird.
    • Is[] - Die bedingung um die richtige Reihe zu finden.


    mysql_GetInt("accounts", "Level", "Name", SpielerInfo[playerid][pName])
    Heisst also, wir suchen in der Tabelle "accounts" nach dem Wert "Level", aber damit wir nicht von irgendwem das level bekommen, geben wir als bedingung an das wir das Level aus der Reihe haben wollen, wo unter "Name" der Name unseres Spielers ist (dieser ist ja in SpielerInfo[playerid][pName] gespeichert).
    Gleiches gilt auch für mysql_GetFloat und mysql_GetString, nur das wir dort eben einen Float wert oder einen string zurück bekommen. Damit wir diese Funktionen auch benutzen können fügen wir mysql_GetString unten ins Skript ein. mysql_GetFloat muss nach oben ins Skript, weil funktionen mit tag (also z.b Float:mysql_GetFloat ) im Skript stehen müssen bevor die Funktion verwendet wird:
    stock mysql_GetString(Table[], Field[], Where[], Is[])
    {
    new query[128], Get[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Is, Is);
    format(query, 128, "SELECT `%s` FROM `%s` WHERE `%s` = '%s'", Field, Table, Where, Is);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(Get);
    mysql_free_result();
    return Get;
    }

    stock Float:mysql_GetFloat(Table[], Field[], Where[], Is[])
    {
    new query[128], Float:sqlfloat;
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Is, Is);
    format(query, 128, "SELECT `%s` FROM `%s` WHERE `%s` = '%s'", Field, Table, Where, Is);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_float(sqlfloat);
    mysql_free_result();
    return sqlfloat;
    }


    So nun sind wir fast fertig. Was uns jetzt noch fehlt ist das Speichern des Spielers wenn er den Server verlässt.
    Dazu gehen wir zu
    public OnPlayerDisconnect(playerid, reason)
    und fügen dort die Funktion
    SavePlayer(playerid)
    ein. Damit wird der Spieler beim Ausloggen gepseichert.
    Zusätzlich löschen wir die Variable des Spielers ob er eingeloggt ist, da er ja nun ausgeloggt wird. Das ganze machen wir mit
    DeletePVar(playerid,"Eingeloggt");
    Da wir die Funktion SavePlayer aber noch nicht haben, fügen wir sie unten ins Skript hinzu:
    stock SavePlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid)) //wir überprüfen ob der Spieler überhaupt noch Connected ist und ob er nicht ein NPC ist.
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 1) //Und hier ob er noch eingeloggt ist.
    {
    //Nun speichern wir die Daten in der Datenbank.
    mysql_SetInt("accounts", "Level", SpielerInfo[playerid][pLevel], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Geld", SpielerInfo[playerid][pGeld], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Kills", SpielerInfo[playerid][pKills], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Tode", SpielerInfo[playerid][pTode], "Name", SpielerInfo[playerid][pName]);
    mysql_SetFloat("accounts", "Health", SpielerInfo[playerid][pHealth], "Name", SpielerInfo[playerid][pName]);
    }
    }
    return 1;
    }
    Und die Funktionen mysql_SetInt, mysql_SetFloat und mysql_SetString kommen direkt da drunter (mysql_SetString benutzen wir zwar nicht, aber falls ihr mal strings speichern wollt habt ihr diese direkt parat).
    stock mysql_SetInt(Table[], Field[], To, Where[], Where2[])
    {
    new query[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE `%s` SET `%s` = '%d' WHERE `%s` = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }
    stock mysql_SetString(Table[], Field[], To[], Where[], Where2[])
    {
    new query[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(To, To);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE `%s` SET `%s` = '%s' WHERE `%s` = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }
    stock mysql_SetFloat(Table[], Field[], Float:To, Where[], Where2[])
    {
    new query[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    mysql_real_escape_string(Where2, Where2);
    format(query, 128, "UPDATE `%s` SET `%s` = '%f' WHERE `%s` = '%s'", Table, Field, To, Where, Where2);
    mysql_query(query);
    return true;
    }
    Als erklärung:
    mysql_SetInt "Updatet" den Wert der an der Angegebenen Stelle in der Tabelle liegt, auf den neuen Wert den wir angegeben haben.

    • Table[] - Die Tabelle in der der Wert verändert werden soll.
    • Field[] - Das Feld (die Spalte) in der der Wert verändert werden soll.
    • To - Der Wert der an der in das Angegebene feld eingetragen werden soll.
    • Where[] - Das Feld (die Spalte) in der Nach der Bedingung gesucht wird.
    • Where2[] - Die bedingung um die richtige Reihe zu finden.


    mysql_SetInt("accounts", "Level", SpielerInfo[playerid][pLevel], "Name", SpielerInfo[playerid][pName]);
    heisst also, wir gehen in die Tabelle "accounts", und ändern den Wert der in der Spalte "Level" steht, auf den Wert den wir angegebene haben (SpielerInfo[playerid][pLevel]), da wo in der Spalte "Name" unsere bedingung (SpielerInfo[playerid][pName]) steht.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

    4 Mal editiert, zuletzt von maddin () aus folgendem Grund: Siehe 3. Post

  • 6. Hinweis


    Sollten irgendwelche Fehler auftreten, oder etwas nicht so funktionieren wie es sollte, empfiehlt es sich immer die eingebaut debug funktion zu verwenden.
    Um den Debug Modus ein zu schalten, schreibt ihr einfach
    mysql_debug(1);
    Unter OnGameModeInit(). Wenn das script nun irgendwelche aktionen per mysql macht, sei es abfragen, verbinden oder sonst was, wird das ganze in der datei mysql_log.txt gespeichert. Diese findet sich in eurem Server Verzeichniss, da wo auch die samp-server.exe und die server_log.txt datei liegen.
    Eine Auflistung aller Fehler Codes findet ihr Hier: Client | Sever


    7. Abschluss


    Joa das wars, ich hoffe dem ein oder anderen hat es geholfen. Solltet ihr noch fragen haben schreibt einfach hier in den Thread.
    Wer fehler findet bitte auch Melden damit ich diese Korrigiren kann.




    Wer ein Beispiel Skript Braucht:


    Die SQL-Datei (accounts.sql, database.sql):


    Nützliche Links:


    unbegrenz* = MySQL Tabellen sind nur theoretisch unbegrenz groß, aber ich halte es führ extrem unwarscheinlich das ihr irgendwann mal an eure grenzen stoßen werdet. Jeder eintrag in einer Tabelle füllt eine bestimmte Menge an speicher aus auf dem Server auf dem eure MySQL Datenbank liegt (Wir befinden uns hier in Byte dimensionen). Das heisst: Je mehr einträge in der Datenbank, desto mehr speicherplatz verbraucht sie. Seid MySQL Version 3.23 ist die maximale Tabellengröße 65.536 Terabyte (2567 – 1 Byte). Das bedeutet, dass die maximale effektive Tabellengröße von MySQL-Datenbanken normalerweise durch Beschränkungen des Betriebssystems hinsichtlich Dateigrößen festgelegt ist, nicht durch MySQL-interne Grenzen.



    Mfg.



    Edit 1: Sorry das Ich Doppel(Trippel) post machen musste, aber sind zu viele Zeichen^^ Habs aber extra mit Stijn abgesprochen.
    Edit 2: Fehler bei mysql_GetFloat behoben, danke an reLyyy der mich darauf aufmerksam gemacht hat.
    Edit 3: Beispiel Skript geupdatet. Danke an [FoR]Hardcore der mich darauf aufmerksam gemacht hat.
    Edit 4: Flaot zu Float ^^
    Edit 5: puglic zu public. Danke an Paranoid der mich darauf aufmerksam gemacht hat.
    Edit 6: Punkt 7 Hinzugefügt.
    Edit 7: Hinweis zu *unbegrenzt
    Edit 8: Tabelle im ersten post gefixxt (Wegen des neuen BBCodes)
    Edit 9: Tabelle im ersten post durch ein Bild ersetzt
    Edit 10: Code im zweiten Post & Beispiel Skript überarbeitet (siehe hier & hier). Danke an Goldkiller & Nortex.
    Edit 11: Multiupload-Links erneurt
    Edit 12: Tabelle im ersten Post gefixxt. Mal wieder ^^
    Edit 13: SQL Dateiname geändert, für die leute die schwer von begriff sind ^^
    Edit 14: Download Links aktualisiert.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

    14 Mal editiert, zuletzt von maddin ()

  • Bin gleicher Meinung. Super Tutorial! Habe es eben mal bei mir eingebunden im Forum, mit Link zu deinem Thread hier, weil es die Frage mehrmals bei mir gab.
    Bedanke mich! Hoffe wirklich, das hilft einigen weiter.


    10/10 Punkten

    Freundliche Grüsse

    hTex



    Biete Hostedlist-Eintrag ab 11€/Monatlich via Paypal.
    Nach dem das Geld eingetroffen ist, erfolgt direkte Freischaltung in der Hostedlist.
    Bei der Bezahlung bitte an die Server Adresse in dem Nachrichten Fenster denken!!
    Kontaktierung gerne via E-Mail (mail@lukabartsch.de)



  • hey!
    Bei mir zeigt er die Dialoge beim Connecten nicht an!

  • Vorerst gutes Tutorial ;)
    Ist echt gut zu gebrauchen leider brauch ich mal deine Hilfe :D
    Undzwar möchte ich gerne diesen Command an Mysql anpassen!
    Der CMD soll bewirken das die "Kills" auf 99 gesetzt werden. Mit Dini ist das ja ganz leicht :


    PlayerInfo[playerid][pKills] = 99;


    Nur wie schaut das bei Mysql aus? Vielen Dank im Vorraus!

  • Vielen Dank nur leider seh ich dort nirgendwo eine Stelle wo ich den Wert "99" eintragen soll :D
    Vlt. könntest du mir ja mal den ganzen CMD als Beispiel zusammen basteln ;)


    Am besten darein :

    if(strcmp(cmd, "/kills", true) == 0)
    {


    return 1;
    }


    Danköö
    //Edit cmd geändert

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Vorerst gutes Tutorial ;)
    Ist echt gut zu gebrauchen leider brauch ich mal deine Hilfe :D
    Undzwar möchte ich gerne diesen Command an Mysql anpassen!
    Der CMD soll bewirken das die "Kills" auf 99 gesetzt werden. Mit Dini ist das ja ganz leicht :


    PlayerInfo[playerid][pKills] = 99;


    Nur wie schaut das bei Mysql aus? Vielen Dank im Vorraus!


    Eigentlich musst du an den Commands nichts ändern. Die Stats werden beim Logout gespeichert, also reicht es wenn du die Variable auf 99 Setzt. Asonsten gehts so wie LoRdCrUnChEr es gesagt hat.


    mfg.

  • Das allererste verständliche SA-MP MySQL Tutorial das ich gesehen habe!
    Leicht zu Verstehen, Übersichtlich, mit Bildern, und einfach erklärt!


    Großes Lob an dich!


    11/10 Fische


    Mach mehr solche Tutorials ;)


    MfG
    Chupa

  • ich habe das im moment in einem cmd so hier



    SQL
    new year, month,day;
           getdate(year, month, day);
           format(string, sizeof(string), "AdmCmd: %s hat von %s eine Fraktionsperre bekommen! Grund: %s (%d-%d-%d)", giveplayer, sendername,(result),month,day,year);
           SperreLog(string);
           format(query, sizeof(query), "INSERT INTO test (Wer,Von,Grund,Jahr,Monat,Tag) VALUES ('%s', '%s', '%s', '%d', '%d', '%d')", giveplayer, sendername,(result),year,month,day);
              mysql_query(query);
           format(string, sizeof(string), "AdmCmd: Du hast von %s Eine FraktionsSperre bekommen! Grund: %s",giveplayer,(result));
           SendClientMessage(giveplayerid,COLOR_LIGHTRED,string);

    wie würde man den eintrag wieder löschen wenn man die sperre aufhebt?

  • klappt leider nicht ich will es so haben wenn man jemanden eine sperre gibt soll das in der mysql datenbank eingetragen werden und wenn man sie wieder aufhebt dann soll die sperre von der datenbank entfernt werden

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