Markus Clos: Verwaltung von Gästebuch-Einträgen

Guten Morgen, liebes Forum,

Entschuldigt bitte vielmals die Länge meines Postings, aber ich muss weiter ausholen, um Missverständnissen vorzubeugen:

Meinem Problem liegt folgende Ausgangssituation zugrunde:

Ich habe, nach erfolgreicher Anmeldung als Administrator, folgende Dateien, die "zusammenspielen":

GaestebuchAdmin.php
   (Diese Datei kümmert sich um die Steuerung der Aktionen über
    den switch-Befehl)

FunktionenGaestebuchAdmin.php
   (Hier gebe ich alle Einträge der CSV-Datei "Eintraege.csv" aus.
    Jeder Eintrag wird für die Verwaltung, wie Eintrag
    kommentieren, Eintrag ändern oder auch Eintrag löschen,
    um entsprechende Schaltflächen erweitert:
      <input name="..." type="image" ...>
    Desweiteren kümmert sich diese Datei um alle Meldungen, die mit
    der Verwaltung zusammenhängen, wie Sicherheitsabfragen.)

FunktionenGaestebuchAdmin.js
   (Dazu später genauere Details)

Leider habe ich, für mich, noch keine andere funktionierende Möglichkeit habe, auf die verschiedenen Aktionen (Eintrag kommentieren, Eintrag ändern, Eintrag löschen, etc.) zu reagieren, als mit versteckten Feldern zu arbeiten.

Die Einträge werden innerhalb des <form>-Tags ausgegeben, da ich sonst auf die versteckten Felder nicht reagieren kann.

Im <form>-Tag kann ich jetzt zwar das Ziel des Formulares eingeben (in meinem Fall immer die Datei selber), die Einrichtung der versteckten Felder gestaltet sich aber schwierig, da ich ja unterscheiden muss, ob ich einen Eintrag kommentieren, ändern oder löschen will.

Die einzige Möglichkeit, die sich hier für mich eröffnet, ist, bei Anklicken einer Schaltfläche eine entsprechende Javascript-Funktion aufzurufen, die dann die zugehörigen versteckten Felder erzeugt.

<form action="GaestebuchAdmini.php"
      method="post"
      onsubmit="return VersteckteFelderErzeugen (Aktion)">

Diesen Umstand wollte ich in der JS-Datei "FunktionenGaestebuchAdmin.js" berücksichtigen:

function VersteckteFelderErzeugen (Aktion)
{
  switch (Aktion)
  {
    case "EintragKommentieren":
    {
      document.write ('<input type="hidden" name="Aktion" value="EintragKommentieren">');
      document.write ('<input type="hidden" name="FormularGesendet" value="0">');
      break;
    }
    case "..."
    {
      ...
    }
    ...
  }
}

Der zugehörige Link bei den einzelnen Einträgen ist innerhalb der Datei "FunktionenGaestebuchAdmin.php" folgendermassen definiert:

echo '<input type="image"
             src="..."
             onclick="VersteckteFelderErzeugen ('EintragKommentieren')">';

Aber leider funktioniert mein Vorhaben nicht.

Ich bekomme die Fehlermeldung, dass das ein unerwarteter Aufruf oder Zugriff erfolgt ist.

Wo liegt der Fehler ?

Gibt es für mein Vorhaben desweiteren nicht eine andere Variante, bei der ich einfacher, übersichtlicher und damit auch weniger fehleranfällig auf verschiedene Aktionen reagieren kann ?

Vielen Dank für Eure Antworten.

