Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/
Forum PHP.pl > Forum > Przedszkole
kubek3898
Wiem, wiem takich tematów było już tysiące lecz żadne rady dot. nich nie podziałały. Próbowałem:

- przed session_start(); dać ob_start(); jak i ob_start("ob_gzhandler");
- kodowanie UTF8 BEZ BOM
- usunałęm wszystkie spacje, entery przed rozpoczęciem sesji

Mogę oczywiście wyłączyć raportowanie błędów lecz nie chcę ukryć problemu, a go rozwiązać.

Mój kod:

  1. <?php
  2.  
  3. if( !defined( 'GAME_THIS_SCRIPT' ) )
  4. die( 'Access denied' );
  5.  
  6.  
  7. if( $_SESSION[ 'logged' ] )
  8. echo 'Już jesteś zalogowany!';
  9. else
  10. {
  11. $showWindow = '<div class="login">';
  12. $showWindow .= '<form action="?task=login" method="post">';
  13. $showWindow .= 'Login: <input type="text" name="login"><br />';
  14. $showWindow .= 'Hasło: <input type="password" name="pass"><br />';
  15. $showWindow .= 'Świat: <select name="world"><option>Świat 1</option><option>Świat 2</option></select><br />';
  16. $showWindow .= '<input type="submit" name="sendLogin" value="Zaloguj"><br />';
  17. $showWindow .= '</form>';
  18. $showWindow .= '</div>';
  19.  
  20. echo $showWindow;
  21.  
  22. if( isset( $_POST[ 'sendLogin' ] ) )
  23. {
  24. $login = trim( $_POST[ 'login' ] );
  25. $pass = trim( $_POST[ 'pass' ] );
  26.  
  27. if( empty( $login ) || empty( $pass ) )
  28. echo 'Wypełnij wszystkie pola!';
  29. else
  30. {
  31.  
  32. $pass = sha1( $pass );
  33.  
  34. $result = mysql_query( "SELECT * FROM users WHERE login='$login' AND pass='$pass'" );
  35.  
  36. if( mysql_num_rows( $result ) == 0 )
  37. echo 'Niestety lecz podałeś niepoprawne dane!';
  38. else
  39. {
  40. $row = mysql_fetch_array( $result );
  41.  
  42. $_SESSION[ 'logged' ] = true;
  43.  
  44. $_SESSION[ 'id' ] = $row[ 'id' ];
  45. $_SESSION[ 'login' ] = $row[ 'login' ];
  46. $_SESSION[ 'world' ] = $row[ 'world' ];
  47.  
  48. echo 'Logowanie zakończone sukcesem!';
  49. }
  50. }
  51. }
  52. }
  53.  
  54.  
  55. ?>
maniana
W headers already sent by... powinieneś mieć nazwę pliku i nr linii gdzie już zostały wysłane dane...
zbig
Witam!

Sprobuj
przesunac przed
, taki test maly, bo gdzies przed startem sesji jest przeslany prawdopodobnie jakis NOTICE do przegladarki.
Byc moze Twoj plik jest includowany przez inny plik ktory wysyla cos do przegladarki.
A tak na marginesie to dziwna jest ta logika wyswietlania formularza i sprawdzania przeslanych POST.
No ale to juz sprawa indywidualna wink.gif

