php: fwrite zit fread in de weg?

Wie weet het? Ik staar me hier een beetje blind op denk ik. Ik maak ergens een fout, maar waar. 8)

Het is een stukje php voor een simpel webloge’tje
Bij uitvoer wordt standaard show_log uitgevoerd die de entry’s laat zien gevolgd door een knop “nieuw”. Dit werk allemaal. Alleen als ik na het invoeren van een nieuwe entry na rec_save direct show_log uitvoer dan leest hij geen records, net alsof rec_save nog bezig is. Als ik daarna weer via default de pagina laad en show_log wordt aangeroepen werkt het weer goed.

Wat mis ik?

[code:1:7dd7204e6d]
function save_file($weblog) {
$fp = fopen("data/data.txt", "w+");
flock($fp, LOCK_EX);
$my_array_s = serialize($weblog);
if (isset($fp)) {
fwrite($fp, $my_array_s);
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
}
}

function rec_save() {
$weblog = open_file();
$item[“datum”] = time();
$item[“titel”] = htmlspecialchars(stripslashes($_POST[‘titel’]), ENT_NOQUOTES);
$item[“tekst”] = htmlspecialchars(stripslashes($_POST[‘tekst’]), ENT_NOQUOTES);
$item[“nieuws”] = $_POST[‘nieuws’];
$weblog[] = $item;
save_file($weblog);
}

function show_log() {
$weblog = open_file();
for($i=0;$i<count($weblog);$i++) {
$item=$weblog[$i];
echo "<DIV class="infoitem"><B>".$item["titel"]."</B><BR>";
echo "<SPAN class="news_date">".date("F j, Y, g:i a",$item["datum"])."</SPAN><br>";
echo html_entity_decode($item["tekst"], ENT_QUOTES)."<br><br></DIV>";
}
?>
<form action="invoer.php" method="post">
<INPUT name ="keuze" TYPE="hidden" value="nieuw">
<INPUT TYPE="submit" VALUE="Nieuwe Entry">
</form>
<?php
}

switch ($_POST[‘keuze’]) {
case ‘nieuw’:
nieuw_item();
break;
case ‘save’:
rec_save();
show_log();
break;
default:
show_log();
}
[/code:1:7dd7204e6d]

Mis ik je functie open_file(); ?

Probeer eens tussen je $weblog = open_file()l en for($i=0;$i<count…) in function show_log() {} te zetten:

rewind($weblog );

of

fseek($weblog , 0);

Misschien handig om ff op het scherm te zetten waar je zit in hje fil:

“echo ftell($weblog);”

[quote:506d78ef10="remier"]Mis ik je functie open_file(); ?[/quote:506d78ef10]

[code:1:506d78ef10]function open_file() {
$fn=“data/data.txt”;
if(!file_exists($fn)) {
$fp = fopen($fn,“w”);
fclose($fp);
}
$fp_cache = fopen($fn, “r”) or die(“can’t open file”);
$fp_readc = fread($fp_cache, (filesize($fn)));
fclose($fp_cache);
$weblog = unserialize($fp_readc);
return ($weblog);
}[/code:1:506d78ef10]

Ik gebruik voor het weergeven iedere keer een nieuwe fopen “r” dus dan moet die filepointer toch naar het begin gaan.
Ik heb al een dozijn van die echo’tjes staan, ik zal de filepointer er nog eens bij zetten. Wat me wel opviel is dat wanneer ik de filesize tussendoor echo, die bij de show_log na de save nog niet groter is geworden. Bij een nieuwe doorgang is dat wel het geval.
Vandaar dat het net lijkt of de show_log te snel achter de save aan komt. Alsof de save nog niet klaar is met de file. Maar dat kan volgens mij niet aangezien ik hem eerst nog even flush en close.
:cry:

Ik heb er inmiddels wel een oplossing voor (zie onder), maar ik wil nog steeds weten waarom dit niet werkt zo. Het ziet er toch logisch uit.

[code:1:692cbcdf6a]
switch ($_POST[‘keuze’]) {
case ‘nieuw’:
nieuw_item();
break;
case ‘save’:
rec_save();
header('Location: '.$_SERVER[‘PHP_SELF’]);
exit;
default:
show_log();
}
[/code:1:692cbcdf6a]