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
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).
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.
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.
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ä.
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? :)
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".
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_
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.
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ä
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.
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.
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...
Aihe on jo aika vanha, joten et voi enää vastata siihen.