Pozdrawiam
maniana
@zbig
Mówisz o logice? ja to pominąłem. Bo co logicznego jest w:
Cytat
HTMLSpecialChars( $pass )
smile.gif
com
gdzieś jednak najprawdopodobniej masz białe znaki może przed <?php wink.gif

  1. <?php
  2. if( !defined( 'GAME_THIS_SCRIPT' ) )
  3. die( 'Access denied' );
  4.  
  5.  
  6.  
  7.  
  8. if( $_SESSION[ 'logged' ] )
  9. echo 'Już jesteś zalogowany!';
  10. else
  11. {
  12. $showWindow = '<div class="login">';
  13. $showWindow .= '<form action="?task=login" method="post">';
  14. $showWindow .= 'Login: <input type="text" name="login"><br />';
  15. $showWindow .= 'Hasło: <input type="password" name="pass"><br />';
  16. $showWindow .= 'Świat: <select name="world"><option>Świat 1</option><option>Świat 2</option></select><br />';
  17. $showWindow .= '<input type="submit" name="sendLogin" value="Zaloguj"><br />';
  18. $showWindow .= '</form>';
  19. $showWindow .= '</div>';
  20.  
  21. echo $showWindow;
  22.  
  23. if( isset( $_POST[ 'sendLogin' ] ) )
  24. {
  25. $login = trim( $_POST[ 'login' ] );
  26. $pass = trim( $_POST[ 'pass' ] );
  27.  
  28. if( empty( $login ) || empty( $pass ) )
  29. echo 'Wypełnij wszystkie pola!';
  30. else
  31. {
  32.  
  33. $pass = sha1( $pass );
  34.  
  35. $result = mysql_query( "SELECT * FROM users WHERE login='$login' AND pass='$pass'" );
  36.  
  37. if( mysql_num_rows( $result ) == 0 )
  38. echo 'Niestety lecz podałeś niepoprawne dane!';
  39. else
  40. {
  41. $row = mysql_fetch_array( $result );
  42.  
  43. $_SESSION[ 'logged' ] = true;
  44.  
  45. $_SESSION[ 'id' ] = $row[ 'id' ];
  46. $_SESSION[ 'login' ] = $row[ 'login' ];
  47. $_SESSION[ 'world' ] = $row[ 'world' ];
  48.  
  49. echo 'Logowanie zakończone sukcesem!';
  50. }
  51. }
  52. }
  53. }
  54.  
  55.  
  56. ?>
kubek3898
Cytat(zbig @ 27.05.2013, 18:47:44 ) *
Witam!

Sprobuj
przesunac przed
, taki test maly, bo gdzies przed startem sesji jest przeslany prawdopodobnie jakis NOTICE do przegladarki.
Byc moze Twoj plik jest includowany przez inny plik ktory wysyla cos do przegladarki.
A tak na marginesie to dziwna jest ta logika wyswietlania formularza i sprawdzania przeslanych POST.
No ale to juz sprawa indywidualna wink.gif

Pozdrawiam


Możecie mi podać wiecej takich bledow logicznych bym w przyszlosci uniknal zlych nawykow?

@topic

Wasze rady sprawdze jutro, dzis juz niestety nie dam rady
gitbejbe
błędów w logice nauczysz się sam wraz z praktyką. Jedna poważna rzecz jaka rzuca się mocno w oczy jest
  1. $result = mysql_query( "SELECT * FROM users WHERE login='$login' AND pass='$pass'" );

po co pobierasz wszystko ? Fakt, zamieszałeś zmienne logowania tymi konwerterami ale tak czy siak dobrą praktyką nie jest pobieranie wszystkiego.

Ty potrzebujesz sprawdzić tylko czy ktoś taki istnieje, więc jeśli potrzebujesz dodatkowych zmiennych do sesji to robisz SELECT id,login,world FROM (itd). Po co masz pobierać w zapytaniu wszystkie parametry ? Dla kogo to robisz ? dla mnie ? bo napewno nie dla siebie ;p

co do sesji to uporządkuj kod i ładuj sesje tylko w jednym miejscu, np includujesz sobie plik config.php gdzie masz funkcje session_start() i połączenie z bazą danych
Błąd się pojawia bo ta funkcja może zostać wywołana tylko raz, a ty widocznie gdzies już ją rozpocząłeś.

Rozwiązaniem jest jeszcze - jak napisał kolega wyżej : ob_start() przed rozpoczęciem sesji - a najlepiej na samym początku dokumentu, wtedy możesz sobie pisać tych session_start dowoli (co jest mimo wszystko złą praktyką;p). To samo spotka Cię również np z header();
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.