mike 007: Text vor header-Funktionen ?

Hallo zusammen,

ich beschäftige mich gerade neu mit PHP. Mit Hilfe des Internet habe ich mir ein PHP Script geschrieben welches auch Funktioniert.

Jetzt mein Problem: wenn ich vor dem Script welches die header-Funktionen enthält ein bißchen text schreiben will erhalte ich die ausgabe:

Warning: session_start() [function.session-start]: Cannot send session cache limiter

Habe mich jetzt dazu belesen und raus bekommen das vor session start nix stehen darf. Wie bekomme ich es hin ohne das text vor dem PHP Script anzuzeigen ohne das Script umzuschreiben?

dannke
mike

  1. Mahlzeit,

    Wie bekomme ich es hin ohne das text vor dem PHP Script anzuzeigen ohne das Script umzuschreiben?

    Dieser Satz kein Sinn.

    Wie wär's mit Folgendem:

    <?php  
    [code lang=php]  
      
    session_start();  
      
    /* sonstiges PHP-Geraffel, dass VOR dem ersten Output stehen muss/sollte, z.B. header() etc. ... Tipp: [link:http://de.wikipedia.org/wiki/EVA-Prinzip@title=EVA-Prinzip] */  
    
    

    ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <title>Titel</title>
    </head>

    <body>
    [...]
    </body>
    </html>[/code]

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo danke erstmal für die Antwort!

      sorry wenn ich mich erst falsch ausgedrückt habe:

      @EKKi dein Vorschlage ergibt jetzt folgendes:

      -------

      PHP-Geraffel

      Text

      --------

      Ich will es aber so haben das ich erst einen Kurzen Text schreiben kann und dann mein PHP Script kommt.

      ----------

      Text

      PHP-Geraffel

      ----------

      ich hoffe jetzt ist es verständlicher!

      mfg

      1. Hi,

        wenn du aber Header Daten hast, MUESSEN diese vor jeder Ausgabe stehen.

        Was fuer ein Problem hast Du denn, dass mit Ekkis Vorschlag nicht kompatibel waere? _Jedes_ PHP Programm funktioniert so.

        --
        "Sei froh dass du nen Virenscanner hast, der schlauer ist als du..."
         
        1. Hallo,

          ich habe Header Daten deswegen ist ja auch meine Frage ob es die Möglichkeit gibt eine Ausgabe vorher zumachen!

          mfg

          1. Hello,

            ich habe Header Daten deswegen ist ja auch meine Frage ob es die Möglichkeit gibt eine Ausgabe vorher zumachen!

            Nein, das ist nicht möglich.
            Du kannst die Ausgabewerte aber vorher berechnen lassen, und dann zu gegebener Zeit ausgeben.

            Schreibe einfach anstelle von

            echo meine_schöne_Funktion('viel Argumente');

            besser

            $_out['body'] .= "<p>" . htmlspecialchars(meine_schöne_Funktion('viel Argumente')) . "</p>\r\n";

            und später erst im HTML-Teil

            <body>

            <?php echo $_out['body']; ?><br>

            and a lot of static html<br>
                and a lot of static html<br>
                and a lot of static html<br>
                and a lot of static html<br>

            </body>

            Ein harzliches Glückauf

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
          2. Mahlzeit,

            ich habe Header Daten deswegen ist ja auch meine Frage ob es die Möglichkeit gibt eine Ausgabe vorher zumachen!

            Nein, gibt es nicht.

            Gib es zu: Du hast weder session_start(), header() oder EVA-Prinzip gelesen - geschweige denn verstanden - noch hast Du überhaupt mehr als rudimentäre Kenntnisse, wie PHP überhaupt "funktioniert". Lies Dir Grundlagenwissen an.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          3. Heyho!

            ich habe Header Daten deswegen ist ja auch meine Frage ob es die Möglichkeit gibt eine Ausgabe vorher zumachen!

            Und genau diese Antwort hast Du schon bekommen. Wenn Du eine ausgabe machst, ist das der Anfang deiner Datei. Es werden also die header daten schon geschickt. Wie kann man Headerdaten (die ja noch vor dem Anfang der Datei kommen) schicken, nachdem ein Teil schon da ist?

            Du muesstest den ganzen Spass zurueckhalten, bis die Datei komplett fertig ist. Hab schon lang kein php mehr geschrieben, aber da gabs was. Schau mal unter Output Buffering. Das ist im Grunde aber nicht noetig und verkompliziert nur alles. Warum sollte man denn etwas ausgeben muessen, bevor man einen Header schickt? Verstehe ich nicht.

            --
            "Sei froh dass du nen Virenscanner hast, der schlauer ist als du..."
             
            1. Hallo,

              danke erstmal werde mir morgen nochmal genau darüber gedanken machen. Nur eine frage noch und zwar habe ich erst vor der header funktion text und habe es bei Funpic.de hochgeladen und es ging wunderbar. An was liegt es das es bei manchen Providern geht und bei anderen nicht?

              mfg

              1. Hello,

                danke erstmal werde mir morgen nochmal genau darüber gedanken machen. Nur eine frage noch und zwar habe ich erst vor der header funktion text und habe es bei Funpic.de hochgeladen und es ging wunderbar. An was liegt es das es bei manchen Providern geht und bei anderen nicht?

                Das kann ich nur vermuten.

                Bei den ganzen Schrott-Hostern, die sich von den dummen Usern nur Content machen lassen, um ihre eigene Werbung plazieren zu können, wird oft mit einem Auto-Prepend und einem Auto-Append-Script gearbeitet. damit das aber keine Probleme macht, werden _sämtliche_ Ausgaben solange zwischengepuffert, bis sowohl Auto-Prepend, als auch das Userscript und das Auto-Append-Script durch sind.

                Das kann man mit ob_start() http://de3.php.net/manual/en/function.ob-start.php und den Schwesterfunktionen machen. Es ist aber keine sehr flexible Möglichkeit der Steuerung.

                Ein harzliches Glückauf

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
              2. Hi,

                Nur eine frage noch und zwar habe ich erst vor der header funktion text und habe es bei Funpic.de hochgeladen und es ging wunderbar. An was liegt es das es bei manchen Providern geht und bei anderen nicht?

                Vielleicht an dem gerade in der Antwort, auf die du dich jetzt beziehst, erwaehnten output buffering ...?

                Du solltest langsam mal anfangen, die Antworten mit Verstand zu lesen.

                MfG ChrisB

                --
                "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."
            2. Hello,

              Warum sollte man denn etwas ausgeben muessen, bevor man einen Header schickt? Verstehe ich nicht.

              Man könnte das glauben, weil man bisher immer nur "echo" oder "print" für die Ergebnisse benutzt hat, genau in dem Moment, wenn sie im zeitlichen Ablauf des Scriptes angefallen sind.

              Dass noch ein Header notwendig wird, fällt einem dann erst drei Schritte später ein, wenn der Title-Tag schon geschrieben ist...

              Dass aber die dynamisch erzeugten Teile später, ganz am Ende, mit den statischen HTML-Tielen zusammengebaut werden können, daran denkt man als Anfänger nicht, insbesondere, wenn einem nur solche abstrakten (wenn auch richtigen) Begriffe, wie "EVA-Prinzip an den Kopf gelinkt werden ;-)

              Ein harzliches Glückauf

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Mahlzeit,

                Man könnte das glauben, weil man bisher immer nur "echo" oder "print" für die Ergebnisse benutzt hat, genau in dem Moment, wenn sie im zeitlichen Ablauf des Scriptes angefallen sind.

                Was ja nicht verkehrt ist.

                Dass noch ein Header notwendig wird, fällt einem dann erst drei Schritte später ein, wenn der Title-Tag schon geschrieben ist...

                Was ja kein Problem ist - wenn man die Header dann und dort schreibt, wo sie hingehören: am Anfang der Datei, bevor irgendeine Art von Ausgabe stattgefunden hat.

                Dass aber die dynamisch erzeugten Teile später, ganz am Ende, mit den statischen HTML-Tielen zusammengebaut werden können, daran denkt man als Anfänger nicht, insbesondere, wenn einem nur solche abstrakten (wenn auch richtigen) Begriffe, wie "EVA-Prinzip an den Kopf gelinkt werden ;-)

                Jaja, schon klar. Allerdings muss ich ganz ehrlich sagen, dass einem Anfänger eine auf den ersten Blick komplizierte und verwirrende Konstruktion mit globalen Variablen (die auch noch assoziative Arrays sind), verschiedenen Funktionen und diversen echos an den verschiedensten Stellen - wie von Dir vorgeschlagen - nicht unbedingt mehr hilft. Wenn dieser Anfänger aber die verlinkten Artikel lesen würde, könnte er das Prinzip dahinter verstehen und sich selbst entsprechende Kniffe einfallen lassen.

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                1. Hello,

                  Allerdings muss ich ganz ehrlich sagen, dass einem Anfänger eine auf den ersten Blick komplizierte und verwirrende Konstruktion mit globalen Variablen (die auch noch assoziative Arrays sind),

                  Wo siehst Du da globale Variablen?

                  verschiedenen Funktionen und diversen echos an den verschiedensten Stellen nicht unbedingt mehr hilft.

                  Wie willst Du ihm denn sonst zeigen, dass er an vielen Stellen im PHP-Hauptteil die Ausgaben einsammeln kann, um sie dann später an einer Stelle (im HTML-Teil) gezeilt wieder ausgeben zu können?

                  Ein harzliches Glückauf

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Mahlzeit,

                    Wo siehst Du da globale Variablen?

                    $_out z.B.?

                    verschiedenen Funktionen und diversen echos an den verschiedensten Stellen nicht unbedingt mehr hilft.

                    Wie willst Du ihm denn sonst zeigen, dass er an vielen Stellen im PHP-Hauptteil die Ausgaben einsammeln kann, um sie dann später an einer Stelle (im HTML-Teil) gezeilt wieder ausgeben zu können?

                    <mecker ton="trotzig" aufstampf="fuss">Naja, aber wenn z.B. die Funktion main() überhaupt nirgendwo aufgerufen wird und auch keinerlei erklärende Kommentare dabeistehen, WARUM was wo steht und wie funktioniert, dann hilft das auch nicht viel ...</mecker>

                    MfG,
                    EKKi

                    --
                    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                    1. Hello,

                      Wo siehst Du da globale Variablen?

                      $_out z.B.?

                      Das sollte keinesfalls eine globale Variable werden.
                      Ich war bei dem Beispiel nur zu schnell auf der Absenden-Taste.

                      Es fehlt nämlich der Funktionsaufruf meiner Funktion "main()" und dann wird es auch klarer.
                      Und das ich innerhalb von Funktionen immer dieselben Bezeichner benutze, wie außerhalb, das ist eine Eigenart von mir.

                      Du hast aber Recht, etwas mehr Erläuterung wäre schon passend gewesen.

                      Also, der Funktionsaufruf

                      $_out = main();

                      fehlte an dieser Stelle:

                      }   // end of PHP-Main

                      $_out = main();

                      ############################################################################################

                      Beginn des HTML/PHP-Templates

                      ############################################################################################
                      ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
                      <html>
                          <head>
                              <title><?php echo $_out['title']; ?></title>
                          </head>

                      <body>
                              <?php echo $_out['body']; ?>
                              [... much static HTML stuff ...]

                      </body>
                      </html>

                      Ein harzliches Glückauf

                      Tom vom Berg

                      --
                      Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
      2. Hello,

        Ich will es aber so haben das ich erst einen Kurzen Text schreiben kann und dann mein PHP Script kommt.

        Sammle Deine Ausgaben im PHP-Teil in einem Ausgabebehälter (z.B. ein Array), und gib dessen Elemente dann später im HTML-Tei (Template) aus, wenn alle Berechnungen vorbei sind.

        Der PHP-Hauptteil sollte keinerlei eigene Ausgaben an die Standardausgabe senden.

        Ausnahme wäre, wenn während der Berechnungen ständig Ausgaben kommen müssen zur Kontrolle, was aber sowieso nicht wirklich funktioniert, weil kein Proxy verpflichet ist, bereits Teile eines Response (einer Antwortseite) weiterzugeben...

        Ein harzliches Glückauf

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
    2. Hello,

      Wie bekomme ich es hin ohne das text vor dem PHP Script anzuzeigen ohne das Script umzuschreiben?

      Wie wär's mit Folgendem:

      mit einem kleinen Trick als Ergänzung?
      So kann der PHP-Block an jeder Stelle abgebrochen werden, ohne den HTML-Teil zu vergessen.
      PHP hat keine Sprungmarken, aber so wirkt es fast wie eine :-)

      Und wenn man den HTML-Teil auch nicht mehr ausgeben will, dann nimmt man eben "exit";

      [code lang=php]<?php
      function main()
      {
         $_out = array();
         $_out['title'] = htmlspecialchars('>> meinerster Programiertrick <<');

      if ($irgendwas_passerit) { return $_out );

      session_start();

      /* sonstiges PHP-Geraffel, dass VOR dem ersten Output stehen muss/sollte, z.B. header() etc. ... Tipp: [link:http://de.wikipedia.org/wiki/EVA-Prinzip@title=EVA-Prinzip] */

      }  
      
      > ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
      > <html>  
      > <head>  
      
        <title><?php echo $\_out['title']; ?></title>  
      
      > </head>  
      >   
      > <body>  
        
      <?php echo $\_out['body']; ?>  
      [...]  
        
      
      > </body>  
      > </html>[/code]  
        
        
        
        
      Ein harzliches Glückauf  
        
      Tom vom Berg  
      ![](http://selfhtml.bitworks.de/Virencheck.gif)  
        
      
      -- 
      Nur selber lernen macht schlau  
      <http://bergpost.annerschbarrich.de>
      
  2. Lieber mike,

    ich habe mir angewöhnt, bei sehr langen Scripten eine globale Variable anzulegen, in die ich die Ausgaben des Scriptes hineinschreibe (also das, was ich sonst per echo direkt an den Browser ausgebe), um erst am Ende des Scripts diese Inhalte tatsächlich per echo auszugeben.

    Ein nicht besonders sinnvolles Beispiel:

    <?php  
      
    // $GLOBALS ist ein global verfügbares Array, in dem ich einfach ein  
    // Unter-Array mit dem Index "ausgabe" definiere, um meine Ausgabe zu  
    // speichern:  
    $GLOBALS['ausgabe'] = '';  
      
    function ergebnis_addition($a, $b) {  
        $ergebnis = $a + $b;  
      
        // echo "<p>Ergebnis: a ($a) + b ($b) = ".($a + $b).".</p>";  
        $GLOBALS['ausgabe'] .= "<p>Ergebnis: a ($a) + b ($b) = ".($a + $b).".</p>"; // anstatt echo!  
      
        return $ergebnis;  
    }  
      
    $x = 7;  
    $y = 8;  
    $z = ergebnis_addition($x, $y);  
      
    $GLOBALS['ausgabe'] .= "<p>Das war die Summe aus $x und $y, nämlich $z.</p>";  
      
    $f = 9;  
    $g = 18;  
    $h = ergebnis_addition($f, $g);  
      
    $GLOBALS['ausgabe'] .= "<p>Und das war die Summe aus $f und $g, nämlich $h.</p>";  
      
    // Ende des Scripts: Jetzt erst gehen tatsächlich Daten an den Browser:  
    echo $GLOBALS['ausgabe'];  
    ?>
    

    In diesem Beispiel sollte deutlich werden, wie an verschiedenen Stellen im Script HTML-Ausgaben (es könnten aber auch andere Ausgaben sein) dem (String-)Inhalt einer Variablen ($GLOBALS['ausgabe']) angefügt werden, anstatt direkt per echo an den Browser gesendet zu werden.

    Mit PHPs tollen String-Funktionen kann man dann auch noch vor der Ausgabe diese Inhalte "überarbeiten", wie z.B. Platzhalter aus Template-Dateien mit ihren jeweiligen Daten befüllen, Linkziele korrigieren, Session-ID in href- und action-Attribute eintragen (falls session.use_trans_sid nicht aktiviert ist), usw.

    Hilft Dir das weiter?

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)