Andavos: session_start() bei Downloadbarer Datei

Hallo,
also per PHP realisiere ich, dass der Admin seine Datensätze exportieren kann.
Dazu ruft er eine PHP Datei auf, die dann die DB abfragt und entsprechend Formatiert seine Datensätze ausgibt.

Die Ausgabe soll er sich herrunterladen können, also dass er die Seite Aufruft und er dann ein Downloadfenster erhält.

Dies löse ich so:
header("Content-disposition: filename=text.txt");
header("Content-type: application/octetstream");
header("Pragma: no-cache");
header("Expires: 0");
echo "Dateiinhalt";

Jetzt möchte ich aber, dass nur Personen die auch Zugriff auf den Adminbereich haben, auch die Datensätze herrunterladen darf.
Dazu muss ich eine Session Überprüfen, ob diese gesetzt wurde oder nicht.
Ist dies der Fall, soll er runterladen.

Allerdings habe ich ein Problem mit session_start()

<?php
session_start();
if($session_variable != "xyz")
{
//fehler
exit;
}

header("Content-disposition: filename=text.txt");
header("Content-type: application/octetstream");
header("Pragma: no-cache");
header("Expires: 0");
echo "Dateiinhalt";
?>

Das Problem ist, session_start() sendet (glaub ich) schon einen Header, darum immer wenn ich die Datei jetzt aufruft, sagt mir das Downloadfenster, die Datei sei nicht verfügbar.

Auch wenn ich header("Content...."); vor dem session_start(); einfüge erhalte ich die gleiche Meldung.

Hat jmd. eine Lösung für das Problem, wie man überprüfen kann ob der User eingelogt ist (ohne .htaccess) und dennoch die Datei zum download angeboten wird?

MFG
Andavos

  1. Hallo,
    hab die Lösung schon gefunden.

    <?php
    session_start();
    if($session_variable != "xyz")
    {
    //fehler
    exit;
    }

    header("Cache-control: private");
    header("Content-disposition: filename=text.txt");
    header("Content-type: application/octetstream");
    header("Pragma: no-cache");
    header("Expires: 0");
    echo "Dateiinhalt";
    ?>

    Neu dazugekommen ist:
    header("Cache-control: private");

    MFG
    Andavos

    1. Hello,

      hab die Lösung schon gefunden.

      Wichtig ist nur, dass die Header nicht gesendet werden, bevor sie vollsändig gesammelt sind. Gesendet wird aber bie PHP in der Normaleinstellung, sowie auch nur ein einzige Byte an "sichtbarem" Ausgabecode erzeugt wird. Das kann man mittes der Output-Buffer-Funktionen steuern.

      siehe ob_start() http://de.php.net/manual/de/function.ob-start.php

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hallo,
        wie muss ich das denn genau anwenden, bzw. welche Version ist besser?

        #1:
        <?php
        ob_start();
        header("Cache-control: private");
        header("Content-disposition: filename=$table.$end");
        header("Content-type: application/octetstream");
        header("Pragma: no-cache");
        header("Expires: 0");
        ob_end_flush();

        echo "Dateiinhalt";
        ?>

        Oder

        #2
        <?php
        ob_start();
        header("Cache-control: private");
        header("Content-disposition: filename=$table.$end");
        header("Content-type: application/octetstream");
        header("Pragma: no-cache");
        header("Expires: 0");

        echo "Dateiinhalt";
        ob_end_flush();
        ?>

        Soll die gesamte Ausgabe erst erfolgen wenn der Script fertig ist, oder schon nachdem der Header fertig ist?

        1. Hello,

          Die beiden Varianten sind auf das Theoretische minimiert, sodass man nicht sagen kann, welche nun besser ist.

          Ich habe aber schon z-Mal Hinweise zur Strukturierung von Code gegeben. Aus den Hinweisen geht dann hervor, was wann passiert. Jedenfalls bewirkt die Funktion header() in PHP keine Ausgabe an die Standardausgabe. Erst ein Bit im Focus der Standardausgabe des Apachen wird auch gesendet.

          Wenn Du also VOR dem '<?php' oder nach dem '?>' noch irgendetwas stehen hast (auch Zeilenumbrüche und Leerzeichen), dann veranlasst das PHP zu einer Ausgabe. Danch kannst Du keinen header mehr verändern oder hinzufügen, da alle Header VOR jedem Nutzbyte gesendet werden.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

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

    ich habe keine Ahnung von deinem Problem, aber es fehlt das "else" in deiner if-Schleife.
    Nur mal so...

    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. Hi,

      und das "else" fehlt auch nicht. Hab nicht richtig gekuckt...

      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. Hello,

        und das "else" fehlt auch nicht. Hab nicht richtig gekuckt...

        ... und "if-schleifen" gibt es in PHP auch nur uneigentlich *gg*

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hi,

          und das "else" fehlt auch nicht. Hab nicht richtig gekuckt...
          ... und "if-schleifen" gibt es in PHP auch nur uneigentlich *gg*

          gefällt dir Kontrollstruktur besser?

          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