Moin Liebe Native Network Community,
da ich im erweiterten Rahmen kein Tut gefunden habe, und ich damals gerne eins gehabt hätte verfasse ich hiermit eins.
Dieses Tut wird sich im ersten Part um das grundsätzliche arbeiten mit MySQL Datenbanken drehen.
Im zweiten Part gehe ich die Verwendung in Altis Life ein.
Im dritten Part werde ich mit Hilfe von blackfisch auf die Nutzung von SQL-Custom eingehen.
Ich möchte hiermit darauf hinweisen, dass ich keine IT-Ausbildung mache. Dies ist der Stand meines Wissens.
Wenn sich Fehler einschleichen würde ich um eine sachliche Verbesserung bitten.
Da ich mir nicht sicher bin, in welchen Bereich das Thema gehört, habe ich das hierhin gepostet.
Wenn das Falsch war bitte ich um Nachsicht.
Dieses Tutorial darf nicht ohne mein Einverständnis woanders gepostet werden.
!!!WICHTIG: Ich setze für dieses Tutorial Vorwissen in Funktionen definieren , RemoteExec und weiteren Sachen voraus!!!!
Viel Spaß
Part 1 ~SQL Syntax und etwas allgemeines~
Schritt 1 ~Die Verwendungsmöglichkeiten (Syntax)~
Voraus eine kurze Erklärung. Es gibt 4+1 Kern SQL Befehle.
SQL Befehle
SELECT ist dafür zuständig Sachen zu lesen.
UPDATE ist fürs "überschreiben/updaten" zuständig.
INSERT ist dafür da neue Werte in eine Tabelle zu schreiben.
DELETE ist für das löschen einer Zeile da.
REPLACE funktioniert ähnlich wir INSERT und "updated" quasi die ganze Zeile bzw überschreibt die ganze Zeile
~Die Ausgangssituation~
In dieser Tabelle (tutorial) Haben wir 2 Spalten. Die erste heißt wert 1 und die 2te wert 2. Die erste hat als Datentyp INT was für Integer steht. Dieser Dateityp arbeitet nur mit Zahlen. Die Aufgabe dieser Spalte ist das AUTO_INCREMENT.
Das bedeutet das Pro Insert die nächst höhere Zahl eingesetzt wird.
Beispiel
Die 2te Spalte hat den Datentyp VARCHAR. Dieser Dateityp arbeitet mit Strings bzw Text generell. Hier haben wir keinen Standardwert gesetzt und erlauben auch nicht NULL als Standardwert.
Das wars hier mit der Ausgangssituation.
So fangen wir an mit INSERT.
Als nächstes kümmern wir uns um SELECT.
Dann kommen wir zu UPDATE.
Und zu gut allerletzt zu DELETE.
Als nächstes kümmern wir uns um REPLACE.
Replace
Bild+Beispiel kommt von Henne INFO: Beim Testen in der Beispiel Tabelle gab es Probleme mit AUTO_INCREMENT. (Mehr Infos zu REPLACE -->Dokumentation<--)
Das erstmal für´s allgemeine.
Part 2 ~Die Benutzung von ExtDB3 in Altis Life~
Ausgangssituation: Wir möchten Ingame die DB ID des Clients abfragen. Dies machen wir beispielsweise mal mit einem Hint. Hierbei handelt es sich um ein hoffentlich leicht zu verstehendes Beispiel. Hier wird nicht auf Performance o.Ä. geachtet.
Zunächst erstellen wir eine Funktion mit dem Namen fn_SendtoServer.sqf. Diese wird dann mit folgendem Inhalt gefüllt.
/*
Author: Joe Barbaro
Description: Daten werden zum Server geschickt
*/
private _PID = getplayerUID player;
[_PID] remoteExec ["TON_fnc_DBID",2];
Dann erstellen wir im Life_Server eine neue Function mit dem Namen fn_DBID.sqf.
/*
Author: Joe Barbaro
Description: MySQL Abfrage für den Client
*/
params [
["_pid","",[""]]
];
_query = format ["SELECT uid FROM players WHERE pid='%1'",_pid];
_queryResult = [_query,2] call DB_fnc_asyncCall;
[_queryResult] remoteExec ["life_fnc_ClientReturn",remoteExecutedOwner];
Alles anzeigen
Dann erstellen wir noch die Funktion die der Client ausführen soll. Diese nenen wir mal fn_ClientReturn.sqf
/*
Author: Joe Barbaro
Description: Empfängt den Return aus der DB
*/
params [
"_DBID"
];
hint format ["DatenbankID = %1",_DBID];
Hierbei müssen die fn_DBID.sqf und die fn_ClientReturn in der CfgRemoteExec.hppfolgendermaßen definiert werden.
Natürlich auch noch in der Functions.hpp folgendermaßen definieren.
Jetzt noch ein kleiner Zusatz zu fn_AsyncCall.sqf Danke an TaktischerSpeck der mich darauf aufmerksam gemacht hat.
Parameters: 0: STRING (Query to be ran).
1: INTEGER (1 = ASYNC + not return for update/insert,
2 = ASYNC + return for query's).
3: BOOL (True to return a single array, false to return multiple entries mainly for garage).
---------------------------------------------------------------------------------------------------
Das heißt im Klartext:
1 = Wird für Insert und Update benutzt
2 = Wird für Select benutzt + gibt was zurück (logisch ne :D)
Wenn ihr mehrere Sachen selecten wollt, müsst ihr das so schreiben: [_query,2,true] call DB_fnc_asyncCall.
Das ist der Multiarray Support von ExtDB3. Anderenfalls werdet ihr nur den ersten Wert bzw. die Werte der ersten Zeile returned kriegen.
~SQL Custom~ Hier geht raus an blackfisch
Zitat
SQLCustom hat aber weiterhin den Vorteil, dass ich gleiche Querys nur einmal zentral definieren muss. Damit verhindere ich (A) SQL-Injection, (B) falsche Parametrisierung, (C) "Schusselfehler" die entstehen, wenn man eine Query überarbeitet aber die gleiche Query in einer anderen Datei nicht editiert. Die Lösung heißt SQLCustom.
Hier ein Beispiel
Beispiel
Hier erstmal das Statement ohne SQL-Custom
_query = format["SELECT uid, name, bankacc FROM players WHERE uid='%1'","01234567891234567"];
[_query, 2] spawn DB_fnc_asyncCall;
Jetzt mit Verwendung von SQL-Custom
_query = format["selectBank:%1","01234567891234567"];
[_query, 2] spawn DB_fnc_asyncCall;
Zur Erklärung: Mit vorgefertigten SQL-Statements sparen wir uns die Sachen immer wieder zu schreiben. Zudem ist mit dieser Methode klar festgelegt, was abgefragt/geupdated/Inserted werden darf. Dies verhindert z.B das Löschen einer Datenbank durch Hacker etc mittels SQL-Injection.
Damit SQL-Custom funktioniert muss eine INI angelegt werden, in der die SQL Statements definiert werden.
[selectBank] --Bezeichner, der Später im Script verwendet wird
SQL1_1 = SELECT uid, name, bankacc FROM players WHERE uid=?; --die Query, ? sind Parameter
SQL1_INPUTS = 1-string --Input Parameter in Reihenfolge des Auftretens oben
OUTPUT = 1, 2, 3 //Output in der Reihenfolge des Auftretens
Für die genaue Informationen über ExtDB3 hier ein Link zum Wiki -->ExtDB 3 Wiki<--
Ich hoffe ich habe nichts vergessen.
Ebenfalls hoffe ich, dass ich euch die Welt der Datenbanken und den Umgang mit ExtDB3 etwas näher bringen konnte.
Für Fragen und Verbesserungsvorschläge bin ich natürlich offen und freue mich auf eurer Feedback.
Es gibt noch die Möglichkeit mit SQL-Custom bzw. prepared Statements zu nutzen. Dies ist eine weitere Möglichkeit ExtDB3 zu nutzen.
Da ich keine Erfahrung damit habe würde ich dies wenn ich ein Beispiel hat nachreichen.
Mit freundlichen Grüßen
Joe Barbaro