|
Gut ist derjenige dran, der nicht nur PHP auf seiner Web-Site einsetzen kann, sondern auch
eine Datenbankanbindung hat. Aber 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. Bei mir 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.
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 Muß, 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 meine Genehmigung veröffentlicht
werden. Die Benutzung erfolgt allerdings auf eigene Gefahr, wie das bei kostenloser Soft so üblich ist. ;-)
|