Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PHP - Warning: Cannot modify header information - headers already sent

kafar610 14 Wrz 2015 21:52 1704 48
  • #1 14 Wrz 2015 21:52
    kafar610
    Poziom 16  

    Witam
    Stworzyłem sobie kodzik z sesjami i ciasteczkami ale wyskakuje mi błąd "Warning: Cannot modify header information - headers already sent by (output started at /home/kafar/ftp/Sklep/index.php:3) in /home/kafar/ftp/Sklep/sessions.php on line 63" i niczego mi nie wpisuje do bazy :(

    index.php

    Kod: php
    Zaloguj się, aby zobaczyć kod


    product.php
    Kod: php
    Zaloguj się, aby zobaczyć kod


    header.php
    Kod: php
    Zaloguj się, aby zobaczyć kod


    function.php

    Kod: php
    Zaloguj się, aby zobaczyć kod


    sessions.php
    Kod: php
    Zaloguj się, aby zobaczyć kod


    request.php
    Kod: php
    Zaloguj się, aby zobaczyć kod


    user.php
    Kod: php
    Zaloguj się, aby zobaczyć kod

    -1 29
  • Pomocny post
    #2 14 Wrz 2015 22:13
    -psiak-
    Poziom 32  

    A co jest niejasne w komunikacie?
    Musisz ustalić wszystkie dane nagłówkowe (w tym ciasteczka) przed tym jak zaczniesz tworzyć wynikowy kod strony.
    Czyli po:

    Kod: html
    Zaloguj się, aby zobaczyć kod
    już jest zbyt późno.

    0
  • #3 14 Wrz 2015 22:17
    kafar610
    Poziom 16  

    Czyli co mam zrobić dokładnie? Bo usunąłem wszystko, co było na górze przed skryptem w header.php i nadal nie działa.

    0
  • Pomocny post
    #4 14 Wrz 2015 22:39
    -psiak-
    Poziom 32  

    Nie może być żadnego echo, print czy też innego rozpoczęcia kodu html zanim ustalisz wszystkie nagłówki.

    0
  • Pomocny post
    #5 15 Wrz 2015 00:19
    Rezystoreczek
    Poziom 20  

    kodowanie pliku ma być bez BOM :!:

    0
  • #6 15 Wrz 2015 00:39
    kafar610
    Poziom 16  

    jest bez BOM

    0
  • #7 15 Wrz 2015 00:53
    Rezystoreczek
    Poziom 20  

    header ma być absolutnie pierwszy, tzn. jak includujesz go z jakiegoś pliku po czymś innym, to już jest złe ;) Ma być na SAMYM początku :!: jest?

    0
  • #8 15 Wrz 2015 15:23
    kafar610
    Poziom 16  

    jest
    index.php

    Kod: php
    Zaloguj się, aby zobaczyć kod

    header.php
    Kod: php
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #9 15 Wrz 2015 16:12
    Rezystoreczek
    Poziom 20  

    pierwsza linia w pliku to ma byc start sesji :) nie jest ;(

    0
  • #10 15 Wrz 2015 16:24
    kafar610
    Poziom 16  

    o to chodzi? xd

    Kod: php
    Zaloguj się, aby zobaczyć kod

    0
  • #11 15 Wrz 2015 16:30
    Rezystoreczek
    Poziom 20  

    Tak, ale ten plik to musi być ten którego otwierasz przez przeglądarkę a nie ten, którego includujesz. ;)
    :!:Te session start musi być zawsze raz jako pierwsza komenda.:!:

    0
  • #12 15 Wrz 2015 16:37
    kafar610
    Poziom 16  

    dobra session start siedzi juz w glownym pliku czyli index.php :) i co dalej? bo nadal nie dziala

    0
  • Pomocny post
    #13 15 Wrz 2015 16:51
    Rezystoreczek
    Poziom 20  

    a gdyby zamienić "<?" na "<?php" :?:

    0
  • #14 15 Wrz 2015 17:49
    kafar610
    Poziom 16  

    tak jak podejrzewałem, to nie ma żadnego znaczenia :P

    0
  • #15 15 Wrz 2015 20:19
    Rezystoreczek
    Poziom 20  

    dalej masz ten błąd :?: Chyba nie stosujesz się do rad - zamieść cały kod tutaj, może w rarze :(

    0
  • #17 15 Wrz 2015 21:41
    LED5W
    Poziom 32  

    Rezystoreczek napisał:
    Tak, ale ten plik to musi być ten którego otwierasz przez przeglądarkę a nie ten, którego includujesz. ;)
    :!:Te session start musi być zawsze raz jako pierwsza komenda.:!:
    Nieprawda. Wystarczy, że funkcja session_start zostanie wywołana przed wysłaniem czegokolwiek do przeglądarki.

    Problem masz w pliku header.php - po pierwszym ?> wysyłasz dane do przeglądarki, a dalej masz $session = new session;. Wywołujesz więc konstruktor, który wywołuje funkcję newSession i w której masz linię wskazaną w ostrzeżeniu.

    A może byś tak wysyłał pełny dokument HTML?

    0
  • #18 15 Wrz 2015 21:50
    kafar610
    Poziom 16  

    Dobra, ale jak mam to naprawić aby błędu nie wywalało? :D to co wstawiłem w rarze to jest komplet :P

    0
  • #19 15 Wrz 2015 23:41
    LED5W
    Poziom 32  

    Nie wysyłaj danych do przeglądarki w tym miejscu...
    Najlepiej najpierw wszystko zrobić (sprawdzić dane, wykonać wszystkie zapytania do bazy danych itd.) a na końcu tylko wysłać.

    0
  • #20 16 Wrz 2015 18:04
    kafar610
    Poziom 16  

    to jak możesz to pokaż mi w którym miejscu dokładnie mam to wstawić, bo jak wstawiam tak jak Ty mówisz to tez błędy wyskakują

    0
  • Pomocny post
    #21 16 Wrz 2015 20:01
    Kużdo
    Poziom 20  

    Po pierwsze, @Rezystoreczek, nie wprowadzaj ludzi w błąd.

    Po drugie, @kafar610, używasz za dużo enterów, spacji itp., kod jest niechlujnie napisany, źle wcięty, wszystko jest chaotyczne. Popraw styl pisania, będzie i łatwiej pomagać i łatwiej zrozumieć Twój kod. Ty sam będziesz łatwiej dochodził do tego, co miałeś w danym miejscu na myśli.

    Po trzecie, ostrzeżenie, które Ci się pokazuje, oznacza, że nie można modyfikować nagłówków żądania po tym, jak zostały one już wysłane. A nagłówki są wysyłane przy pierwszym wysłaniu treści strony (bo nagłówki muszą iść jako pierwsze).
    Więc rozwiązaniem Twojego problemu, jest pozbycie się wszystkich treści z buforu przed jakimikolwiek ustawieniami nagłówków.

    Po czwarte, to masz w tych plikach taki chaos, że skrypt PHP jest wyświetlany bezpośrednio w przeglądarce:
    PHP - Warning: Cannot modify header information - headers already sent PHP - Warning: Cannot modify header information - headers already sent

    Po piąte, dlaczego w każdym pliku znajduje się session_start()? Przecież to używa się raz. W dodatku kolejne użycia są ignorowane, a interpreter wyrzuca błąd typu "Notice".

    Po szóste, część skryptu PHP zawsze zaczynamy znacznikiem "<?php", a nie "<?". Ten drugi znacznik jest dozwolony w PHP, ale wprowadza wiele błędów, bo inne języki również mogą używać takiego znacznika. Poza tym, jeżeli konfiguracja PHP ma wyłączone krótkie tagi, to nie będzie to traktowane jako kod PHP, tylko zwykły HTML (dlatego wypluwa kod na stronę).

    Częściowo poprawiłem Ci kod, w paczce masz wersję oryginalną i po modyfikacji. Sprawdź jak wygląda kod przed i po moich modyfikacjach. Są one bardzo drobne, ale częściowo problem rozwiązują, nie testowałem skryptu w żaden sposób, bo nie mam bazy z odpowiednimi danymi.

    http://www9.zippyshare.com/v/wzW7NYxD/file.html


    I na miłość Boską, popraw pisownię w swoich postach.
    Regulamin Forum:

    Cytat:
    3.1. Zabronione jest w szczególności:
    3.1.13. Publikowanie wpisów naruszających zasady pisowni języka polskiego, niedbałych i niezrozumiałych

    -1
  • #22 16 Wrz 2015 21:11
    kafar610
    Poziom 16  

    Dzięki, wezmę Twoje rady pod uwagę :)
    W tych plikach co mi wysłałeś to wypluwa błąd w pliku function.php w linijce 28, czyli do

    Kod: php
    Zaloguj się, aby zobaczyć kod
    więc poprawiłem na to co było wcześniej czyli
    Kod: php
    Zaloguj się, aby zobaczyć kod
    .
    Idąc dalej to nadal jest ten sam błąd "Warning: Cannot modify header information - headers already sent by (output started at /home/kafar/ftp/Sklep/header.php:19) in /home/kafar/ftp/Sklep/sessions.php on line 64"

    0
  • #23 16 Wrz 2015 23:03
    LED5W
    Poziom 32  

    kafar610 napisał:
    Idąc dalej to nadal jest ten sam błąd "Warning: Cannot modify header information - headers already sent by (output started at /home/kafar/ftp/Sklep/header.php:19) in /home/kafar/ftp/Sklep/sessions.php on line 64"
    Nic dziwnego, bo kod, który wskazałem jest wciąż w tym samym miejscu.

    kafar610 napisał:
    to jak możesz to pokaż mi w którym miejscu dokładnie mam to wstawić, bo jak wstawiam tak jak Ty mówisz to tez błędy wyskakują
    Rozumiem, że masz na myśli to:
    LED5W napisał:
    Nie wysyłaj danych do przeglądarki w tym miejscu...
    Przenieś wskazane dane za $session = new session;.

    0
  • Pomocny post
    #24 16 Wrz 2015 23:07
    Kużdo
    Poziom 20  

    kafar610 napisał:
    W tych plikach co mi wysłałeś to wypluwa błąd w pliku function.php w linijce 28, czyli do

    A to oznacza, że masz wersję PHP niższą niż 5.4.

    kafar610 napisał:
    Idąc dalej to nadal jest ten sam błąd

    Napisałem, że tylko częściowo poprawiłem kod. Spójrz:
    kafar610 napisał:
    "Warning: Cannot modify header information - headers already sent by

    Co oznacza: Ostrzeżenie: Nie można zmodyfikować informacji nagłówkowych - nagłówki zostały już wysłane przez...
    kafar610 napisał:
    (output started at /home/kafar/ftp/Sklep/header.php:19)

    (wyjście rozpoczęło się w ... linia 19).

    Czyli zaglądasz do linii 19 w pliku header.php i co tam widać?
    Kod: php
    Zaloguj się, aby zobaczyć kod


    Jak widzisz, w linii 19 zaczyna się kod PHP, ale prawdziwy błąd jest w linii 30. Próbujesz utworzyć obiekt klasy session, a w linii 64 klasy session próbujesz ustawić ciasteczko. Nie można tego zrobić, ponieważ przed linią 19 wysłałeś kod HTML do przeglądarki.

    0
  • #25 16 Wrz 2015 23:25
    marcinj12
    Poziom 40  

    Ja bym zaczął od tego, że strona HTML powinna mieć pewną ustaloną strukturę - a nie widzę u ciebie takich podstaw jak znaczniki HTML, HEAD, BODY czy doctype. Zacznij od gotowego template, np. tutaj: http://www.w3.org/QA/2002/04/valid-dtd-list.html , a potem się zabieraj za jego rozbudowę.

    0
  • #26 16 Wrz 2015 23:28
    Kużdo
    Poziom 20  

    marcinj12 napisał:
    Ja bym zaczął od tego, że strona HTML powinna mieć pewną ustaloną strukturę - a nie widzę u ciebie takich podstaw jak znaczniki HTML, HEAD, BODY czy doctype. Zacznij od gotowego template, np. tutaj: http://www.w3.org/QA/2002/04/valid-dtd-list.html , a potem się zabieraj za jego rozbudowę.

    Ale to nie wpływa na błąd, który został tutaj opisany, więc trzymajmy się tematu.

    0
  • #27 16 Wrz 2015 23:52
    kafar610
    Poziom 16  

    Czyli chodzi wam o to aby tak wyglądał plik header.php

    Kod: php
    Zaloguj się, aby zobaczyć kod

    Inaczej się raczej nie da bo przecież najpierw muszę pobrać potrzebne elementy i połączyć się z baza xd
    Nie wiem czy dobrze zrozumiałem, ale błędu nie wywala więc chyba jest dobrze :D

    0
  • #28 17 Wrz 2015 00:19
    LED5W
    Poziom 32  

    Gdzieś Ty to przeniósł? :O Napisałem przecież konkretnie. :(
    Przerób jakiś kurs HTML, bo jest tragicznie.

    0
  • Pomocny post
    #29 17 Wrz 2015 00:46
    Kużdo
    Poziom 20  

    kafar610 napisał:
    Czyli chodzi wam o to aby tak wyglądał plik header.php

    Nie, nie chodzi o to "by plik wyglądał tak o", bo to jak on będzie wyglądał, to zależy tylko od Ciebie.
    A chodzi o to, by nie wysyłać żadnych danych przed funkcjami modyfikującymi nagłówki.
    Musisz zrozumieć, że wszystko to, co nie jest skryptem PHP, będzie traktowane jak zwykła treść. Jeżeli taka treść znajdzie się (również poprzez wypisanie danych funkcjami np. echo, print, var_dump itp.) przed funkcjami modyfikującymi nagłówki, to będziesz miał taki błąd, jaki miałeś.
    Jak otwierasz jakąś stronę, to serwer zawsze wysyła do Ciebie najpierw nagłówki, a później treść strony, więc jeżeli wysłałeś już jakąś treść, to logicznym jest, że nagłówki też już poszły, więc nie możesz ustawić np. ciasteczek lub modyfikować innych nagłówków, tak się po prostu nie da.

    Widzisz, teraz masz najpierw sam kod PHP, który nic nie wypisuje, dopiero później zaczynają się tagi HTML itp., dlatego teraz działa, bo ustawiasz najpierw ciasteczka, a później wysyłasz treść strony.

    LED5W napisał:
    Przerób jakiś kurs HTML, bo jest tragicznie.

    Co takiego ma dać mu kurs HTML w tym konkretnym przypadku? Nie mówię, że nie przydałoby mu się przerobić jakiś kurs HTMLa (np. kurshtml.edu.pl), ale w tym przypadku sam kurs HTMLa nie rozwiązałby jego problemu. Tutaj potrzebny jest kurs PHP.

    0
  • #30 17 Wrz 2015 00:47
    kafar610
    Poziom 16  

    Nic nie przenosiłem tylko usunąłem parę linijek, miedzy innymi echo który powodował błąd.
    Teraz błędów nie ma więc jest dobrze więc nie rozumiem po co się unosisz.
    Sesje i ciasteczka w sumie dopiero zaczynam więc dlatego jest jak jest :P

    0