Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: canot modify header :/
Forum PHP.pl > Forum > PHP
MitS
Witam!

Maaam wielki problem otóż robię pewną stronę od dłuższego czasu no i wszystko było ok aż do dzisiejszego popołudnia.

A więc do rzeczy.
Na sronie mam panel logowania (w którym ustawiam sessję jeśli dobrze sie zaloguje i mam tam headera), prócz panelu logowania mam też taki przycisk jak wyloguj (po zalogowaniu się).

i mój problem polega na tym iż jak się chce zalogować to wywala mi:

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/gimnazjum/tpl/tpl.index.php:116) in /var/www/html/gimnazjum/tpl/tpl.signin.php on line 32

dopiero po odświeżeniu strony lub po zalogowaniu powtórym udaje sie zalogowac poprawnie i to samo dzieje sie przy wylogowywaniu.

co nie tak zrobiłem ze te info sie pojawia i jak je wyeliminować questionmark.gif
wipo
nagłówek header może zostać wysłany tylko jeżeli nic wcześniej nie było wysłane.
MitS
hmmm tyle zdążyłem zrozumieć tylko ze jest taki patent że samego headera wysyłałem tuż po zalogowaniu ... innego nie miałem a jak zakomentowałem go to błąd sie wprawdzie nie pojawia ale działanie serwisu jest takie jak by nadal błąd był .. czyli drugi raz musze sie zalogować by działało ....

a może byc tak że sesje sie gryzą ? czy cos takiego ?
yaotzin
pewne funkcje takie jak header czy session_start() muszą zostać wywołane przed wywołaniem czego kolwiek (wyświetleniem czegokolwiek)

a więc

  1. <?php
  2. echo 'witaj świecie';
  3. ?>


zwróci taki warrning

  1. <?php
  2. echo 'witaj świecie';
  3. ?>


już nie...

problem pojawi się również wówczas gdy wyślesz coś po wczytaniu całej strony gdzie coś zostanie wyswietlone, lub zostaną wysłane nagłówki <head></head> (choć tego nie jestem do końca pewien, ale chyba też ma wpływ ). Jest to założone ze względów bezpieczeństwa.

Jeżeli z jakiegoś powodu jednak musisz wywołać funkcje w sposób pokazany na pierwszym listingu to możesz zrobic to tak:

  1. <?php
  2. echo 'witaj świecie';
  3. ?>


Tylko że to chyba działa tylko w skrypcie w którym zostało wywołane i skryptach do niego zainkludowanych (wiem mieszam trochę rolleyes.gif )

a drugi sposób możesz po prostu funkcję ustalającą sesję wywołać w innym pliku w którym nic nie wyświetlasz.

Trzecia rzecz możesz włączyć w pliku php.ini

output_buffering = on (raczej niezalecane, w sumie ograniczenie dla wysyłania nagłówków zostało własnie poto wprowadzone aby zwiększyć bezpieczeństwo)

p.s. Na sam koniec załączam linczek smile.gif LINCZEK DO FAJNEJ STRONY na temat Cannot Modify Header znalezione w google biggrin.gif tongue.gif
MitS
a mam pytanie...

moge dać:
ob_start();
i
ob_end_flush();

na początku i konczu całego dokumentu html (chodzi o to że mam system tpli i wszystkie podstrony ładują mi sie do ciała strony) i jak daje te funkcje na początek strony i koniec to wszystko jest ok tylko nie wiem czy czegoś innego mi to nie zniszczy ...
yaotzin
ta funkcja robi coś takiego

ob_start(); buforuj wyjście

ob_end_flush(); czyść bufor wyjściowy i tyle

nic ci to nie uszkodzi, z tym że po prostu zmniejszasz bezpieczeństwo swojej strony. z tego co wiem we wczesnym stadium rozwoju PHP nie istniał taki problem z wysyłaniem nagłówków, dopiero chyba od wersji 4 to weszło i jest właśnie poprzez wzgląd na bezpieczeństwo. ale to nie wpływa bezpośrednio na działanie serwisu jako całości (choć zależy z której strony patrzeć). bynajmniej wszystko będzie działać, ale problem masz z bezpieczeństwem :/ ja proponuję wywołać skrypt w innym pliku to jest bardziej co prawda zagmatwane ale na pewno bezpieczniejsze. Przedwczoraj miałem ten sam problem, bo źle zaprojektowałem strony i związany z nimi mechanizm sesji, przeniosłem cały skrypt do logowania do innego pliku gdzie nic nie wyświetlam i wszystko jest git. Pozdr.
MitS
ok dzieki za info smile.gif
Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.