Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: ob_start() ja haitat?

Sivun loppuun

wisekki [11.11.2008 13:00:41]

#

Onko ob_start():n käytöstä jotain haittaa jossakin? :) Teen yksinkertaista asiakashallinta -ohjelmaa ja käytän paljon sivujen uudelleenohjausta, enkä pääse valituksesta "Headers already sent" eroon millään, muuta kuin käyttämällä joka sivun alussa ob_start():ia.

Kuukkelin mukaan white spacet pitäisi poistaa, mutta niitä en kyllä löydä.


- AnttiK

Lebe80 [11.11.2008 13:27:09]

#

jos tulosta jotain (esim. enterin painallus jonkun ladatun tiedoston alussa) ennen uudelleenohjausta, saat tuon virheilmoituksen.

ob_start() puskuroi tulosteen ja tulostaa vasta skriptien lopulla (tai erillisellä funktiolla).

Chiman [11.11.2008 13:34:17]

#

Jokainen tiedosto alkaa heti "<?php", php-osuus ei katkea "?>":lla välillä, eikä sisällä tulostuskäskyjä ennen header-kutsua? Olet tarkistanut includetetut tiedostot myös?

Jos kaikki nuo näyttävät olevan kunnossa, ethän tallenna tiedostoja utf8-muodossa byte-order markin (BOM) kanssa?

ob_-funktioiden haitoista en tiedä, mutta yrittäisin välttää niiden käyttöä vain tuohon tarkoitukseen.

wisekki [11.11.2008 13:44:54]

#

Eli siis tästä tulisi "headers already sent" -virhe:

<?php
$i = $_POST([i]);
?>

<p> testi: <?php echo $i; ?> </p>

<?php
header("Location: http://" . $_SERVER["HTTP_HOST"] . dirname($_SERVER["PHP_SELF"]) . "/sivu1.php");
?>

Vai mitä tarkoitat tuolla "php-osuus ei katkea"?

Mielestäni olen käynyt kaikki includet yms läpi, mutta silti saan tuota ilmoitusta aina, ellen käytä ob_start:ia. Koodissa on kyllä paljon <?php ?> katkelmia.

Chiman [11.11.2008 13:47:03]

#

No niin, eli tulostat siinä pätkän:
"
<p> testi: <?php echo $i; ?> </p>
"

Tuo on tulostamista eli sivun sisällön muodostamista. Mitään tuollaista ei saa olla ennen headerien lähettämistä.

Vai oliko tuo keksitty esimerkki? Jos on "?>" - "<?php" -php-katko, sen välissä oleva teksti tulostuu, eli se vastaa echo-komennon käyttämistä.

wisekki [11.11.2008 13:53:24]

#

Se oli keksitty esimerkki, mutta käytän vastaavanlaisia formien arvoissa. Esim:

<input type="text" name="testi" value="<?php echo $arvo; ?>">

Pitäisikö kaikki html-tagit yms echottaa ja pitää vain yhdet <?php ja ?>, jotta pääsisi tuosta virheestä eroon? :)

Lebe80 [11.11.2008 13:59:34]

#

siis, et saa tulostaa _mitään_ ennen header -functiota! et formeja, et otsikoita, et mitään.

Tuo ob_start() tietenkin ratkaisee ongelmasi, koska se siirtää tulostuksen vasta "loppuun".

Chiman [11.11.2008 14:04:02]

#

Wisekki: Ei, koska tulostat kummassakin tapauksessa, eli generoit nettisivun lähdekoodia (html).

Tässä vähän vinkkiä:
http://wiki.mureakuha.com/wiki/Mitä_tarkoittaa_'Headers_already_sent'-virheilmoitus?

Nettisivu on (IMO) järkevintä toteuttaa niin, että ensin tehdään syötteiden tarkistus, tietokantahaut ja muu valmisteleva osuus. Sen jälkeen voidaan päättää ohjataanko uudelle sivulle, vai lähdetäänkö tulostamaan jotain.

Jos olet jo nähnyt paljon vaivaa koodin tekemiseen niin, että tulostelet lomakkeita sun muita ja sitten vasta tarkistatkin "hei, halutaanko sittenkään näyttää koko sivua, vai ohjataanko muualle", niin anna olla niin ja käytä ob_starttia. Koodi voi olla rumaa, mutta jos siitä saa vielä selvän ja hommalla on kiire, niin ehkä se on paras ratkaisu. Jatkossa sitten paremmin.

wisekki [11.11.2008 14:35:30]

#

Kiitoksia vastauksista. En karsasta ob_startin käyttöä, tuli vain mieleen voiko siitä olla jonkinlaista haittaa (kaukaa haettu) esim. php:n "haavoittuvuudessa" :)

--edit--

Pääsin eroon kaikista headers already sent varoituksista eroon siirtämällä html-sivun aloitusfunctiot huomattavasti alemmaksi koodissa :) Kiitoksia vinkeistä

Metabolix [11.11.2008 20:12:59]

#

Eräänlaista haittaa tuosta voi kyllä olla, jos esimerkiksi tarvitset kyseisiä funktioita johonkin muuhun. Monet PHP:n funktiot haluavat tulostaa datansa, ja joskus on tarpeen poimiakin data muuttujaan mm. mainitun funktion avulla.

Ison sivun kanssa muistinkäyttökin voi kasvaa, mutta toisaalta on kyllä syytä huolestua, jos sivu on niin valtavan suuri.

Grez [11.11.2008 22:47:02]

#

Myöskin se huono puoli on, että jos puskuroit koko sivun niin sitten latautumisaika on muodostamisaika + tiedonsiirtoaika. Jos taas alat tunkea sivua sitä mukaa käyttäjälle kun se valmistuu, niin tuo saattaa olla lyhyempi.

Niko [12.11.2008 00:00:39]

#

Metabolix kirjoitti:

Eräänlaista haittaa tuosta voi kyllä olla, jos esimerkiksi tarvitset kyseisiä funktioita johonkin muuhun. Monet PHP:n funktiot haluavat tulostaa datansa, ja joskus on tarpeen poimiakin data muuttujaan mm. mainitun funktion avulla.

En allekirjoittais tätä:

ob_start();
ob_start();
var_dump($_SERVER);
$test = ob_get_clean();
echo 'Testi: ', $test;
ob_end_flush();

Eli siis puskuroinnissa voi olla useita tasoja...


Sivun alkuun

Vastaus

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

Tietoa sivustosta