Skip to content

freiesMagazin für 10/2016 erschienen

Vor ein paar Tagen ist die Oktober Ausgabe (10/2016) vom freiesMagazin erschienen,
hier mal ein kurzer Überblick über die Themen, die Ausgabe könnt ihr über den oberen Link in verschiedenen Versionen downloaden.

Inhalt der Ausgabe
* Der September im Kernelrückblick
* FTS – Volltextsuche mit SQLite
* Neues von Redis
* Test: RIVE – Das Twin-Stick-Metroidvania-Vermächtnis
* Audacity 2.1 – Teil IV: Die besten Effekte
* PSPP – eine freie Alternative zu SPSS
* Leserbriefe und Veranstaltungen

freiesMagazin für 01/2014 erschienen

Heute ist die Januar Ausgabe (01/2014) vom freiesMagazin erschienen,
hier mal ein kurzer Überblick über die Themen, die Ausgabe könnt ihr über den oberen Link in verschiedenen Versionen downloaden.

Inhalt der Ausgabe
Linux allgemein
* Der Dezember im Kernelrückblick

Anleitungen
*Äquivalente Windows-Programme unter Linux – Teil 3

Community
* Rezension: Using SQLite
* Rezension: Eclipse IDE – kurz & gut
* Rezension: Weniger schlecht programmieren

Logdaten mittels SQLite erfassen

Der nachfolgende Snippet war der Anfang einer kleinen Logklasse für meine damals entwickelte Toolbox für ProEngineer,
dies war nur eine ganz einfach Klasse, welche noch ausgebaut werden sollte, wozu es aber nie kam.
Ich werde mich hiermit später einmal wieder beschäftigen, sollte ich wieder ein PHP-Skript schreiben,
was zwar geplant aber bisher an der Zeit gescheitert ist, da es nur ein sehr grober Entwurf ist und außerdem
mir die Zeit fehlt.

Vielleicht hilft dieses Snippet irgendjemandem mal so etwas in der Richtung zu verwirklichen, bzw die Klasse etwas besser
auszubauen und eventuelle Verbesserungen darin einzubringen.

class Log
{
        private $query = '';

        function Set ( $text )
        {
                self::Query ( $text );
        }


        private function Query ( $type , $message )
        {
                $text = 'Meldung aufgetreten in: ' . chr ( 10 ) .$_SERVER['PHP_SELF'] . chr ( 10 ) . chr ( 10 ) . $message;
                $date = time ( );
                $text = SQLite3::escapeString ( $text );
                $this->query .= "INSERT INTO log ( logDate, logText ) VALUES ('" . $date . "', '" . $text . "');";
        }

        function Commit ( )
        {
                $filename = PFAD_und_DATEINAME_zur_LOGDB;
                $create = ( file_exists ( $filename ) ) ? 0 : 1;

                $db = new SQLite3 ( $filename );

                if ( $create == 1 ) $db->query ( "CREATE TABLE [log] ( [logDate], [logText] )" );
                $db->query ( "BEGIN;" . $this->query . "COMMIT;" );
                $this->query = '';
                $db->close ( );
        }
}

Arbeiten mit SQLite3

SQLite 3 ist nur noch als OOP Variante vorhanden, das macht die Arbeit vielleicht etwas gewöhnungsbedürftig (zum Anfang hin), sollte bisher nur prozedurale Programmierung genutzt worden sein.

$db = new SQLite3 ( 'meine_db.sqlite3' [, int $schalter ]  );
$result = $db->query ( $querystring );
$data = $result->fetchArray();
$db->close ( );

für $schalter sind folgende Konstanten möglich:
SQLITE3_OPEN_READONLY öffnet die Datenbank nur zum Lesen
SQLITE3_OPEN_READWRITE öffnet die Datenbank zum Lesen und Schreiben
SQLITE3_OPEN_CREATE erzeugt eine Datenbank, wenn diese nicht existiert
sollte $schalter leer sein, wird der Standard SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE genommen.

Mit new erzeugen wir ein neues Objekt der Klasse SQLite3 mit den übergebenen Parametern.

$db->query ( ) => erzeugt ein Objekt der Klasse SQLite3Result dieses übergeben wir dem Parameter $result

Nun können wir über $result->fetchAll ( [int $mode] ) die Daten abrufen, wenn nur ein Datensatz erwartet wird nehmen wir die obige Zeile, bei mehreren muss eine Schleife genutzt werden (z.B. while ).

Bei fetchAll kann noch ein Parameter übergeben werden, welcher steuert wie die Daten ausgegeben werden sollen.
SQLITE3_ASSOC gibt ein Array aus welchen als Index-Wert den Spaltennamen nutzt
SQLITE3_NUM gibt ein Array aus welchen als Index-Wert die Spaltenzahl nutzt (Zählung startet bei 0)
SQLITE3_BOTH gibt ein Array aus welches SQLITE3_ASSOC und SQLITE3_NUM entspricht

Über $db->close ( ) schließen wir die Datenbankverbindung wieder.

