arrayelement wird nicht gelöscht...
azok
- php
hi!
...ja, ich arbeite noch immer an meinem weblog. - leider habe ich hier ein problem, auf das ich keine lösung finde...:
$clid = $_GET['clid'];
$open_file = @fopen($file,'a')
or die("Konnte Datei <b>$open_file</b> nicht öffnen");
flock($open_file,2);
$file_array = file($file);
foreach($file_array as $key => $value) { #array mit der betreffenden clid heraussuchen
if(strpos($value, $clid) !== false) {
$comment_edit = $file_array[$key]; #dieses in variable speichern
unset($file_array[$key]); #sofort löschen
}
}
die variable $comment_edit wird mir brav gefüllt. leider wird danach aber das element nicht gelöscht... - vielleicht habe ich hier aber auch einen denkfehler... naja, ich komm einfach nicht drauf. wäre froh, wenn mir wer helfen kann!
lg
azok
Hello,
Wo soll das Element denn gelöscht werden und wie stellst Du fest, dass es nicht passiert ist?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
hi!
also, ich habe mir eine "funktion" geschrieben, wo einzelne kommentare vom administrator kommentiert werden können. dazu wird das betreffende element, welches über die id (clid), die über die url übergeben wird in der foreach schleife in eine variable geschrieben (zuerst wird das ausgangsfile im modus "a" geöffnet, gesperrt, danach entsperrt und geschlossen), und danach sofort gelöscht. dann wird die variable exploded also, es werden die delimiter | entfernt und demnach alle einträge dazwischen in ein array eingelesen. danach wird das betreffende array element (der text) in eine textbox geschrieben. dort kann der verändert werden. mittels post werden dann die alten variablen in hidden-fields übergeben, nur nicht die alte text variable, die durch den neu eingegebenen text ersetzt wird, also das betreffende kommentar wird neu zusammengesetzt:
$id.DELIMITER.$name.DELIMITER.$neuer_text... ."\n";
anschließend wird das ursprungsfile geöffnet, gesperrt, das neue kommentar hineingeschrieben (param. "a"), entsperrt, geschlossen.
dass es nicht gelöscht wurde, erkenne ich daran, dass dann der eintrag doppelt vorhanden ist. - als alter sowie als neuer
lg
azok
Hello,
anschließend wird das ursprungsfile geöffnet, gesperrt, das neue kommentar hineingeschrieben (param. "a"), entsperrt, geschlossen.
Das "a" könnte das Problem sein. Bei älteren PHP-Versionen hatte der Modus "a" bei Windows und bei Linux noch unterscheidliche Wirkung, aber inzwischen lässt sich der Dateizeiger einheitlich nicht mehr zum Schreiben vom Fileende wegbewegen, egal ob bei Linux oder WinDOS.
Du müsstest zum Schreiben also "rb+" benutzen oder "wb+", wenn das File ganz neu geschreiben werden soll.
Generell hast Du wahrscheinlich ein "akademisches" Problem.
Deine Datensätze sollten zu Sicherheit alle eine Unique-ID tragen.
Wenn Du nun einen Datensatz ändern willst, passiert folgendes:
Datei öffnen und read-locken
Datensätze lesen inclusive Unique-ID
Datei schließen
Datensätze im Formular anzeigen
Datensatz markieren und Post
Datei öffnen und read-locken
Datensatz suchen
Datei schließen
Datensatz anzeigen im Fomular
Datensatz ändern
Post mit neuen Daten und Unique-ID
Datei öffnen und exclusive locken
Datensatz mit ID suchen
Datensatz austauschen oder löschen (je nach Auftrag)
Es muss eine neue Unique-ID vergeben werden!
Datei schließen
Erfolgs- oder Misserfolgsmeldung
Für den Fall, dass ein anderer berechtigter User den betroffenen Datensatz vor Dir zurückgeschreiben hat, hat der ja eine neue ID beim Schreiben bekommen. Wenn Du jetzt Deine Version zurückschreiben willst, passt die ID nicht mehr und Du kannst eine Fehlermeldung ausgeben, den DS ggf. auch neu lesen und nochmals vorlegen, oder oder oder
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
hi!
zzt habe ich es so gelöst, dass ich den betreffenden datensatz zunächst über foreach in eine variable übernehme, die anderen in eine lokale datei kopiere. dann wird die ursprungsfile glelöscht und die lokale datei in den namen der ursprungsdatei umbenannt. anschließend wird der datensatz nach den delimitern exploded und das text-element in das formular geladen. dort kann man änderungen vornehmen, bei der bestätigung durch 'ok' wird dann der neue datensatz ins file geschrieben.
lg
azok
Hallo,
$clid = $_GET['clid'];
$open_file = @fopen($file,'a')
or die("Konnte Datei <b>$open_file</b> nicht öffnen");
flock($open_file,2);
$file_array = file($file);
foreach($file_array as $key => $value) { #array mit der betreffenden clid heraussuchen
if(strpos($value, $clid) !== false) {
$comment_edit = $file_array[$key]; #dieses in variable speichern
unset($file_array[$key]); #sofort löschen
^siehe Anmerkung
}
}
>
Anmerkung:
<http://de.php.net/manual/de/control-structures.foreach.php>
...
Anmerkung: Beachten Sie auch, dass foreach mit einer Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. Deshalb wird auch der Arrayzeiger nicht wie bei dem each()-Konstrukt verändert und Veränderungen an ausgegebenen Arrayelementen haben keine Auswirkung auf das originale Array. Trotzdem wird der interne Arrayzeiger des originalen Arrays bei der Verarbeitung bewegt. Angenommen, die foreach-Schleife ist komplett abgearbeitet, wird der interne Arrayzeiger (des originalen Arrays) auf das letzte Element zeigen.
...
viele Grüße
Axel
Hello,
$clid = $_GET['clid'];
$open_file = @fopen($file,'a')
or die("Konnte Datei <b>$open_file</b> nicht öffnen");
flock($open_file,2);
$file_array = file($file);
foreach($file_array as $key => $value) { #array mit der betreffenden clid heraussuchen
if(strpos($value, $clid) !== false) {
$comment_edit = $file_array[$key]; #dieses in variable speichern
unset($file_array[$key]); #sofort löschen
^siehe Anmerkung
}
}
> >
> Anmerkung:
> <http://de.php.net/manual/de/control-structures.foreach.php>
> ...
> Anmerkung: Beachten Sie auch, dass foreach mit einer Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. Deshalb wird auch der Arrayzeiger nicht wie bei dem each()-Konstrukt verändert und Veränderungen an ausgegebenen Arrayelementen haben keine Auswirkung auf das originale Array. Trotzdem wird der interne Arrayzeiger des originalen Arrays bei der Verarbeitung bewegt. Angenommen, die foreach-Schleife ist komplett abgearbeitet, wird der interne Arrayzeiger (des originalen Arrays) auf das letzte Element zeigen.
Das ist hier aber schlecht beschrieben und wahrscheinlich deshalb auch von Dir missverstanden worden. $file\_array (die Adresse, die sich dahinter verbirgt) refernziert hier immer das Original-Array, auch in der foreach()-Schleifenfunktion. Der Passus "Kopie" bezieht sich auf die $value-Elemente. Der "Zeiger" auf die $value-Elemente zeigt jeweils auf eine Kopie der Array-Elementes.
$file\_array[$key] referenziert aber immer das Original-Element.
Intern wickelt PHP das noch anders ab.
Der Fehler muss aber irgendwo anders stecken.
Harzliche Grüße aus <http://www.annerschbarrich.de>
Tom
--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau