ugrás a tartalomhoz

Header nem tud írni, ha volt már kimenet

elio · 2002. Dec. 7. (Szo), 18.28
hi!
a problemam az ,hogy a header meghivasakor hiba jelentkezik, mert van valami a kimeneten es nem tud ra irni!
ezt meg lehet szuntetni, vagy mit lehet kezdeni a dologgal?
ennek a problemanak a megoldasa erdekel, ha van
elore is koszi
zsomi
ui bocs ha megint hulyeseg.
 
1

Re: header azaz az output-ot torolnem de hogyan

Granc Róbert · 2002. Dec. 12. (Cs), 02.35
Hát, a probléma az, hogy van valami a kimeneten... :) Tehát a header() előtt ne írass ki semmit a böngészőnek! (Include-olt oldalakban sem!)

Robi
2

Re: header azaz az output-ot torolnem de hogyan

pappi · 2003. Jan. 24. (P), 15.08
A probléma az amit Robi leírt, hogy ha az nem megoldható, vagy nehezen megoldható, hogy kiszedj elöle minden olyat ami outputot generál akkor használj output bufferinget ...
például ez így tökéletesen müködik:

<?php
ob_start();  //itt kezded az output bufferelését
echo "Hello\n";
setcookie ("cookiename", "cookiedata"); //cookie-t is headerben kell állítani ob nélkül ez sem menne.
ob_end_flush(); //kirakod a buffer tartalmát
?>
bővebben: http://www.php.net/manual/en/ref.outcontrol.php
3

similar problem...

Anonymous · 2006. Jún. 17. (Szo), 01.38
Sziasztok!

Nekem is hasonló a problémám, de én annyira amatőr vagyok, hogy baromira nem is értem a problémát, illetve, hogy ez miért ilyen körülményes...
A történet a következő:
van egy index.php file-om a megfelelő header-rel. Ebben a fileban van egy pár include, többek között egy törzs (nevezzük body.php-nek), amiben pl a felhasználó autentikációt is meg akarom csinálni. Tehát egy formot mindenképpet ki kell iratnom. Amikor a user ráklikkel az ok gombra, akkor (mivel baromi amatőr vagyok, és nem tudok jobb megoldást egyenlőre), azt csinálom, hogy beolvastatom az index.php-t megint (ezen az oldalon van egyébként a login form is), itt ugye includolja a body.php-t, amely "tudja", hogy már megnyomtam az OK gombot, ezért beincludol egy login.php-t. Ez pedig lellenőrzi egy MySQL adatbázisban, hogy a megadott felhasználó létezik e vagy sem. Ha létezik, beállít egy sütit, amit a későbbiekben szeretnék használni. Namost itt jön a már jól ismert hiba, ugye ekkor már egy csomó minden van az outputon. Egyszerűen lehetetlenség szerintem minden sütit létrehozni az első kiiratás előtt. Persze lévén, hogy baromi amatőr vagyok, könnyen lehet, hogy az egész lényegét félreértettem, bár elég sokat keresgettem a googliban. Nincs más megoldás csak az ob_start()? Hogy szokás ezt a sütis dolgot megoldani?

Előre is köszi mindenkinek, aki meg tudja, de legalábbis megpróbálj megértetni velem ezt, a számotokra biztos baromi egyszerű dolgot! :)

---G---
4

Egy scriptet ált. elég egyszer futtatni - szvsz túlbonyolíto

Dualon · 2006. Jún. 17. (Szo), 01.46
Ha jól értem a problémád, valószínűleg túlbonyolítottad a kérdést.
A beléptetést végezd az index.php-d legelején: ha van elküldött űrlapadat, akkor annak segítségével ellenőrizheted az adatbázisban a usert (SQL injectionre figyelj!).
Innentől mehet a kiíratás, és átirányítanod sem kell.
Ha nincs űrlapadatod, vagy hibás volt a belépés, akkor ugye megint kirakod a belépési űrlapot.

Klasszikus átirányításos eset a fórum: bejegyzés elküldése után a script feldolgozza azt, majd ad egy átirányító headert, és meghívja a megjelenítést végző script(részlet)nek.
5

hmmm :)

Anonymous · 2006. Jún. 17. (Szo), 01.58
Hali!

Köszi a gyors választ!
Igen, az biztos, hogy túlbonyolítom, de ezen felül még mindig nem egészen értem a lényeget. Így néz ki az index.php nagyjából:
<html>
<head>
...
</head>
<body>
<?php
include("body.php");
...
?>
</body>
</html>
A body.php-ben van sokminden, de a lényeg az, hogy beléptetni nem feltétlenül kell ugye a usert. Tehát ezt csak akkor hívom meg, ha szükséges, amit viszont még az index.php elején nem tudok eldönteni. Tehát midenképpen lesznek kiiratásaim mielőtt a cookie-kat beállítom.
Talán segítene ha el tudnád röviden mondani, mit is értesz itt átirányítás alatt, illetvi mi is számít kiiratásnak? Nyilván én vagyok hozzá a hülye, de amit eddig triviálisnak hittem, az ellentmond ennek, hogy nem irathatok ki semmit, mielőtt beállítok egy cookie-t.
6

...

Anonymous · 2006. Jún. 17. (Szo), 03.26
Miután tovább kutakodtam, egyre inkább azt látom, h a cookie-kat még a header előtt kell beállítgatni. Nekem az a problémám, h a cookie létrehozása bizonyos körülményektől, változóktól függ. Van erre valami bevett módszer (leszámítva a kimenetszabályozó fv-eket), hogy ne mindjárt az index.php elején kelljen beállítani őket?
9

rossz a körmenet

