Sonderbares Verhalten beim Dateihandling

Sonderbares Verhalten beim Dateihandling

am 14.10.2006 20:26:53 von Andreas Weishaupt

Guten Abend

Ich habe etwas geschrieben, das ein mir nicht erklärbares, unerwartetes
Verhalten hervorruft. Dabei geht es um folgende Fragmente:

// ----- code -----
// create the overview from the list
// remember, line format is: [mov.name] | [id0] [id1] [id2] [id3] [...]
// the id's mentioned belong the users who haven't seen the
// corresponding movie. id0 belongs to the user who has added the movie
function trimArrElements (&$val, $key) {
$val = trim ($val);
}

function movGetList() {
$fp = fopen (MOV_LIST_FILE, "r");
if ($fp) {
while (!feof ($fp)) {
$tline = trim (fgets ($fp));
if ($tline != "") {
$tarrMov = explode ("|", $tline);
$tarrIds = explode (" ", trim ($tarrMov[1]));
$tindex = trim ($tarrMov[0]);
$tarrMovList[$tindex] = $tarrIds;
array_walk ($tarrMovList[$index], 'trimArrElements');
}
}
}
fclose ($fp);
return $tarrMovList;
}

function movAddToList (&$list, $name, $id) {
$list = $list + array ($name => array ("$id", "$id"));
movSaveList ($list);
}

function movSaveList ($list) {
$fp = fopen (MOV_LIST_FILE, "w");
if ($fp) {
foreach ($list as $name => $ids) {
$idlist = implode (" ", $ids);
fputs ($fp, "$name | $idlist\n");
}
}
fclose ($fp);
}


// [...]
// weiter unten im Code...

$arrMovList = movGetList();

// [...]
if ($_GET['mov_action'] == "add") {
if (isset ($_GET['movadd'])) {
$movname = trim ($_GET['movadd']);
if (!array_key_exists ($movname, $arrMovList)) {
movAddToList ($arrMovList, $movname, $user_info['id']);
echo "

Film erfolgreich hinzugefügt!

\n";
}
else {
echo "

Fehler: \"{$_GET['movadd']}\" konnte nicht
hinzugefügt werden! Vielleicht schon in Liste?

";
}
}
}

// etc.
// ----- end of code -----


Nun kommt es zu der seltsamen Erscheinung, dass, sofern sich der Film
nicht in der Liste (in der Datei) befindet, er auch tatsächlich
hinzugefügt wird, aber meistens (nicht immer!) mit der Meldung 'Fehler:
"blabla" konnte nicht hinzugefügt werden! ...'. Ich habe überprüft, ob
wohl an anderen Stellen vor dem obigen Aufruf von 'movAddToList' die
Datei schon beschrieben wird, aber das ist nicht der Fall. Die einzige
Möglichkeit, wie ich mir dieses Verhalten erklären kann, ist, dass
Server seitig das PHP-Script mehrmals nacheinander ausgeführt wird...
Aber IMO sehr unwahrscheinlich?! Wisst ihr da weiter?

Gruss
Andreas

Re: Sonderbares Verhalten beim Dateihandling

am 15.10.2006 01:58:16 von Philipp Wagner

