Datenbankanbindung ohne Datenbank - *.ini Dateien und PHP Mit PHP ist es kein Problem, etwas in eine Datei zu schreiben oder aus einer Datei zu lesen. Und wenn man an die *.ini - Dateien denkt, hat man schon eine einfache Möglichkeit Daten abzulegen. Hier wird gezeigt, wie Sie anhand eines kleinen Funktionspaket *.ini - Dateien in PHP als Datenbanken nutzen können.

Wer PHP einsetzen kann hat oftmals keine MySQL Datenbank zur Verfügung. Und nicht jeder ist bereit, nur für die Nutzung einer Datenbank ein Vielfaches der normalen PHP-Miete auf den Tisch des Providers zu legen.

Insbesondere bei sehr geringer Nutzung einer Datenbank ist dies nicht einzusehen, aber wie entkommt man dem Dilemma? Die Lösung ist, wie in vielen Fällen, recht einfach, zumindest mit PHP.

Mit PHP ist es kein Problem, etwas in eine Datei zu schreiben oder aus einer Datei zu lesen. Und wenn man sich jetzt an die 'guten alten' INI-Dateien erinnert, hat man das Problem schon so gut wie behoben. Werfen wir doch mal einen Blick auf den Aufbau einer INI-Datei:


[Section 1]
item1=value1

[Section 2]
item1=value1
item2=value2

...

Wenn man sich diesen Aufbau genauer anschaut erkennt man, daß er sich eigentlich nicht von dem einer Datenbank unterscheidet (Es gibt unterschiedliche Definitionen einer Datenbank. Bei der sehr allgemeinen Definition ist dies eine Datenbank). Wie man persönlich die INI-Datei aufbaut ist natürlich jedem selbst überlassen. Man kann einem Item ja auch mehrere, zum Beispiel durch ':' getrennte Werte zuordnen.

Was in PHP fehlt sind Funktionen, um mit solchen INI-Dateien zu arbeiten. Aber das ist ja genau der Grund für diesen Artikel. Im Folgenden stelle ich Funktionen vor, die die Arbeit mit INI-Dateien ermöglichen und somit datenbankähnliche Operationen ermöglichen (lesen, schreiben, umbenennen, löschen).

Sämtliche Funktionen sind in einer Datei abgelegt (ini.fct), so daß diese lediglich per require("ini.fct") in die entsprechenden PHP-Seiten eingebunden werden braucht. Die komplette Datei gibt es auch in der jeweils aktuellen Version zum download (rechter Mausklick und 'Speichern unter').

Eine PHP-Datei, in der die Funtionen eingebunden werden sollen, könnte beispielsweise so aussehen:

<html>
<head>
<?php
  require("inc.fct");
?>
<title>Meine Homepage</title>
</head>
<body>
Hier können die Funktionen aufgerufen werden.
</body>
</html>

Die eigentlichen Funktionen sind:

ReadIniSections(string filename[, boolean sort])

Der Rückgabewert der Funktion ist ein Array mit allen Sections einer Ini-Datei. Wenn keine Section gefunden wurde oder die Ini-Datei nicht existiert, wird FALSE zurückgegeben.

Als zweiter Parameter kann angegeben werden, ob die zurückgegebenen Sections alphabethisch sortiert werden sollen (TRUE). Wenn dieser Parameter nicht angegeben wird, werden die Sections nicht sortiert (default ist FALSE).

Beispiel:

...
$MyArray = ReadIniSections("my.ini");
for ($i = 0; $i < count($MyArray); $i++) {
  echo $MyArray[$i] . "<br>\n";
}
...

Dieses Beispiel liest alle Sections der INI-Datei "my.ini" aus dem gleichen Verzeichnis aus und schreibt sie in der Reihenfolge wie sie in der INI-Datei vorkommen in die PHP-Datei.

ReadIniItems(string filename, string sectionname[, boolean sort])

Der Rückgabewert der Funktion ist ein Array mit allen Items einer Section. Wenn kein Item gefunden wurde oder die Ini-Datei nicht existiert, wird FALSE zurückgegeben.

Auch hier kann als zweiter Parameter angegeben werden, ob die zurückgegebenen Items alphabethisch sortiert werden sollen (TRUE). Wenn dieser Parameter nicht angegeben wird, werden die Items nicht sortiert (default ist FALSE).

Beispiel:

...
$MyArray = ReadIniItems("/home/databases/my.ini", "Meine Section", TRUE);
for ($i = 0; $i < count($MyArray); $i++) {
  echo $MyArray[$i] . "<br>\n";
}

...

Dieses Beispiel liest alle Items der Section "Meine Section" aus der INI-Datei "my.ini", die sich in dem physischen Verzeichnis "/home/databases" befindet und schreibt diese alphabetisch sortiert in die PHP-Datei.

ReadIniValue(string filename, string sectionname, string itemname)

Der Rückgabewert der Funktion ist der Wert eines Items einer Section. Wenn die Ini-Datei oder das Item nicht existiert, wird ein leerer String zurückgegeben.

Beispiel:

...
$MyField = ReadIniValue("my.ini", "Meine Section", "Feld 1");
echo $MyField . "<br>\n";

...

Dieses Beispiel liest aus der Section "Meine Section" den Wert des Items "Feld 1" aus und schreibt diesen Wert in die PHP-Datei.

WriteIniValue(string filename, string sectionname, string itemname, string value)

Der Rückgabewert der Funktion ist TRUE, wenn der item=value Eintrag geschrieben wurde, ansonsten FALSE.

Wenn die Ini-Datei, Section oder Item nicht existieren, werden sie angelegt. Wenn der Pfad nicht existiert, wird keine Ini-Datei angelegt und FALSE zurückgegeben.

Beispiel:

...
$MyText = "Irgend etwas gescheites. ;-)"
if (WriteIniValue("my.ini", "Meine Section", "Feld 1", $MyText)) {
  echo "Es wurde was gescheites in die INI-Datei geschrieben.";
} else {
  echo "Es wurde nix geschrieben.";
}

...

Dieses Beispiel weist in der INI-Datei "my.ini" unter der Section "Meine Section" dem Item "Feld 1" den Wert aus $MyText zu. Das if-Statement ist hier nicht erforderlich, aber zur Prüfung, ob überhaupt etwas geschrieben wurde, nützlich.

DeleteIniItem(string filename, string sectionname, string itemname)

Der Rückgabewert der Funktion ist TRUE, wenn das Item gelöscht wurde, ansonsten FALSE, zum Beispiel wenn das Item oder die Ini-Datei nicht existieren.

Beispiel:

...
if (DeleteIniItem("my.ini", "Meine Section", "Feld 1")) {
  echo "Item wurde gelöscht.";
} else {
  echo "Item konnte nicht gelöscht werden.";
}

...

Dieses Beispiel löscht aus der INI-Datei "my.ini" unter der Section "Meine Section" das Item "Feld 1". Auch hier ist das if-Statement nicht erforderlich, aber zur Prüfung nützlich.

DeleteIniSection(string filename, string sectionname[, boolean recursive[, boolean DeleteIfEmpty])

Der Rückgabewert der Funktion ist TRUE, wenn die Section gelöscht wurde, ansonsten FALSE, zum Beispiel wenn die Section nicht gefunden wurde.

Wenn innerhalb der Section noch Items existieren, wird die Section nur gelöscht, wenn als dritter Parameter "TRUE" angegeben wird. Ansonsten wird die Section nicht gelöscht und FALSE zurückgegeben. Wenn die zu löschende Section die letzte Section der Datei ist und als vierter Parameter "TRUE" angegeben wird, wird auch die Ini-Datei gelöscht, auch wenn noch Kommentarzeilen enthalten sind.

Beispiel:

...
DeleteIniSection("my.ini", "Meine Section", TRUE)
...

Dieses Beispiel löscht aus der INI-Datei "my.ini" die Section "Meine Section". Die Section wird auch gelöscht, wenn noch Items in der Section vorhanden sind. Eine Prüfung, ob das Löschen erfolgreich war, findet hier nicht statt.

RenameIniSection(string filename, string old sectionname, string new sectionname)

Der Rückgabewert der Funktion ist TRUE, wenn die Section umbenannt wurde, ansonsten FALSE, zum Beispiel wenn die Section nicht gefunden wurde.

Beispiel:

...
RenameIniSection("my.ini", "Meine Section", "Andere Section")
...

Dieses Beispiel benennt die Section "Meine Section" aus der INI-Datei "my.ini" in "Andere Section" um. Eine Prüfung, ob das Umbenennen erfolgreich war, findet hier nicht statt.

MoveSection(string filename, string section[, string direction[, int UpperOffset[, int LowerOfset]]])

Der Rückgabewert der Funktion ist TRUE, wenn die Section verschoben wurde, ansonsten FALSE, zum Beispiel wenn die Section nicht gefunden wurde oder eine nicht erlaubte Operation versucht wurde (erste Section nach oben verschieben).

Neben der Angabe der INI-Datei "inifile" wird die Section "section" erwartete, die verschoben werden soll. Wird "up" angegeben, wird die Section nach oben verschoben. Bei "down" (oder jedem anderen Wert), wird die Section nach unten verschoben (default).

Mit den beiden Offsetangaben "UpperOffset" und "LowerOffset" können Sections am Anfang oder Ende der Datei ausgespart werden. Die ist zum Beispiel nützlich, wenn man am Anfang oder Ende der INI-Datei zum Beispiel besondere Einträge wie Konfiguration zur INI-Datei oder Log-Daten stehen hat, die bei dem Verschieben nicht berücksichtigt werden sollen, also ihre Position nicht verändern dürfen.

Beispiel:

...
$inifile = "myIni.ini";
$section = "1023";
$direction = "up";
MoveSection($inifile, $section, $direction, 1);

...

Dieses Beispiel verschiebt die Section "1023" aus der Datei "myIni.ini" eine Position nach oben. Die erste Section (eventuell Konfigurationseinstellungen) wird nicht berücksichtigt. Das bedeutet mit anderen Worten, das "section" in der physischen INI-Datei nie auf die erste Stelle rücken kann.

CleanIni(string filename)

Der Rückgabewert der Funktion ist FALSE, wenn die angegebene Datei nicht gefunden wurde, ansonsten TRUE und alle mehrfach vorkommenden Leerzeilen werden gelöscht.

Beispiel:

...
CleanIni("my.ini")
...

Dieses Beispiel ersetzt mehrfach vorkommende Leerzeilen in der Datei "my.ini" durch eine einzelne.

Wie schon bei den Funktionen WriteIniValue() und DeleteIniSection() erwähnt, wird die INI-Datei automatisch angelegt oder gelöscht. Hierzu müssen natürlich Schreibrechte für das Verzeichnis bestehen, in dem die INI-Datei angelegt oder gelöscht werden soll. Dieses Verzeichnis sollte nicht unterhalb des Document Root liegen, sonder außerhalb.

Innerhalb der INI-Datei sind Kommentare erkaubt. Welches Zeichen als Kommentarzeichen interpretiert wird, wird am Anfang der ini.fct unter 'Global Constants' festgelegt. Normalerweise ist es das Semikolon ';'. Dies kann aber den eigenen Bedürfnisen angepasst werden. Funktionen, um gezielt Kommentare einzufügen, zu ändern oder zu löschen, gibt es hier nicht. Kommentare müssen 'von Hand' angelegt und bearbeitet werden.

Das Kommentarzeichen muß als erstes Zeichen in einer Zeile stehen. Whitespaces (Tabs oder Leerzeichen) sind als Außnahme erlaubt und können vor dem Kommentarzeichen stehen. Es ist aber bei der Verwendung von Kommentaren zu bedenken, daß diese mit der INI-Datei gelöscht werden, wenn die letzte Section gelöscht wird.

Manchmal möchte man auch längeren Text zum Beispiel aus einem Textfeld speichern. Da hier Zeilenumbrüche enthalten sein können, würden diese die Struktur der INI-Datei zerstören. Längere Texte (mit möglichen Zeilenumbrüchen) müssen mit urlencode(WriteIniVaue(filename, sectionname, itemname, value));
in die INI-Datei geschrieben und mit urldecode(ReadIniValue(filename, sectionname, itemname)); wieder ausgelesen werden. Dadurch werden die Zeilenumbrüche codiert in die Section geschrieben, und wieder durch urldecode() beim Auslesen decodiert.

Die Länge des Textes (genaugenommen einer Zeile) ist auf 4.096 Zeichen begrenzt. Zu beachten ist hierbei, daß durch urlencode() der Text länger wird. Unter normalen Umständen sollten 4.096 Zeichen reichen. Dies kann aber bei Bedarf in der ini.fct unter den Global Constants angepaßt werden (_LineLength_).

In den Erklärungen der einzelnen Funktionen in der ini.fct wird meistens empfohlen, die Funktion mit einem if-Statemaent aufzurufen. Dies ist kein Muss, sondern lediglich eine Empfehlung, da hierdurch festgestellt werden kann, ob die Funktion auch das gemacht hat, was sie sollte.

Den kompletten Source-Code der ini.fct kann hier per rechten Mausklick und "Speichern unter" abgegriffen werden. ;-)

Die Funtkionen dürfen frei verwendet werden, also auch unverändert (ja, auch der Copyrighthinweis sollte erhalten bleiben. ;-)) weiterverteilt werden, aber nicht ohne die ausdrückliche Genehmigung des Autors veröffentlicht werden. Die Benutzung erfolgt allerdings auf eigene Gefahr.

Bookmark setzen... These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Bloglines
  • MisterWong
  • MySpace
  • Reddit
  • SEOigg
  • Technorati
  • TwitThis
  • Y!GG
  • Google Bookmarks

Weiterführende Links: