Dateivoodoo
Andreas Lindig
- php
Hallo Forum,
jetzt dreh ich am Rad. Ich schreibe eine Datei, die ganz merkwürdig unvollständig ist. Das sieht folgendermaßen aus:
function setDateiInhalt($url, $content)
{
if($fp=fopen($url, "w"))
{
fwrite($fp, $content);
fclose($fp);
return true;
}
return false;
}
ist ja nicht schwer oder? Jetzt der Aufruf:
$content = serialize($settings);
setDateiInhalt("dateiadresse", $content);
ich habe ein Array namens $content, das ich serialisiert abspeichern will. Direkt danach lese ich die Datei wieder aus und lasse sie mir ausgeben:
//Funktion zum auslesen - egal, sie funktioniert (garantiert)
$dateiInhalt = getDateiInhalt("dateiadresse", "full");
echo($dateiInhalt);
wird soweit alles richtig angezeigt: der KORREKTE serialisierte String wird mir ausgegeben!
Wenn ich jetzt aber die Datei in irgendeinem Texteditor öffne, fehlt das meiste. Und zwar ist sie nicht einfach abgeschnitten, sondern das Array ist seiner Inhalte beraubt worden. Es stehen noch die Feldnamen darin, aber die Inhalte stehen alle auf NULL (korrekt serialisiert). Ich habe den serialiserten String _vor_, _nach_ dem Abspeichern und mittendrin (in der Funktion) ausgeben lassen: immer der richtige String, aber die abgespeicherte Datei sieht anders aus. Wenn ich die Seite mit dem Funktionsaufruf aber zum _zweiten_ Mal abschicke, wird der richtige String gespeichert. Bin ich jetzt zu doof zum Programmieren?
Gruß, Andreas
Lieber Andreas,
fwrite($fp, $content);
Ich habe immer fputs() verwendet. Macht das einen Unterschied bei Dir? Muss mal eben in der Doku den Unterschied dieser beiden Funktionen ergründen gehen. - Man liest sich!
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Habe vergessen...
if($fp=fopen($url, "w"))
Da setze ich nicht nur "w" als Parameter, sondern (für Windows!) "wb+". Ansonsten sind fwrite und fputs absolut identisch.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
if($fp=fopen($url, "w"))
Da setze ich nicht nur "w" als Parameter, sondern (für Windows!) "wb+". Ansonsten sind fwrite und fputs absolut identisch.
aber das Verrückte ist ja, daß da was an dem Array gedreht wird. Ich kann mir nicht vorstellen, daß ein Speichervorgang erkennt, daß es sich bei dem serialiserten String ursprünglich um ein Array gehandelt hat und da was mauschelt...
ich hab's auch gerade mit wb+ getestet - genau wie vorher...
Gruß, Andreas
Hello,
aber das Verrückte ist ja, daß da was an dem Array gedreht wird. Ich kann mir nicht vorstellen, daß ein Speichervorgang erkennt, daß es sich bei dem serialiserten String ursprünglich um ein Array gehandelt hat und da was mauschelt...
Wenn Du eine Datei innerhalb eines Scriptes anlegst, wegschreibst, schließt, wieder öffnest, ausliest, ...
Dann solltest Du Dir auch mal clearstatcache()
http://de2.php.net/manual/de/function.clearstatcache.php
anschauen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Sup!
Was erwartest Du von PHP?
Gruesse,
Bio
Hallo,
Was erwartest Du von PHP?
...wo war doch gleich der Ausblendknopf...
Gruß, Andreas
Hallo Bio!
Was erwartest Du von PHP?
gut - dann machen wir es mal konstruktiv: Was würdest Du mir anraten, was ich anstelle von PHP nutzen kann.
Die Sprache soll sowohl über die Shell, als auch als Modul/CGI vom apachen interpretiert/ausgeführt werden. Dabei bitte ich Dich um Angabe genauer Verbesserungen gegenüber PHP, die die Sprache mitsich bringt, eine kritische Berachtung der möglichen Verschlechterungen, sowie Angabe von guten Tutorials und Dokumentationen.
Gruß aus Berlin!
eddi
Hi,
if($fp=fopen($url, "w"))
du öffnest eine Textdatei,
fwrite($fp, $content);
...benutzt aber fwrite(), das Binärdaten schreibt.
Vielleicht liegt es ja daran.
MfG Hopsel
Hallo Hopsel,
fwrite($fp, $content);
...benutzt aber fwrite(), das Binärdaten schreibt.
hier bist du imho auf die deutsche Übersetzung reingefallen - die englische Seite spricht von "Binary-safe file write" und "binärsicher" und "Binärdaten" sind verschiedene Dinge.
Grüße aus Nürnberg
Tobias