Arbeiten mit SQLite2

Zuerst muss sichergestellt werdne, ob SQLite überhaupt verfügbar ist, dies erfragt man am Besten beim Webhoster direkt. Ist PHP5 installiert sollte SQLite funktionieren, dies ist allerdings keine Garantie dafür, da SQLite nur ein Zusatzmodul ist und der Hoster dies aus verschiedenen Gründen deaktiviert haben könnte.

$db = sqlite_open('Datei.sqlite',0666,$error);
  # Hier kommen später die Abfragen und der Programmcode rein
sqlite_close($db);


Mit sqlite_open öffnen wir die Datei, die unsere Tabellen enthalten, er wird mindestens 1 Parameter benötigt (Dateiname), optional können die Rechte für den Dateizugriff und eine Variable für die Fehlerbehandlung angegeben werden. Der zweite Parameter funktioniert im Moment noch nicht, da sich SQLite noch im Anfangsstadium befindet.
Diese Funktion übergeben wir eine Variable, diese dient uns als Filehandle um mit den Querys oder später mit sqlite_close() die richtige Datenbank Datei anzusprechen.

Über sqlite_close() wird die Datei wiedergeschlossen.

Als nächstes folgt eine Abfrage aus der Datenbank (dieses Beispiel ist quick'n'dirty!!)

$db = sqlite_open('Datei.sqlite',0666,$error);
$q = sqlite_query($db, "SELECT * FROM test");
 if(sqlite_num_rows($q))
 {
  while($abfrage = sqlite_fetch_array($q))
  {
   print_r($abfrage);
  }
 }
sqlite_close($db);


Wir führen wie in SQL eine Query aus, diese funktioniert ähnlich wie mySQL und ist auch von den Befehlen her ähnlich (Wichtig: Ein noch großer Nachteil ist bei SQLite, der nicht vorhandene ALTER Befehl, eine bestehende Tabelle kann nur umständlich verändert werden (Tabelle kopieren, alte Tabelle löschen, neue Tabelle erstellen, Kopie in neue Tabelle einfügen)).
Mit sqlite_num_rows ermitteln wir die Zahl der Datensätze, sollte kein Datensatz vorhanden sein könnte noch ein else-Zweig eingefügt werden. Über sqlite_fetch_array erhalten wir das Ergebnis zurück, das Array sieht etwas anders aus als bei mySQL

mySQL
Array ( ['Spalte1'] => ‘Wert1', ['Spalte2'] => ‘Wert2' )

SQLite
Array ( [0] => ‘Wert1', ['Spalte1'] => ‘Wert1', [1] => ‘Wert2', ['Spalte2'] => ‘Wert2' )

Also im Gegensatz zu mySQL werden die Datensätze bei SQLite nicht nur nach Spaltennamen sondern auch nach nummerischer Reihenfolge gespeichert (dies hat Vor- und Nachteile)

Nachdem die Grundlagen besprochen wurden, gilt es den wichtigsten Befehlssatz zu erlernen.

SELECT * FROM tabelle WHERE Bedingung = 'test' LIMIT 1


Mit SELECT startet eine Abfrage von Datensätzen, gefolgt von den Spaltennamen bzw. * für alle Spalten.

Durch FROM legen wir fest aus welcher Tabelle gelesen wird.

Die WHERE Bedingung ist optional, es können mehrere Bedingungen mit AND oder OR verbunden werden (AND bindet stärker als OR) und die Bedingungen können nicht nur = (gleich) sein, sondern auch != (nicht gleich), like oder not like.
Bei den letzten zwei Arten sollte mit dem Platzhalter % gearbeitet werden um ein richtiges Ergebnis zu erhalten.

Mit Hilfe von LIMIT werden die Suchergebnisse eingeschränkt oder z.B. bei UPDATE oder DELETE Befehlen die betroffenen Datensätze eingeschränkt.
LIMIT 1 = 1 Datensatz, vom allerersten Datensatz an
LIMIT 1,1 = 1 Datensatz, vom 1 Datensatz (0 wäre der erste Datensatz)

INSERT tabelle (Bedingung) VALUES ('test')

INSERT fügt einen neuen Datensatz in die Tabelle tabelle ein und belegt die Zelle Bedingungen mit dem Wert test

UPDATE tabelle SET Bedingung = 'kein Test'

UPDATE ändert den Datensatz, in diesem Beispiel wären alle Daten aus der Tabelle betroffen, es sollte auf jedenfall mit WHERE und LIMIT gearbeitet werden.

DELETE FROM tabelle

DELETE löscht einen Datensatz, in diesem Fall wird die gesamte Tabelle geleert, auch hier sollte mit WHERE und LIMIT gearbeitet werden.

Ein wichtige Hinweis noch zum Schluss:
SQLite ist zwar praktisch, da kein Datenbank-Server benötigt wird, aber vermeidet es die Daten übers Netzwerk schreiben zu lassen,
es gibt zu viele Störfaktoren und eventuell können Datenverluste auftreten.