Beiträge von maddin

    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.

    Allein schon wegen dem satz "überweist 600€ auf unser Konto, sonst werden polizeiliche Maßnahmen eingeleitet" würde ich das ganze fragwürdig finden.
    Ich würde es an deiner stelle Ignorieren, oder wenn du/ihr das Geld dafür habt einen Anwalt einschalten. Aber auf keinen fall irgendwas überweisen oder selbst zurück schreiben. Solche Betrüger schreiben meist 100te von briefen, und wenn auch nur einer Darauf anbeißt haben sie schon was sie wollten.

    format(string, sizeof string, "Zeit seit Payday: %d Minuten, Spielzeit insgesamt: %d Minuten.",pSincePayday[playerid],floatround(pPlayTime[playerid]/60));
    Bin jetzt mal davon ausgegangen das du in pPlayTime[playerid] die Spielzeit in Minuten speicherst.

    Wenn ich das richtig sehe fehlen dir da Gänsefüßchen am ende.

    PHP
    $sql = "INSERT INTO players (`buchung1`) VALUES ("Überweisung $"'.$_POST['betrag'].'" an "'.$_POST['ankommen'].')" or die(mysql_error());

    if(strcmp(cmdtext,"/Einfahrt",true)==0)
    {
    if(IsPlayerInRangeOfPoint(playerid, x, y, z, 5.0)//Anstatt x,y,z musst du hier die Coordinaten von dem Punkt angeben, an dem man den befehl benutzen darf.
    {
    if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
    new vehid = GetPlayerVehicleID(playerid);
    SetVehiclePos(vehid,1235.5044,-1303.3871,-99.5134);
    SetVehicleZAngle(playerid,181.3850);
    LinkVehicleToInterior(playerid,0);
    SetPlayerInterior(playerid,0);
    SendClientMessage(playerid,0x00FF00FF,"");
    }
    else
    {
    SetPlayerPos(playerid,1235.5044,-1303.3871,-99.5134);
    SetPlayerFacingAngle(playerid,181.3850);
    SetPlayerInterior(playerid,0);
    SendClientMessage(playerid,0x00ff00ff,"");
    }
    }
    else
    {
    SendClientMessage(playerid,0x00FF00FF,"Du bist nicht am richtigen ort!");
    }
    return 1;
    }

    Versuchs mal so:
    dcmd_changeplate(playerid, params[])
    {
    if(loggedin[playerid] != true) return SCM(playerid,COLOR_WHITE,"SERVER: Du bist nicht eingeloggt!");
    new plate[9],
    State = GetPlayerState(playerid),
    veh = GetPlayerVehicleID(playerid),
    Float:Pos[3];
    if(sscanf(params,"s",plate)) return SCM(playerid,COLOR_GREY,"Benutze: /changeplate [Wort/Zahl]");
    if(IsPlayerInAnyVehicle(playerid) == 0 && State == PLAYER_STATE_DRIVER) return SCM(playerid,COLOR_GREY,"Du sitzt im keinem Fahrzeug oder du bist nicht der Fahrer!");
    SetVehicleNumberPlate(veh, plate);
    SetVehicleToRespawn(veh);
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    SetVehiclePos(veh,Pos[0],Pos[1],Pos[2]);
    PutPlayerInVehicle(playerid,veh,0);
    return 1;
    }


    Plate war kein string, und die if(IsPlayerInAnyVehicle(playerid) == 0 && State == PLAYER_STATE_DRIVER) abfrage hat irgendwie keinen sinn gemacht so wie sie war und wie du die Nachricht ausgegeben hast.

    mysql_query("SELECT feld FROM tabelle WHERE so_und_so = 'dies_und_das'");
    mysql_store_result();
    mysql_fetch_float(variable); // die varaible in der du den wert speichern willst
    mysql_free_result();


    oder als funktion:
    stock 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;
    }
    Kannste dann so benutzen:
    variable = mysql_GetFloat("tabelle", "feld", "so_und_So", "dies_und_das");

    CMD:ac(playerid,params[])
    {
    new sreason[128],
    str[MAX_PLAYER_NAME];// Wenn du einen Namen speichern willst ist 128 zu groß, also lieber MAX_PLAYER_NAME.
    if(Player[playerid][Admin] == 0)
    {
    return SendClientMessage(playerid,COLOR_RED,"You must be a Moderator or Higher");
    }
    if(sscanf(params,"s",sreason))
    {
    return SendClientMessage(playerid,COLOR_RED,"USAGE: /ac [Text]");
    }
    GetPlayerName(playerid, str, sizeof(str));
    if(Player[playerid][Admin] == 1)
    {
    format(str, sizeof(str), "* Moderator %s: %s", str, sreason);
    }
    else if(Player[playerid][Admin] >= 2)
    {
    format(str, sizeof(str), "* Admin %s: %s", str, sreason);
    }
    SendClientMessageToAll(0xFFFF00AA, str);
    return 1;
    }

    Ich weiss das ein Server schonmal Probleme bekommen hat weil sie den namen "Hells Angels" benutzt haben. Also denke ich mal das Geschützte Namen (auch iPhone & Nokia, bei BigMac bin ich mir nicht sicher ob der geschützt ist^^ ) nicht benutzt werden dürfen.


    Kann mich da aber auch irren.


    Mfg.

    Wenn du ein Problem mit dem Server hast dann lass sie doch machen was sie wollen. Niemand zwingt dich dort zu Spielen... Aber sie jetzt aus "rache" hier anzuschwärzen find ich ziemlich schei*e von dir.

    Ich würde natürlich auch gerne Helfen :) Pawn Kenntnisse sind vorhanden, und Rechtschreibung denke ich sollte auch kein Problem sein.
    [list]
    [*]Dürfen alle angelegten Benutzer die Beiträge der anderen Benutzer bearbeiten?
    Ich denke es reicht wenn jeder benutzer seine eigenen beiträge bearbeiten kann/darf. Sollte jemand irgendwas zu kritisieren haben kann man das doch einfach per PN oder im Disskusions Forum klären. Die leute die mit machen werden wohl Reif genug sein um mit Kritik umgehen zu können.
    [*]Unter welcher Lizenz sollen die Beiträge gestellt werden?
    Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Deutschland (CC BY-SA 3.0) sollte in ordnung sein.
    [*]Was ist euch in einem Wiki wichtig?
    Das es übersichtlich ist und man sich leicht zu recht findet. Auf das Design sollte man meiner meinung nach weniger wert legen als auf den Funktions umfang und die bedienung.


    Diskussions Forum finde ich eine gute Idee, da können dann leute die keine Rechte haben vorschläge machen was ihnen in der Wiki fehlt, oder man kann Autoren auf Fehler hinweisen oder Verbesserungs vorschläge machen.


    mfg.

    Also wenn man es kann ist es sicher ziemlich geil :D


    Aber eigentlich verarbeitet man doch im traum die dinge die man am tag erlebt hat. Wenn ich jetzt aber selbst bestimme was ich träume, bleibt das verarbeiten dann nicht weg? und kann das nicht auch eher ein nachteil sein? Hab dazu noch nichts gefunden...