lars: datei aus datenbank erstellen

Hallo zusammen,

ich habe mir einige reports gebaut, die abfragen an ein db stellen und dann in eine (excel) datei schreiben.
die datei soll der user dann runterladen.
bisher liegt die datei auf dem server und der user kann sie sich dann durch anklicken runterladen.
damit die alten reporst nicht den webspace zumüllen, läuft ein script, welches jede nacht ausmistet...

jetzt mein plan zur verbesserung und meine frage:

allerdings würde ich die datei ungern auf dem webspace speichern, sondern eher in einer variablen. (die reports sind nur ein paar kb gross)

wenn der report fertig ist, sollte die "datei" sofort zum download angezeigt werden.

hat jemand von euch eine idee, wie man das umsetzen kann?

ich danke euch.

schönes WE noch.

mfg

lars

  1. Hi,

    allerdings würde ich die datei ungern auf dem webspace speichern, sondern eher in einer variablen.

    das ist natürlich ungünstig, wenn die Variable aufgrund der zwangsläufigen Script-Beendigung zu existieren aufhört.

    hat jemand von euch eine idee, wie man das umsetzen kann?

    Gar nicht. Variablen sind keine Form der persistenten Speicherung, die Du aber benötigst. Eine solche wären beispielsweise Dateien, Datenbanken und eine Handvoll Dinge, die für Dich nicht in Frage kommen, weil Du nicht die Fähigkeit hast, sie umzusetzen, was ich daraus schließe, dass Du nicht selbst auf sie gekommen bist.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Gar nicht. Variablen sind keine Form der persistenten Speicherung, die Du aber benötigst. Eine solche wären beispielsweise Dateien, Datenbanken und eine Handvoll Dinge, die für Dich nicht in Frage kommen, weil Du nicht die Fähigkeit hast, sie umzusetzen, was ich daraus schließe, dass Du nicht selbst auf sie gekommen bist.

      Danke für die info.
      Es hätte gereicht, wenn du mir gesagt hättest, wo man am besten nachlesen sollte. Eine fertige Lösung erwarte ich nicht, nur einen hinweis.

      wenn ich selbst drauf gekommen währe, hätte ich die frage hier nicht gestellt.

      mfg

      lars

      1. Hallo Lars!

        Es hätte gereicht, wenn du mir gesagt hättest, wo man am besten nachlesen sollte. Eine fertige Lösung erwarte ich nicht, nur einen hinweis.

        Unter der Annahme, dass du deine "Excel-Datei" als PHP-String vorliegen hast, kannst du diesen relativ einfach in eine Datei speichern:

          
        $my_excel_data = 'blubb';  
          
        // eventuell Pfad ergänzen:  
        $file_name = 'mein_excel.xl';  
          
        $fh = fopen($file_name, 'w');  
        if($fh === FALSE) {  
          error_log('Konnte Excel-Datei nicht zum Schreiben oeffnen!');  
          exit();  
        }  
        @flock($fh, LOCK_EXCLUSIVE);  
        $err = @fputs($fh, $my_excel_data);  
        @fclose($fh);  
          
        if($err === FALSE) {  
          error_log('Fehler beim Schreiben in Excel-Datei!');  
          exit();  
        }  
        
        

        Wichtig: Dieses Stück Quältext prüft nicht, ob die Datei schon existiert! In dem Fall würde sie einfach überschrieben.

        Dokumentation zu den Datei-Befehlen:
        http://de.php.net/manual/de/ref.filesystem.php

        MffG
        EisFuX

        --
        Erinnert mich ein Bisschen an die if-then-Schleifen von Java.
        (Alexandra Freund, IT-Compactkurs)
        1. Es hätte gereicht, wenn du mir gesagt hättest, wo man am besten nachlesen sollte. Eine fertige Lösung erwarte ich nicht, nur einen hinweis.

          Unter der Annahme, dass du deine "Excel-Datei" als PHP-String vorliegen hast, kannst du diesen relativ einfach in eine Datei speichern:

          Dokumentation zu den Datei-Befehlen:
          http://de.php.net/manual/de/ref.filesystem.php

          Moin Moin,

          danke für deine info.
          den stream in eine datei speichern, das mache ich bisher.
          nur ich möchte die datei eigentlich nicht auf dem server ablegen, sprich ich möchte mir den report "im Speicher" zusammenbauen und dann zum download anbieten.
          ob das überhaupt geht, weis ich nicht, vielleicht hast du ja eine idee, wo man da nachlesen könnte...

          mfg

          lars

          1. Hallo,

            danke für deine info.
            den stream in eine datei speichern, das mache ich bisher.
            nur ich möchte die datei eigentlich nicht auf dem server ablegen, sprich ich möchte mir den report "im Speicher" zusammenbauen und dann zum download anbieten.

            Ich bin mir nicht ganz sicher, ob ich dich richtig verstanden habe ...

            ob das überhaupt geht, weis ich nicht, vielleicht hast du ja eine idee, wo man da nachlesen könnte...

            Du kannst Daten nicht über mehrere "Scripts hinweg" im Hauptspeicher halten. Wenn du willst, dass ein einmal erstellter Report auch von anderen Scripts geladen werden kann, musst du ihn wohl oder übel irgendwie auslagern. Das geht am einfachsten, indem du ihn in eine Datei speicherst. Nichts hindert dich daran, die Datei bei Notwendigkeit mit readfile() oder passthrough() in den Ausgabepuffer zu laden, und sie somit zum Download anzubieten.

            Wenn du lediglich aus *einem* Script heraus die Daten zum Download anbieten willst, dann mach das doch einfach: Schreib die Variable, die die Daten enthält (und nur die), mit print() oder echo() in den Ausgabepuffer. Fertig.

            Und was du in den HTTP-Header schreiben musst, damit die meisten Browser verstehen, dass es sich um einen Download handelt, wurde hier schon mehrfach erläutert.

            MffG
            EisFuX

            --
            Erinnert mich ein Bisschen an die if-then-Schleifen von Java.
            (Alexandra Freund, IT-Compactkurs)
  2. Tach,

    wenn der report fertig ist, sollte die "datei" sofort zum download angezeigt werden.

    Ich würde dasselbe Skript, welches Du laufen lässt, um dein Excel-Sheet zu erzeugen, benutzen, um das Excel-Sheet "on the fly" zu bauen.
    Du müsstest lediglich die erzeugte Excel-Datei nicht in eine Datei, sondern direkt in den Browser ausgeben. Also wenn Du die Daten für das Excel-Sheet dann in einer Variable namens "$excel_data" hast,
    einfach ein "echo $excel_data".

    Allerdings müsstest Du den HTTP-Response-Header selbständig ausgeben: Normalerweise wird als "Content-type" im Header der Mime-Type "text/html" benutzt, du bräuchtest aber "application/msexcel".
    Ich hab sowas mal in PERL für ein GIF-Image statt eines Excel-Sheets gemacht, da sieht das so aus:

    print "Content-type: image/gif\n\n";
    open IMAGE, "./img/$image";
    binmode IMAGE;
    print <IMAGE>;
    close (IMAGE);

    Wie man dass in PHP genau macht, dass kein Header ausgegeben wird, weiss ich nicht genau, aber denke, es muesste reichen, wenn einfach vor dem PHP-Teil, in dem du die Excel-Daten erzeugst & ausgibst, kein HTML-Teil vorkommt.

    Hoffe, das hilft dir weiter.
    Viele Grüße,
    Jörg