Lukas Oklener: Userbereich

Hallo.
Bei meinem Userbereich möchte ich nun, dass jeder seine Adresse selbst ändern kann. Name und Passwort sind in der Session gespeichert, also kann ich in der Benutzerdatei (in der alle Daten enthalten sind) ganz einfach die entsprechende Zeile heraussuchen. Aber wie kann ich nun genau diese Zeile durch neue Daten ersetzen?

Außerdem noch eine zweite Frage
Bisher habe ich mir die Daten immer so ausgelesen:

foreach (file("nutzer.dat") as $zeile) {
$infos = explode("||", trim($zeile));
$username = $infos[0];
$passwort = $infos[1];
$geburtsdatum = $infos[2];
$strasse = $infos[3];
$hausnr = $infos[4];
$plz = $infos[5];
$ort = $infos[6];
$telefon = $infos[7];
$email = $infos[8];

Wie kann ich das etwas verkürzen?
In Perl ging das ganz einfach so:
($var1, $var2, $var3) = split(/||/, "");
Wie mache ich ähnliches in PHP?

Danke,
Lukas

  1. Hallo Lukas!

    In Perl ging das ganz einfach so:
    ($var1, $var2, $var3) = split(/||/, "");

    Bei PHP geht das eigentlich genauso, musst nur vor deine Klammer mit den Variablen ein list schreiben. Sollte dann also ungefähr so aussehen:

    list($var1, $var2, $var3, ...) = explode("||", trim($zeile));

    MfG,
    Mirko Hansen

  2. Aber wie kann ich nun genau diese Zeile durch neue Daten ersetzen?

    Eine Zeile in einer Textdatei lässt sich in der Regel nur dadurch ersetzen, daß die komplette Datei neu geschrieben wird. Der Grund dafür ist schlicht und ergreifend, daß alle Datensätze (Zeilen) in einer Textdatei direkt aufeinander folgen und nur exakt soviel Platz einnehmen, wie sie für ihre Daten benötigen.
    Sind die neuen Daten kürzer, kann man sie zwar noch in den bereits belegten Platz einfügen, sind sie aber länger, muß zwangsläufig ab der Position des belegten Platzes alles neu geschrieben werden.
    Ob sich nun der Aufwand für eine individuelle Platzprüfung gegenüber einem kompletten Neuschreiben lohnt, ist zumindest bei kleineren Datenmengen wohl eher eine Glaubensfrage.

    Eine weitere Möglichkeit wäre, von vornherein für die einzelnen Datenfelder einen bestimmten Platz zu reservieren (und damit auch eine fixe Zeilenlänge zu haben), so daß jeder Datensatz immer an einer exakt berechenbaren Position beginnt und sich auch bei Änderungen nichts überschneiden kann. Dieser Ansatz hat allerdings wiederum den Nachteil, daß entweder Platz verschwendet wird oder einige Daten auf Grund ihrer (unerwarteten) Länge nicht vollständig gespeichert werden können.

    Eine übrigens sehr sinnvolle Alternative sind db-Dateien, mit deren Hilfe Du Datensätze einfach über einen Index lesen und speichern kannst, ohne Dir weitere Gedanken über die eigentliche Verwaltung auf der Platte machen zu müssen.
    Das erspart Dir auch das unnötige Einlesen der gesamten Benutzerliste, obwohl Du nur einen Benutzer benötigst (wie Du es derzeit mit der zitierten foreach..file-Schleife machst).

    Für PHP ist dieser Dateityp in <> beschrieben.

    $infos = explode("||", trim($zeile));
    $username = $infos[0];
    $passwort = $infos[1];

    In Perl ging das ganz einfach so:
    ($var1, $var2, $var3) = split(/||/, "");
    Wie mache ich ähnliches in PHP?

    list() ist Dein Freund:

    list($infos,$user,usw..)=explode("||",..

    Gruß,
      soenk.e

    1. Danke, das mit list() klappt sehr gut!

      Eine übrigens sehr sinnvolle Alternative sind db-Dateien, mit deren Hilfe Du Datensätze einfach über einen Index lesen und speichern kannst, ohne Dir weitere Gedanken über die eigentliche Verwaltung auf der Platte machen zu müssen.
      Das erspart Dir auch das unnötige Einlesen der gesamten Benutzerliste, obwohl Du nur einen Benutzer benötigst (wie Du es derzeit mit der zitierten foreach..file-Schleife machst).

      Für PHP ist dieser Dateityp in <> beschrieben.

      Wo ist er beschrieben? DB-Dateien würden mich dann schon sehr interessieren.
      Und wenn ich es doch mit anderen Dateien mache, ist dann dieser Gedankenweg richtig:
      -Entsprechende Zeile finden
      -Länge des Inhalts vom Dateianfang bis zum Anfang der Zeile auslesen und in einer Variablen speichern
      -Länge der Zeile auslesen
      -Länge vom Zeilenende bis zum Dateiende auslesen und in einer Variablen speichern

      -Den gespeicherten Dateianfang schreiben
      -Die neue Zeile schreiben
      -Das gespeicherte Dateiende schreiben

      Wenn ja, habt ihr noch ein paar Tipps, welche Funktionen, usw. ich dazu bräuchte?

      Danke schon mal,
      Lukas Oklener

      1. Ich bräuchte leider eure Hilfe dabei, da ich es nach vielen Versuchen nicht geschafft habe.
        Wäre einer von euch so nett?

        Lukas Oklener

      2. Für PHP ist dieser Dateityp in <> beschrieben.

        Wo ist er beschrieben? DB-Dateien würden mich dann schon sehr interessieren.

        Verzeihnung, da habe ich wohl gepennt :] Die Seite, auf die ich hinweisen wollte, findet sich in der PHP-Anleitung: http://www.php.net/manual/de/ref.dba.php, "dba Datenbank (dbm-style) Abstraktions-Funktionen".

        Und wenn ich es doch mit anderen Dateien mache, ist dann dieser Gedankenweg richtig:
        -Entsprechende Zeile finden
        -Länge des Inhalts vom Dateianfang bis zum Anfang der Zeile auslesen und in einer Variablen speichern
        -Länge der Zeile auslesen
        -Länge vom Zeilenende bis zum Dateiende auslesen und in einer Variablen speichern

        -Den gespeicherten Dateianfang schreiben
        -Die neue Zeile schreiben
        -Das gespeicherte Dateiende schreiben

        Nicht ganz (oder ich habe Dich falsch verstanden). Der umständliche Weg wäre folgender:

        1. Bis zur gesuchten Zeile einlesen.
        2. Anfangspostion der gesuchten Zeile merken (A).
        3. Vom Ende der gesuchten Zeile bis zum Dateiende komplett einlesen.
        4. An Punkt A (siehe 2.) zurückspringen.
        5. Neue Datenzeile schreiben.
        6. Sofort in 3. gelesenen Dateirest schreiben.

        Variante: Wenn die neue Datenzeilenlänge _kürzer_ ist als alte, in 5. neue Datenzeile schreiben _und_ bis zur Länge der alten mit Füllzeichen (0x0 oder Leerzeichen) auffüllen. Das Lesen (3) und Schreiben (6) des alten Dateirests kann dann entfallen, allerdings muß beim Einlesen unter Umständen auf die Füllzeichen geachtet werden (bzw. die Füllzeichen müssen entsprechend gewählt werden).

        Der einfachste Weg:

        1. Komplette Datei per file() in ein Feld A einlesen.
        2. Gewünschte Zeile suchen und verarbeiten.
        3. Aus Feld A komplette Datei neu schreiben (foreach-Schleife).

        Ob einer der beiden Wege einen markanten Vorteil hat, kann man wie gesagt gerne anzweifeln. Der umständliche Weg erspart zwar den umfangreichen Festplattenzugriff zum kompletten Neuschreiben der Datei beim einfachen Weg, ist aber dafür aufwendiger zu implementieren.

        Gruß,
          soenk.e