erenon · 2006. Jún. 17. (Szo), 09.09
A beléptető űrlap ne saját magát hívja meg, hanem a login.php-t, és ha ott minden stimmel, akkor mehetnek a sütik, és egy átirányítás a főoldalra, ha nem, akkor pedig csinálsz egy hibát, saját ízlésed szerint.
7

...

Anonymous · 2006. Jún. 17. (Szo), 03.30
Miután tovább kutakodtam, egyre inkább azt veszem észre, h a cookie-kat a header előtt kell létrehozni. Nekem az a problémám, hogy a cookie létrehozása bizonyos körülményektől, változóktól függ. Van erre valami bevett megoldás (a kimenetszabályozó fv-eken kívül), hogy ne az index.php elején kelljen őket létrehozni?
10

Átirányításos és nem átirányításos megoldás

Dualon · 2006. Jún. 17. (Szo), 11.12
Az igazán tisztességes az, ha átirányítasz: laptól függően lehet külön beléptető scripted, vagy az index.php egy része végezheti ezt, ekkor figyelj rá, hogy más - feleslegesen - ne fusson le (pl. tedd if-es vezérlőszerkezetbe az egészet).

Ha mégis ragaszkodsz az egyetlen index.php-hez, akkor az alábbiak szerint építsd fel:
- űrlapelküldés ellenőrzése
- űrlapadatok feldolgozása, beléptetés, sütiküldés, ha kell
- html fej
- html törzs, benne index.php include, mely ellenőrzi, hogy meg kell-e még jeleníteni a beléptető űrlapot
- html "láb"

A HTML és PHP "kódegységeket" nagyjából rugalmasan pakolgathatod ide-oda.

Remélem, mindaddig nem kerül fel élesbe a lap, míg az alapvető megoldásokkal ekkora küzdelem van.
8

Read The Friendly Manual

vbence · 2006. Jún. 17. (Szo), 08.55
Ilyenkor reggel nagyon kedves vagyok, úgyhogy jöjjön a nyájas válasz:

http://www.php.net/manual/en/function.header.php
Remember that header() must be called before any actual output is sent
...
Note: As of PHP 4, you can use output buffering to get around this problem, with the overhead of all of your output to the browser being buffered in the server until you send it. You can do this by calling ob_start() and ob_end_flush() in your script, or setting the output_buffering configuration directive on in your php.ini or server configuration files.


Pici magyarabbul:
Figyelj arra, hogy a header() függvényt megelőzően nem lehet semmilyen output
...
Megjegyzés: A PHP 4 óta pufferelt outputot is használhatsz, hogy megkerüld a problémát azon az áron, hogy minden, a böngészőnek küldött adatod pufferelve lesz a szerveren amég el nem küldöd. Ezt az ob_start() és ob_end_flush() funkciók meghívásával érheted el, vagy ha engedélyezed az output_buffering konfigurációs direktívát a php.ini fájlodban vagy a szerver konfigurációs állományaiban (itt .htaccessre gondolnak).

Amúgy output: megemlítik, hogy az output az nem csak echo meg print, hanem akár egy üres sor, vagy egy ENTER a ?> után egy include fájlban, vagy egyáltalán bármi, ami a php tageken kívül van.

Hihetetlen, hogy egy ilyen buta kérdés mennyi embert megmozgat, az én magaröptű fórumszárnyalásaimra meg senki sem kíváncsi... :-/
11

...

Anonymous · 2006. Jún. 17. (Szo), 13.47
tudod, ez azért van, mert nem lehet, mindenki olyan istenkirálycsászár mint te, és nem repkedhet mindenki olyan magasan, mint te... vigyázz, ne nagon szálj el ennél jobban, mert a világűr másik felén fogsz kikötni, és baromi magányos leszel... és képzeld, elolvastam ezeket, de számomra logikátlan, és nem voltam benne, biztos, h valóban úgy van ahogy azt én elgondolom, mivel még nem vagyok php-ben olyan nagy istenkirálycsászár mint te, barátocskám...

A többieknek meg köszi a segítséget, azt hiszem, nagyjából sikerült megérteni a lényeget.Azt azonban hozzátenném, hogy nem egy szál index.php-ből áll az oldal, és az index.php is modulokból tevődik össze. Ilyen pl a beléptető modul is. Nah, de mind1, ezekkel nyilván lesz még problémám, hiszem még most tanulgatom a php-t.

Mégeccer köszi a segítséget azoknak, akik érdemben is képesek voltak hozzászólni a "buta kérdésemhez"!
13

Mea Culpa

vbence · 2006. Jún. 17. (Szo), 17.28
Bocsánatot kérek... most megyek és elgondolkodom az éltemen...
12

...

Anonymous · 2006. Jún. 17. (Szo), 13.48
tudod, ez azért van, mert nem lehet, mindenki olyan istenkirálycsászár mint te, és nem repkedhet mindenki olyan magasan, mint te... vigyázz, ne nagon szálj el ennél jobban, mert a világűr másik felén fogsz kikötni, és baromi magányos leszel... és képzeld, elolvastam ezeket, de számomra logikátlan, és nem voltam benne, biztos, h valóban úgy van ahogy azt én elgondolom, mivel még nem vagyok php-ben olyan nagy istenkirálycsászár mint te, barátocskám...

A többieknek meg köszi a segítséget, azt hiszem, nagyjából sikerült megérteni a lényeget.Azt azonban hozzátenném, hogy nem egy szál index.php-ből áll az oldal, és az index.php is modulokból tevődik össze. Ilyen pl a beléptető modul is. Nah, de mind1, ezekkel nyilván lesz még problémám, hiszem még most tanulgatom a php-t.

Mégeccer köszi a segítséget azoknak, akik érdemben is képesek voltak hozzászólni a "buta kérdésemhez"!