Mit freundlichem Gruss, Marcus Clos

  1. Morsche.

    Bei meinem Gästebuch benutze ich mehrere Submit-Buttons für die verschiedenen Aktionen.
    Da diese wie die anderen Felder des Formulars mitgeschickt werden, kann ich so überprüfen, welche Aktion ausgeführt werden soll.

    MfG _Siro

  2. Hello,

    wenn ich DIch richtig verstanden habe, willst Du also die Gästebuchdaten bearbeiten.
    Dazu öffnest Du die Datei und zeigst sie an.

    Wenn diese Aktionen von mehreren Usern konkurrierend vorgenommen werden sollen, wird es selbst für mache Fortgeschrittene noch verwirrend kompliziert. Also gehen wir für den Anfang mal davon aus, dass es nur einen einzigen Bearbeiter gibt und alle Anderen nur Daten hinten anhängen dürfen.

    Welche Aktionen sind erlaubt?

    Liste:

    • generischer Aufruf der Liste (keine gültigen Parameter)
    • Seite zurück                 (Seitennummer)
    • Seite vor                    (Seitennummer)
    • Datensatz auswählen          (Satznummer, Seitennummer)

    Einzeldatensatz:

    • generischer Aufruf           (keine Satznummer)        --> leeres Formular
    • Datensatz eintragen          (Satznummer)              --> zurück zur Liste oder leeres
                                                                   Formular mit Erfolgsmeldung
    • Datensatz editieren          (Satznummer)
    • Datensatz löschen            (Satznummer)
    • Zurück zur Liste             (Seitennummer)

    Grundsätzlich werden die Aktionen in jedem Formular durch unterschiedliche Submit-Buttons angestoßen. Die Parameter solltest Du in der Session speichern für jeden Formluartyp. Dadurch ist es auch möglich, die unterschiedlichen Vorgänge zu "stapeln" und der User kann keine Fehler machen.

    Dass zur Durchführung jedes Vorganges natürlich vorher die Rechte des Users geprüft werden müssen, versteht sich von selbst.

    Zum Bearbeiten der Datei:

    Du benötigst dafür möglichst eine eindeutige ID im Datensatz, die beim Anlegen (Anfügen) mittels Zählerdatei erzeugt wird und in den Satz (ggf. als verdecktes Feld) eingefügt wird. Bei der Einzelanzeige wird diese ID nun im Vorgang (in der Session) gespeichert. Zur Kontrolle kannst Du sie auch als Hidden-Feld mit ausgeben. Wenn nun der "Änderungen speichern"-Button gedrückt wird, kannst Du die ID des Satzes ermitteln und den Datensatz in der Datei überschreiben.

    Da Du eine CSV-Datei benutzt, musst Du

    Datensatz vorbereiten --> die CSV-Quot-Zeichen müssen durch Doppelung maskiert werden

    Dateihandle besorgen
    Warten bis Exclusive-Lock erteilt wird
    Datei vollständig einlesen
    Betroffenen Satz aus dem Array der Sätze ermitteln
    Betroffenen Satz ändern
    Alle Datensätze zurückschreiben
    Datei schließen (und damit automatisch wieder freigeben)

    Man kann bei großen CSV-Dateien auch zeilenweise lesen und Satzweise wieder zurückschreiben
    Allerdings musst Du dann auch alle Zeilen lesen und ab dem geänderten Satz auch wieder zurückschreiben. Wenn Du mit derselben Datei arbeiten willst merkst Du Dir immer vor dem Satzlesen den Satzzeiger und stellst ihn vor dem Beginn des Zurückschreibens auf die letzete Position zurück. Du kannst auf Linux-Systemen auch mit einer Backup-Datei arbeiten, die dann einfach umbenannt wird.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo Tom,

      Du hast mich richtig verstanden.

      Deine ausführlichen Stichworte machen einen sehr fundierten Eindruck.
      Jetzt stehe ich nur vor dem Problem, sie auch umzusetzen.

      Wie sollte ich da der Reihe nach optimalerweise voegehen ?

      Gruss, Marcus Clos

      1. Hello,

        Wie sollte ich da der Reihe nach optimalerweise voegehen ?

        Dich dafür entscheiden, ob Du grundsätzlich mit Session arbeiten willst
        Dir kleine Bildchen malen, welche Formulare es geben soll (Metachartverfahren)
        Die Buttons und Felder, die nur dem Admin zur Verfügung stehen, rot anmalen
        Die Buttons und Felder, die ein User bei eigenen Datensätzen erhält, blau anmalen
          (es könnte ja sein, dass ein authentifizierter User seinem Eintrag später noch etwas
           hinzufügen darf)

        Jeder Formularart einen Datenbereich in der Session zuteilen. Auf dem Client erscheint dann nur ein Abbild dieser Sessiondaten.

        Alle geholten Daten (aus Tebellen /Dateien) erst in die Session eintragen und von da aus ins Formular übertragen.

        Du musst entscheiden, ob Formulare reentrant sein dürfen. Das bedeutet, dass der Client das Formular doppelt öffnen darf mit voneinander unabhängigen Daten. Dann muss Du das in der Session-Struktur berücksichtigen. Es muss dann für jede Instanz des Forms eine Instanz an Sessiondaten bereitstehen.

        Für den Anfang würde ich darauf aber erstmal verzeichten. Allerdings bekommt jedes Formular ein Hiddenfield mit einer Unique-ID mit ausgeliefert und wenn es schon einmal da war (das merkt man beim Versuch die Daten für das Formular in der Session vorzubereiten) dann bekommt der user die vorhandenen Daten, die neue Unique_ID wird eingetragen in der Session und mit ausgeliefert und er erhält eine Warnung, dass die ältere ID von hh:mm:ss nicht mehr gültig ist.

        Jder Post des Formulars prüft also erst die Formularnummer, die Unique-ID, die Userrechte für die gewünschte Aktion, ob die Datenfelder im Post auch mit denen in der Session übereinstimmen, dann wird festgestellt, welche Aktion durchgeführt werden soll und die Aktion wird durchgeführt (versucht durchzuführen). Wenn ein Fehler aufgetreten ist, wird das entsprechende Feld $Fehlermeldung in der Session gefüllt, ggf.noch Daten aktualisiert, die Unique-ID und der Timestamp aktualisiert, und die Ausgabefunktion für das Form aufgerufen.

        Was muss die Ausgabefunktion können?
        Design des Forms anziehen (Class="Edit", Class="showonly", Class="ADMIN" ...)
        Letzte Statusmeldung (Fehlermeldung) anzeigen
        Alle relevanten Felder und deren Bezeichner anzeigen  (aus der Session holen)
        Unique-ID und Formulartyp als Hidden-Fields ausgeben
        Alle relevanten Buttons erzeugen und ausgeben (ob sie vorhanden sind, steht in der Session)

        Was benötigt die Ausgebefunktion dafür?
        Eigentlich nur den Zeiger auf den passenden Session-Datenblock
        Alle Anzeigevorschriften für die unterschiedlichen Feldtypen und für die Buttons

        Da den verschiedenen Usern für jedes Formular nur bestimmte Daten und bestimmte Aktionen zur Verfügung stehen, kann man sich das mittels einer eigenen INI-Datei bereitstellen.

        Da schau Dir mal pars_ini_file() http://de2.php.net/manual/de/function.parse-ini-file.php an.
        Da könntest Du eien Datei anlegen

        Das soll für den Anfang genügen, aber ich melde mich nochmal.
        Ich muss mal ein bisschen mit dem Ini-File spielen

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau