Andreas Lindig: Dateivoodoo

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

--
SELFFORUM - hier werden Sie geholfen,
auch in Fragen zu richtiges Deutsch
  1. 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.

    1. 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.

      1. 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

        --
        SELFFORUM - hier werden Sie geholfen,
        auch in Fragen zu richtiges Deutsch
        1. 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

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
  2. Sup!

    Was erwartest Du von PHP?

    Gruesse,

    Bio

    --
    Keep your friends close, but your enemies closer!
    1. Hallo,

      Was erwartest Du von PHP?

      ...wo war doch gleich der Ausblendknopf...

      Gruß, Andreas

      --
      SELFFORUM - hier werden Sie geholfen,
      auch in Fragen zu richtiges Deutsch
    2. 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

  3. 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

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    1. 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