Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Voisko joku vähän selventää ob_start();

Sivun loppuun

faaraot [24.02.2011 19:51:11]

#

En sitten käsitä millään näitä juttuja. Ongelmana on juuri kun olen käyttänyt session_start juttua ja jos on yhtään include "jotain.php"; niin tulee header virheilmoitus. Sen verran selaillu että ongelma on juuri session_start ja ob_startilla pitäs toimia, vai???

Kopioitu täältä jostain:

<?php
    // Aloitetaan puskurin täyttö
    ob_start();

        echo "<html><head><title>Output Buffering</title></head><body>";
        echo "Selaimeesi asetetaan eväste odota hetki...";
        setcookie("testievaste", "testiä", time() + 60);
        echo "<br>Eväste asetettu";
        echo "</body></html>";

    // Tyhjennetään puskuri, joka samalla näyttää echo:lla tulostetun rivin
    ob_end_flush();
?>
<?php
//$teksti sisältää PHP-koodia
ob_start();
highlight_string($teksti);
$teksti=ob_get_contents();
ob_end_clean();
?>

Eli miten nää pelaa, mihin väliin esim syötän koodin $testi = "testi"; Käytän yhtä valmista koodia ja siellä on haettu id-numero. Olen tehnyt siihen session_start ja $_SESSION["id"] = $id;, jonka sitten haen toisessa tiedostossa, mutta haluan sinne myös include "jotain.php"; mutta header virhe tulee.

Mod. lisäsi kooditagit, opettele käyttämään niitä itse!

combo [24.02.2011 19:57:24]

#

Ihan vinkkinä ensin: muista käyttää kooditageja.

faaraot [24.02.2011 21:09:40]

#

Mummot, täsä nyt jouda pilkkua viilaamaan ku pitää saada tehtyä. Auttakaa ny ku tämmönen tänne on kerran tehty. Ihme porukkaa!

You have blank lines in your HTML code, remove them and try again. Siitä löyty vika ainakin osittain, mutta miten sain vielä includet pelaan

eq [24.02.2011 21:23:46]

#

Jooh, ihan ensimmäiseksi kannattaa etsiä internetistä hyvä netiketti, ja ei vain lukaista, vaan lukea se ajatuksella läpi.

Lebe80 [24.02.2011 21:23:49]

#

Ootko kokeillu laittaa includea?

Ihan suoraan ne toimii. Pidät huolen vaan että includet tulee vasta ob_start():n jälkeen, niin et kosauta hommaas tiedostojen alussa olevilla välilyönneillä tai typerillä ylimääräisillä echoillasi, joita arvatenkin liitettävät php-tiedostot puskevat ilmoille.

ankzilla [24.02.2011 21:33:37]

#

Evästeet asetetaan ennen ku tulostetaan mitää.

The Alchemist [25.02.2011 10:19:05]

#

ankzilla kirjoitti:

Evästeet asetetaan ennen ku tulostetaan mitää.

Tarkemmin sanottuna headerit pitää lähettää ennen sisältöä. Headereihin kuuluvat myös keksit.

Väärin:
print 'Heippa';

if ($error)
  exit( header('Location: error.php') );


Oikein:
if ($error)
  exit( header('Location: error.php') );

print 'Heippa';

PHP lähettää headerit selaimelle automaattisesti ennen ensimmäistä tulostetta (esim. print-kutsu tai virheilmoitus).

Output bufferingilla saa aikaan sen, että PHP laittaa tulosteen ensin bufferiin sen sijaan, että lähettäisi sen heti selaimelle. Tällöin headereita voi asetella vielä tulostuskutsujenkin jälkeen. PHP:n asetuksista riippuen bufferointi voi olla päällä oletusarvoisesti, muutoin sen saa käyttöön juurikin kutsumalla funktiota ob_start().

Puskurin koko on kuitenkin rajallinen, joten ei voi taata, että kaikki headeria edeltävät tulosteet olisivat vielä säilössä. Siksi minusta on huonoa ohjelmointia, että niitä asettaa tulostuksen jälkeenkin. Yleensä ei edes ole haastavaa koodata niin, että kaikki tarpeelliset headerit on asetettu jo ennen ensimmäistäkään tulostusta.

<?php
    // Aloitetaan puskurin täyttö
    ob_start();

        echo "<html><head><title>Output Buffering</title></head><body>";
        echo "Selaimeesi asetetaan eväste odota hetki...";
        setcookie("testievaste", "testiä", time() + 60);
        echo "<br>Eväste asetettu";
        echo "</body></html>";

    // Tyhjennetään puskuri, joka samalla näyttää echo:lla tulostetun rivin
    ob_end_flush();
?>

Tämä esimerkki on loogisesti väärin. Vaikka koodissa setcookie() on tulostuskäskyjen välissä, oikeasti eväste on lähetetty selaimelle kauan ennen <html>-tagia.

Selain siis vastaanottaa tällaista tietoa:

'header 1'
'header 2'
...
'cookie testievaste'

'<html><head><title>Output Buffering</title>...'
...
'</body</html>'

Grez [25.02.2011 11:13:39]

#

Tuolla on myös käyty läpi Headers Already Sent -virheilmoituksen taustoja:

http://wiki.mureakuha.com/wiki/Mitä_tarkoittaa_'Headers_already_sent'-virheilmoitus?

faaraot [25.02.2011 12:33:50]

#

Selvensi asiaa vähän. Kiitokset.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta