SQLite | Die alternative zu MySQL

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 möchte euch einmal die Alternative zu MySQL vorstellen, nämlich SQLite.


    Im Forum kusieren bisher 2 Werke damit einmal die DT_SaveBox und einmal gPM.
    Ich finde es relativ traurig, das viele glauben man müsse unbedingt MySQL als Datenverwaltung haben, weil es mega super toll und total schnell sei, das ist aber nicht so.
    SQLite weist gewisse Vorzüge in der Geschwindigkeit bei kleineren Datenbanken im gegen Satz zu MySQL auf.
    Erst wenn die Datenbank, verdammt groß wird weist es Geschwindigtkeitseinbußen auf.



    Viele von euch sind ja der Meinung das man UCPs nur mit Hilfe von MySQL erstellen kann,
    dies stimmt aber nicht.
    SQLite weist in PHP den gleichen Funktionsumfang wie wie MySQL auf.
    Eine Übersicht über die Funktionen von PHP in Verbindung mit SQLite findet ihr hier


    Für normale User gibt es keinen wirklichen Unterschied,
    aber es gibt wesentliche Unterschiede zum Funktionsumfang, wie der Name "Lite" schon vermuten lässt.


    Sie sind nicht für den normalen Gebrauch wirklich wichtig, also keine Sorge ;)


    Fangen wir mit dem wesentlichen an.


    Warum SQLite?


    Warum SQLite?
    Die Frage ist nicht so schwer zu beantworten.
    Wie oben schon beschrieben ist es in vielen Fällen überhaupt nicht nötig MySQL zu nutzen.


    Es gibt natürlich einen Nachteil in punkto Sicherheit.
    Die Datenbank liegt nur im Scriptfiles Ordner und kann von jedem der darauf Zugriff hat ausgelesen werden.


    Es gibt natürlich auch gewisse Vorzüge von SQLite.
    z.B. die Datenbank besteht nur aus einer Datei und ist nur einige (hundert) Kilobyte groß, also kein wirklicher Speicherplatzverlust.
    Dazu passt sich die Datenbank während der Laufzeit immer auf das System an, das gerade die Datenbank benutzt.
    Das vereinfacht den Austausch zwischen verschiedenen Systemen, sogar zwischen Systemen mit unterschiedlichen Byte-Reihenfolgen.
    Jede Spalte kann also Daten beliebiger Typen enthalten, die erst zur Laufzeit wird nötigenfalls konvertiert werden.


    Diese Vorzüge sind natürlich nicht für jeden relevant, deshalb muss jeder selbst entscheiden, ob er lieber SQLite, MySQL oder gleich beim klassischen Filesystem bleibt.



    Also gut fangen wir mit dem eigentlichen Coding-/Scriptteil an.



    Erstellen bzw. öffnen einer Datenbank:


    Falls eine Datenbank noch nicht existiert, man sie aber trotzdem öffnen möchte,
    ist es in SA:MP nicht relevant diese per Hand zu erstellen,
    wenn man die Datenbank trotzdem per Hand erstellen möchte, kann dies gerne tun.
    Anleitung dazu findet ihr weiter unten.


    Damit müssen wir uns aber nicht abgeben, da dies der SA:MP Server für uns übernimmt. ;)


    Die Funktion dafür lautet db_open();
    hier ein kleines Beispiel:



    OK, wir haben jetzt eine Datenbank erstellt, aber wir wollen jetzt ja damit arbeiten.



    Erstellen von Tabellen in der SQLite Datenbank:


    Das erstellen von Tabellen in der Datenbank, läuft nicht unbedingt so einfach ab, wie bei MySQL, sofern man immer mit PhpMyAdmin gearbeitet hat.
    Ich nehme jetzt als Beispiel Navicat, weil es eigentlich dafür am einfachsten ist.


    Sofern ihr Navicat noch nicht installiert habt, hier ein Downloadlink: http://www.computerbild.de/dow…Navicat-Lite-1298757.html


    Zuerst müssen wir eine Verbindung zur Datenbank herstellen, das geht aber nur wenn sie auch existiert^^
    Gut zum erstellen der Verbindung gehen wir zuerst auf den "Button" Connection und wählen SQLite aus


    Tut1.jpg


    Dann legen wir den Verbindungsnamen und die Datenbank Datei fest.
    Dabei ist zu beachten das "Existierende Datenbank Datei" ausgewählt ist.


    Tut2.jpg


    Als nächstes gilt es die Tabelle zu erstellen, dies geht über "New Table",
    dort ist alles wie gehabt.
    Felder erstellen und den Feldtypen festlegen.


    Meistens braucht man hier allerdings nur Integer und Text.
    Bei Text ist grundsätzlich die Länge anzugeben und bei den Integer nicht, diese passen sich selbstständig an.


    Als nächstes wenn die Tabelle erstellt ist, speichern wir sie und geben ihr einen Namen.
    Die Tabelle mit der wir arbeiten werden ist unten.


    Tut3.jpg


    Nach dem wir die Tabelle erstellt haben, schließen wir Navicat und kümmern und uns wieder um den Scriptteil.


    Einfügen von Daten in die Datenbank:


    Das einfügen von Daten ist eigentlich das einfachste,
    ich vollführe das einmal an einem Beispiel, da dies eigentlich selbsterklärend ist,
    wenn man schon mal mit MySQL bzw. SQL gearbeitet hat.



    Die Tabelle sollte danach so aussehen.
    Tut4.jpg


    Wenn nicht, beginnt von vorne oder lasst es,
    wer es bis hier hin zum 2. mal nicht geschafft hat, sollte es lassen ;)



    Updaten von Werten:


    Nun zum 2. einfachsten, das Updaten von Werten.
    Es ist nicht viel anders als das einfügen, der Aufbau des Querys sind nur komplett anders.



    Wenn der Code ausgeführt wurde sollte eure Tabelle wie folgt aussehen
    Bild 4:


    Wenn nicht, alles auf Anfang oder lasst es :D



    Auslesen von Daten:


    Nun zum schwierigsten Teil, das Auslesen von Daten.
    Eigentlich ist es ganz einfach, wenn man es verstanden hat.
    Problem hier allerdings, es gibt hier zwei verschiedene Möglichkeiten an die Daten zu kommen.
    Ich arbeite sie von oben bis unten einmal ab.


    Möglichkeit 1:


    Das ist die schwierigste Möglichkeit.
    Hier arbeiten wir direkt mit mehreren Feldern,
    da es ziemlich blöd und umständlich ist alle Felder die man braucht einzeln aus zu lesen.



    Wenn alles richtig gemacht wurde steht nun 7 und eure Namen in der Serverlog bzw. in der Serverkonsole.
    Herzlichen Glückwunsch ihr könnt nun mehrere Daten auf einmal auslesen :)



    Möglichkeit 2:


    Nun zu der einfachsten Methode, das Auslesen von nur einem Feld.
    Zur Verdeutlichung nutze ich hier das vorherige Beispiel ein abgeänderter Form.



    So nun habt ihr es fast überstanden.
    Im 2. Post Folgen ein paar weitere Funktionen mit Anwendungsbeispielen.
    Viel Spaß beim Lesen :)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

    11 Mal editiert, zuletzt von seegras () aus folgendem Grund: Danke eXchange für die Tipps :) Bilder erneuert Damn - paar Fehler ausgebessert edit by seegras: alten PWN Tag durch neuen CODE Tag ersetzt

  • Wenn ihr immer noch wissens hungrig nach den Funktionsweisen der restlichen SQLite Funktionen seid,
    dann gratuliere ich euch :) Nicht jeder würde soweit lesen.


    Gut als nächstes beschäftigen wir uns mit folgenden Funktionen:

    FunktionenKurz Beschreibung
    db_num_rows();Gibt die Anzahl der ausgelesenen Zeilen zurück.
    db_next_row(); Springt in die nächste Zeile, sofern es mehr als eine ausgelesene Zeile gibt.
    db_num_fields(); Gibt die Anzahl der ausgelesenen Spalten zurück die in einer Zeile sind.
    db_field_name(); Gibt den Namen des Feldes zurück.




    Sie mögen nicht unbedingt immer so nützlich sein bzw. klingen,
    aber man ist froh darüber wenn man sie braucht, vertraut mir ;)
    Ich werde im Verlauf nur noch auf die Funktionen eingehen mit denen wir uns noch nicht beschäftigt haben.
    Das heißt ich werde z.B. die einzelnen Querys nicht mehr erklären oder die Funktionen die von mir schon einmal erklärt worden sind.


    db_num_rows


    Diese Funktion funktioniert wie mysql_num_rows.
    Sie gibt die Anzahl der ausgelesen Spalten zurück.


    Das wäre meist dann nützlich, wenn man z.B. feststellen möchte ob ein User regestiert ist.
    Ein kleines Beispiel dazu:



    db_next_row


    Diese Funktion arbeitet wie mysql_retriew_row,
    sie kann benutzt werden, wenn man mehrere Einträge hat.
    z.B. wenn man 2x den gleichen Wert in einer Tabelle hat.
    (Eine kleine Anspielung auf die Abfrage im Beispiel von db_num_rows)


    Dieses Beispiel hat nur entfernt was mit dem vorherigen zu tun:



    db_num_fields


    Diese Funktion ist vergleichbar mit der mysql Funktion mysql_num_fields und bewirkt exakt das gleiche.
    Sie kann z.B. in Verbindung mit db_get_field genutzt werden.
    Hier ein Beispiel zur Verdeutlichung in der Anwendung:



    db_field_name


    Diese Funktion hat in MySQL kein Gegenstück.
    Sie speichert den Feldnamen in der angegebenen Variable und kann in Verbindung mit db_get_field_assoc genutzt werden.


    Aber im folgenden Beispiel wäre das unpraktisch, aber es soll ja nur als Verdeutlichung dienen. ;)



    Gut das war es auch schon.
    Vielen Dank fürs Lesen :)
    Ich hoffe ich konnte euch die Welt von SQLite ein wenig näher bringen.
    Falls Fragen - Fehler - Vorschläge zur Hand sind, postet sie doch bitte unten im Thread :)


    Bewertungen sind natürlich nicht verboten ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

    Einmal editiert, zuletzt von seegras () aus folgendem Grund: edit by seegras: alten PWN Tag durch neuen CODE Tag ersetzt

  • Wow! Vielen Dank für das Tutorial! Sieht gut aus. ;)


    10/10 °o°

  • Rechtschreibfehler:


    MySQL ist nur dann wirklich sinnvoll, wenn man im Nachhinein z.B. per UCP Daten verwalten oder ändern will,
    man kann auf(auch??) UCPs auf Basis von SQLite erstellen.
    Eine Übersicht über die Funktionen von Php in Verbindung mit SQLite findet ihr hier



    Sehr schönes Tutorial!

  • An sich ist es wirklich ein hervorragendes Tutorial. Finde die Aufteilung sehr gut gelungen. Ist für Anfänger definitiv gut verständlich.


    Eine kleine Anmerkung habe ich trotzdem noch.
    Folgende Passage kann ich nicht wirklich zustimmen. Sollte ich diese falsch interpretiert haben bitte sagen.

    Zitat

    Warum SQLite?
    Die Frage ist nicht so schwer zu beantworten.
    Wie oben schon beschrieben ist es in vielen Fällen überhaupt nicht nötig MySQL zu nutzen
    und man braucht keine externe Verbindung oder Datenbank.

    Naja, MySQL ist nicht wirklich eine externe Verbindung. Im Normalfall liegt diese auf dem selben Rechner, somit ist diese Aussage schlichtweg nicht korrekt. Selbst ein Ordner ist "extern", wenn man es so nennen möchte. Ich denke, entweder man formuliert es anders oder lässt es weg.

  • Veery Nice, werds von nun an nutzen ;)


    Ein Glück sind die Passwörter in meiner Datenbank eh gecrypted xD

    Unkompetent. Das neue dynamisch.



    ihr seit schon lustig postet erros aber nicht die zeilen wo sie sind dann können wir euch auch nicht helfen^^


    Lernt Scripten, Leute, und macht eure Augen auf!


    _______________________________________
    50 Beiträge: [x] 300 Beiträge: [x]
    100 Beiträge: [x] 500 Beiträge: [x]
    150 Beiträge: [x] 1000 Beiträge: [x]
    200 Beiträge: [x]
    2000 Beiträge: []
    250 Beiträge: [X] Boardaktivitäten: Profil


    [size=36]_______________________________________

    /Edit: Schmerzt es dir eigentlich nicht so ein Müll zu schreiben 8|

  • Veery Nice, werds von nun an nutzen ;)


    Freut mich, dass ich jemanden damit überzeugen konnte.


    BTW:
    Ihr könnte natürlich auch hier fragen dazu stellen wenn etwas nicht funktioniert ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Dudalus


    Ich wüsste nicht warum das nicht funktionieren sollte.
    MySQL ist nur eine mit ein paar Funktionen aufgepushte Version von SQLite,
    von daher sollte das Problem los funktionieren.


    Ich weiß aber nicht wie das bei SAMP mit den SQL Injections funktioniert,
    es gibt keine real_escape_string funktion.
    Es kann natürlich sein, das der Server das selbstständig schützt ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Es ist gut gelungen, muss aber sagen, dass wenn man sich ein UCP basteln möchte, dass man da lieber MySQL benutzt, daher gibt es bei mir Punktabzüge, jedoch ist es gut für andere Systeme, man kann schließlich nebenbei Backups von den Daten machen, man kann ja nie wissen.


    Top, bis auf die kleinen Rechtschreibfehler, aber ich schätze bei soviel Text kommt man einfach durcheinander, ich bewerte dich nicht, da du es nicht Wert bist von einem Punktesystem bewertet zu werden, welches eh nichts aussagekräftiges erläutert :D

  • Top, bis auf die kleinen Rechtschreibfehler, aber ich schätze bei soviel Text kommt man einfach durcheinander


    Das stimmt, ich das ist auch sehr viel Arbeit gewesen, aber es fehlen nur kleine Wörter, das passiert auch mir :D


    ich bewerte dich nicht, da du es nicht Wert bist von einem Punktesystem bewertet zu werden, welches eh nichts aussagekräftiges erläutert :D


    Das ist nett :love:


    dass wenn man sich ein UCP basteln möchte, dass man da lieber MySQL benutzt


    Ich habe nie behauptet das man lieber SQLite nutzen sollte. ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ich sollte aufpassen was ich von mir gebe ^^ ich habe angenommen "schneller, besser, etc." ist lieber :D
    Jedoch sieht es echt gut aus, ich werde mir dann nochmal Zeit nehmen um einige System drauf zu schreiben, da einige hier echt keine Ahnung von MySQL haben xD.

  • Bin ich der einzige der in dem Tutorial ein paar / einige Fehler gefunden hat?


    Bei mir meckerte er in der Zeile
    DB = db_open[...]
    Geändert in:
    Database = db_open[...]
    war die Lösung.


    Zitat

    format(query,128,"INSERT INTO `Accounts` (`ID`,`Name`) VALUES ('7','%s')",query);


    Die Values sind falschherum.
    Richtig wäre:
    format(query,128,"INSERT INTO `Accounts` (`ID`,`Name`) VALUES ('%s','7')",query);


    Zitat

    new ID = valstr(query); // Umwandeln in ein Integer


    <- Macht man eine Umwandlung nicht mit
    new ID = strval(query);
    ?


    Das waren jetzt 3 Fehler, die ich auf die schnelle gefunden hatte..
    Ansonsten ansich ein schönes Tutorial ;)


    Wer noch ein paar Informationen braucht kann sich diese unteranderem im Englischen Wiki besorgen.
    @BlackAce:
    Vielleicht hättest du auch noch die restlichen 3 / 4 Befehle erklären können / sollen, du verwendest sie oft, beschreibst sie aber nur dürftig bzw. sehr kompliziert.
    db_get_field(...);
    bzw.
    db_get_field_assoc(...);


    Ich persönlich hatte schon etwas Erfahrung mit SQLite, aber für Neulinge ist diese Beschreibung:


    unter Umständen etwas schwierig auseinander zu legen ;)


    Aber wie gesagt, ansonsten ein nettes Tutorial.
    Und das Englische Wiki ist hier auch eine nützliche Anlaufstelle (wie für eigentlich alles andere auch ;)).


    Gruß,
    Maxx

  • Maxx


    Danke für den Hinweiß ist mir gar nicht aufgefallen :S


    Ist aber bearbeitet^^


    Gut ich pack in den 2. Beitrag noch eine weitere erklärung zu db_get_field(_assoc).
    Aber nicht mehr heute :D
    Eher morgen Mittag ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski