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:
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.
ReadIniSections(string filename[, boolean sort])
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,
wieder ausgelesen werden. Dadurch
sectionname, itemname));
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
begrenzt. Zu beachten ist hierbei, daß durch urlencode()
Zeichen
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.