Andreas Weishaupt schrieb:
> Guten Abend
>
> Ich habe etwas geschrieben, das ein mir nicht erklärbares, unerwartetes
> Verhalten hervorruft. Dabei geht es um folgende Fragmente:
>
> // ----- code -----
> // create the overview from the list
> // remember, line format is: [mov.name] | [id0] [id1] [id2] [id3] [...]
> // the id's mentioned belong the users who haven't seen the
> // corresponding movie. id0 belongs to the user who has added the movie
> function trimArrElements (&$val, $key) {
> $val = trim ($val);
> }
>
> function movGetList() {
> $fp = fopen (MOV_LIST_FILE, "r");
> if ($fp) {
> while (!feof ($fp)) {
> $tline = trim (fgets ($fp));
> if ($tline != "") {
> $tarrMov = explode ("|", $tline);
> $tarrIds = explode (" ", trim ($tarrMov[1]));
> $tindex = trim ($tarrMov[0]);
> $tarrMovList[$tindex] = $tarrIds;
> array_walk ($tarrMovList[$index], 'trimArrElements');
> }
> }
> }
> fclose ($fp);
> return $tarrMovList;
> }
>
> function movAddToList (&$list, $name, $id) {
> $list = $list + array ($name => array ("$id", "$id"));
> movSaveList ($list);
> }
>
> function movSaveList ($list) {
> $fp = fopen (MOV_LIST_FILE, "w");
> if ($fp) {
> foreach ($list as $name => $ids) {
> $idlist = implode (" ", $ids);
> fputs ($fp, "$name | $idlist\n");
> }
> }
> fclose ($fp);
> }
>
>
> // [...]
> // weiter unten im Code...
>
> $arrMovList = movGetList();
>
> // [...]
> if ($_GET['mov_action'] == "add") {
> if (isset ($_GET['movadd'])) {
> $movname = trim ($_GET['movadd']);
> if (!array_key_exists ($movname, $arrMovList)) {
> movAddToList ($arrMovList, $movname, $user_info['id']);
> echo "

Film erfolgreich hinzugefügt!

\n";
> }
> else {
> echo "

Fehler: \"{$_GET['movadd']}\" konnte nicht
> hinzugefügt werden! Vielleicht schon in Liste?

";
> }
> }
> }
>
> // etc.
> // ----- end of code -----
>
>
> Nun kommt es zu der seltsamen Erscheinung, dass, sofern sich der Film
> nicht in der Liste (in der Datei) befindet, er auch tatsächlich
> hinzugefügt wird, aber meistens (nicht immer!) mit der Meldung 'Fehler:
> "blabla" konnte nicht hinzugefügt werden! ...'.

Du sagst, der Film wird hinzugefügt und die Meldung "konnte nicht
hinzugefügt werden" erscheint. Laut deinem Code erscheint nach dem
Hinzufügen immer die Meldung "Film erfolgreich hinzugefügt!" -
einen Fall, bei dem der Film hinzugefügt wird und die Fehlermeldung
erscheint kann da nicht dabei sein. Der Film ist also wohl schon in der
Liste von irgendwoher vorher.

> Ich habe überprüft, ob
> wohl an anderen Stellen vor dem obigen Aufruf von 'movAddToList' die
> Datei schon beschrieben wird, aber das ist nicht der Fall. Die einzige
> Möglichkeit, wie ich mir dieses Verhalten erklären kann, ist, dass
> Server seitig das PHP-Script mehrmals nacheinander ausgeführt wird...
> Aber IMO sehr unwahrscheinlich?! Wisst ihr da weiter?

Allerdings sehr unwahrscheinlich.


Philipp

Re: Sonderbares Verhalten beim Dateihandling

am 15.10.2006 19:48:14 von Andreas Weishaupt

Philipp Wagner schrieb:

>>Nun kommt es zu der seltsamen Erscheinung, dass, sofern sich der Film
>>nicht in der Liste (in der Datei) befindet, er auch tatsächlich
>>hinzugefügt wird, aber meistens (nicht immer!) mit der Meldung 'Fehler:
>>"blabla" konnte nicht hinzugefügt werden! ...'.
>
>
> Du sagst, der Film wird hinzugefügt und die Meldung "konnte nicht
> hinzugefügt werden" erscheint. Laut deinem Code erscheint nach dem
> Hinzufügen immer die Meldung "Film erfolgreich hinzugefügt!" -
> einen Fall, bei dem der Film hinzugefügt wird und die Fehlermeldung
> erscheint kann da nicht dabei sein. Der Film ist also wohl schon in der
> Liste von irgendwoher vorher.

Wenn ich den einzigen Aufruf der Funktion 'movAddToList' innerhalb des
if-blocks auskommentiere, erscheint immer die Meldung "Film erfolgreich
hinzugefügt!", was ja auch Sinn macht. Aber entferne ich den Kommentar
wieder, so wird der Film tatsächlich in der Datei hinzugefügt, aber -
wie gesagt -, die Meldung "konnte nicht hinzugefügt werden"... Ich kann
mir das absolut nicht erklären, vor allem weil der einzige Dateizugriff
vor dem fragwürdigen if-Block durch die Funktion 'movGetList' stattfindet...

>>Ich habe überprüft, ob
>>wohl an anderen Stellen vor dem obigen Aufruf von 'movAddToList' die
>>Datei schon beschrieben wird, aber das ist nicht der Fall. Die einzige
>>Möglichkeit, wie ich mir dieses Verhalten erklären kann, ist, dass
>>Server seitig das PHP-Script mehrmals nacheinander ausgeführt wird...
>>Aber IMO sehr unwahrscheinlich?! Wisst ihr da weiter?
>
>
> Allerdings sehr unwahrscheinlich.