Hello,
hier nochmal extra für dich mit Kommentaren und der Funktion delete_entry
Bitte geh nochmal in dich, was ich Dir mit meinem Vorschlag wohl sagen wollte. Du lieferst hier einfach zuviel Code ab, in einem unmöglichen Format, also nur sehr schwer lesbar.
Ich interessierte mich nur für die Funktion, die die Löschaufgabe hat.
01 function delete_entry ($filename, $entryname)
02 {
03 $filename = $datei;
04 $entryname = $cwid;
05 unset($zeile[$cwid]);
06 trim($zeile);
07 $newfp = fopen($datei,"w");
08 //Alle zeilen in die Variable $newcontent schreiben und $newcontent dann in datei schreiben
09 $newcontent = implode("",$zeile);
10 fputs($newfp,$newcontent);
11 fputs($newfp,"\n");
12 fclose($newfp);
13 }
03 Woher kommt die Varibale $datei? Eine Funktion hat einen eigenen
Namensraum. Du scheinst also keine Fehlermeldungen eingeschaltet
zu haben, sonst müsstest Du mindestens eine Warnung bekommen
04 dito.
Außerdem überschreibst Du mit der Zuweisung dein Funktionsargument
$entryname. Dann hättest Du es nicht zu übergeben brauchen.
05 woher kommt das Array (oder der String) $zeile?
06 Warum wird das Array mit trim() behandelt?
07 damit wird die Datei $datei gelöscht, wenn sie vorhanden war, und
als leere datei neu angelegt. Aber woher kommt $datei?
08 Jede Zeile entspricht doch einem Datensatz. Wie trennst Du die
Datensätze voneinander? Ich sehe keine Behandlung für das Zeilenende-
zeichen (als Datensatztrenner).
Keine Fehlerbehandlung
Keine Dateisperrung, also kein sauberer Multiuserbetrieb möglich
Generell! Die Funktion sollte folgendes leisten:
Datei öffnen im nichtzerstörenden Modus
Wenn sie nicht vorhanden war, anlegen
Erfolgskontrolle
Datei sperren mit Warten (ist für den Anfang einfacher...)
Erfolgskontrolle hier nicht notwendig, weil die Sperrfunktion
soweiso so lange wartet, bis sie erfolgreich war oder ScriptTimeout
Dateizeiger auf Anfang
Datei vollständig auslesen mit fread()
Stream in Array umwandeln --> unserialize()
Arrayelement löschen, wenn es vorhanden ist
Array wieder in Stream umwandeln --> serialize()
Dateizeiger auf Anfang
Array wegschreiben
Datei auf die Länge des Streams kürzen --> ftruncate
Datei schließen (Sperre wird damit automatisch aufgelöst)
Funktionsergenis zurückgeben --> return
Jeder Zugriff auf die Datei muss mit Locking arbeiten, auch wenn Du nur lesen willst. Insbesondere muss für eine Veränderung von Daten die Datei innerhalb des LOCK vollständig gelesen und geschrieben werden. Alle anderen Varianten sind fehlerträchtig.
Nun versuche bitte mal, meinen Pseudocode für die Funktion in PHP umzusetzen. Wenn es dabei dann noch Probleme gibt, stehe ich Dir gerne zur Verfügung.
Liebe Grüße aus http://www.braunschweig.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen