Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nietypowy problem session_start
Forum PHP.pl > Forum > PHP
AuronDiel
Witam wszystkich! smile.gif
Na wstęp napiszę, że od 8 godzin szukam w necie rozwiązania mojego problemu i nic, przeczytałem wiele tematów o kodowaniu BOM, spacji przed <?php, przeszukałem też tutejsze forum, też nic ciekawego.
Zdesperowany postanowiłem napisać mój problem tutaj.
  1. <?php
  2.  
  3. // rozpoczęcie buforowania (jest to potrzebne by nie mieć błędów typu headers already sent)
  4.  
  5. // start sesji
  6.  
  7. // połączenie z mysql
  8. mysql_connect('localhost', 'root', '')
  9. or die('Nieudane polaczenie z baza danych...');
  10.  
  11. // wybór bazy danych
  12. or die('Nie udalo sie wybrac bazy danych...');
  13.  
  14. // nagłówek
  15. echo '<h2>Logowanie</h2>';
  16.  
  17. // sprawdzamy czy user jest już zalogowany
  18. if($_SESSION['logged']) echo 'Już jestes zalogowany!';
  19. else
  20. {
  21. // tworzymy prosty formularz
  22. echo '<form action="login.php" method="POST">
  23. Nick: <br />
  24. <input type="text" name="nick"><br />
  25. Hasło: <br />
  26. <input type="password" name="pass"><br />
  27. <input type="submit" name="ok" value="Zaloguj">
  28. </form>';
  29.  
  30. // jeśli zostanie naciśnięty przycisk "Zaloguj"
  31. if(isset($_POST['ok']))
  32. {
  33. $nick = $_POST['nick'];
  34. $pass = $_POST['pass'];
  35.  
  36. // sprawdzamy czy wszystkie dane zostały podane
  37. if(empty($nick) || empty($pass)) echo 'Wpisz wszystkie pola!';
  38. // jeśli tak...
  39. else
  40. {
  41. // filtrujemy dane
  42.  
  43. // kodujemy hasło
  44. $pass = md5($pass);
  45.  
  46. // sprawdzamy czy istnieje użytkownik z takim loginem i hasłem
  47. $result = mysql_query("SELECT * FROM users WHERE nick='$nick' AND pass='$pass'");
  48.  
  49. // jeśli nie istnieje
  50. if(mysql_num_rows($result)==0) echo 'Niestety podałes niepoprawne dane!';
  51. // jeśli tak...
  52. else
  53. {
  54. // dodajemy wynik zapytania do tablicy
  55. $row = mysql_fetch_array($result);
  56.  
  57. // ustawianie sesji że użytkownik jest zalogowany
  58. $_SESSION['logged'] = true;
  59.  
  60. // dodawanie do sesji id użytkownika, login oraz datę rejestracji
  61. $_SESSION['id'] = $row['id'];
  62. $_SESSION['nick'] = $row['nick'];
  63. $_SESSION['data_rejestracji'] = $row['data_rejestracji'];
  64.  
  65. // wyświetlenie komunikatu oznaczającego poprawne logowanie
  66. echo 'Zostałes poprawnie zalogowany! Możesz teraz przejsć na <a href="index.php">stronę główna</a>';
  67. }
  68. }
  69. }
  70. }
  71.  
  72. // rozłączenie z bazą danych
  73.  
  74. // koniec buforowania
  75. ?>

O to mój skrypt logowania który zamieszczam w indexie.
  1. <title>xx</title>
  2. <link href="css/dropdown/dropdown.css" media="screen" rel="stylesheet" type="text/css" />
  3. <link href="css/dropdown/themes/mtv.com/default.ultimate.css" media="screen" rel="stylesheet" type="text/css" />
  4. <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
  5. <link rel="Stylesheet" type="text/css" href="style.css" />
  6. <link rel="Shortcut icon" href="images/ico.ico" />
  7. </head>
  8. <body background="images/body_bg.gif" bgproperties="fixed" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
  9. <div id="top">
  10. <div id="NAGLOWEK">
  11. <div id="menuu">
  12. <ul id="nav" class="dropdown dropdown-horizontal">
  13. </li>
  14. <li id="n-home"><span class="dir">Rejestracja</span>
  15.  
  16. </li>
  17. </li>
  18. <li id="n-home"><span class="dir">x</span>
  19.  
  20. </li>
  21. </li>
  22. <li id="n-home"><span class="dir">Zaloguj się</span>
  23.  
  24. </li>
  25. </li>
  26. <li id="n-home"><span class="dir">Kontakt</span>
  27.  
  28. </li>
  29. </ul>
  30.  
  31.  
  32.  
  33.  
  34. </div>
  35.  
  36.  
  37. <br><br><br>
  38. <a href="index2.html" border="0"><img src="images/xx.png" ></a>
  39. <br>
  40. </div>
  41. <div id="MENU"><img src="images/wybierz.png" ></div>
  42. <div id="INFORMACJE"></div>
  43. <div id="TRESC">
  44. <br><br>
  45. <font size="5" color="orange">Logowanie</font><br>
  46. <hr size="1" Color="gray" >
  47.  
  48. <tr>
  49. <td bgcolor="#202020" border="0" id="kontakttabela">
  50. <br><?php
  51. require_once('re/login.php');
  52. ?>
  53.  
  54. <br><br><br>
  55. </td>
  56. </tr>
  57. <br><br><br><br>
  58.  
  59.  
  60. </div>
  61. <div id="STOPKA">
  62. <font color="white" face="Verdana" id="trescstopki">
  63. <br>
  64. @ xxx
  65. </font>
  66. </div>
  67. </body>
  68. </html>


A otrzymany błąd to oczywiście:
,,Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent"
Chyba dosłonie próbowałem wszystkiego.. jedynie co ciekawego przykuło moją uwage to, że kiedy wchodzę w plik login.php to nie wypisuje mi błedu, dopiero kiedy go gdzieś wrzucam to nie działa.. kompletnie nie rozumiem

Prosze was bardzo o pomoc

Pozdrawiam
tehaha
Mogłeś chociaż napisać co już próbowałeś i nie działało bo pewnie przez 8 godzin spróbowałeś wiele rzeczy. Ja mam natomiast takie pytanie, czy ten pierwszy skrypt to jest właśnie login.php? Bo jeżeli tak to nic dziwnego, że wywala błąd skoro przed session_start(), jest jeszcze 55 linijek kodu....to session_start jest wywołane dopiero tam gdzie masz include
AuronDiel
Mogłeś chociaż napisać co już próbowałeś i nie działało bo pewnie przez 8 godzin spróbowałeś wiele rzeczy. Ja mam natomiast takie pytanie, czy ten pierwszy skrypt to jest właśnie login.php? Bo jeżeli tak to nic dziwnego, że wywala błąd skoro przed session_start(), jest jeszcze 55 linijek kodu....to session_start jest wywołane dopiero tam gdzie masz include
1. Kodowanie na wszystkie sposoby, czytanie w necie o session_start, ob_start, zmienianie kolejnosc itp
2. Tak pierwszy skrypt to login.php ktory wrzucam do drugiego skryptu czyli index.html
3. To w takim razie co mam zrobic? dac session start obok <?php ?
tehaha
Widzę, że nie rozumiesz. Session_start() ma być absolutnie na samym początku tego co wyświetlasz, przed jakimkolwiek html'em, a nie że na początku pliku w, którym jest. Ty Wysyłasz najpierw 55 linijek htmla a potem załączasz plik gdzie odpalasz session_start(), czyli session_start u Ciebie nie jest na samym początku a wmieszany w html, dlatego otrzymujesz błąd. Czyli w tym przypadku, który tu opisałeś rozwiązaniem będzie usunięcie session_start() z pliku login.php i umieszczenie go przed treścią html w pliku index, czyli

  1. <?php session_start(); ?>
  2. <html>
  3. <head>
  4. <title>xx</title>
  5. <link href="css/dropdown/dropdown.css" media="screen" rel="stylesheet" type="text/css" />
  6. <link href="css/dropdown/themes/mtv.com/default.ultimate.css" media="screen" rel="stylesheet" type="text/css" />
  7. <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">


Przed session_start() nie może być kompletnie nic, nawet spacja, dodatkowo upewnij się, że plik zapisałeś bez BOM bo to BOM to też znacznik zapisywany na początku pliku.
AuronDiel
Geniusz! Straciłem ponad 8 godzin! AH!
Wielki dzięki, + dla ciebie.
lucaa44
kolego AuronDiel, ja bym powiedzial ze problem jest jak najbardziej typowy, mi kiedys dosc czesto sie zdarzal;]...poza tym jakby nie bylo klania sie MANUALexclamation.gif, a konkretnie znajomosc dzialania sesji, funkcji sesji i dzialania naglowkow: sesje - http://www.php.net/manual/pl/function.session-start.php -

Cytat
Informacja:

Jeśli używasz sesji opartych o ciasteczka, to session_start() musi być wywołane przed wysłaniem jakichkolwiek danych do przeglądarki.
(jakichkolwiek czyli tez HTML'a i bialych znakow czyli np spacji)
,

naglowki - http://www.php.net/manual/pl/function.header.php -

Cytat
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called.
(czarno na bialym;])

dlaczego pisze o naglowkach?? ano, podczas rozpoczecia sesji do przegladarki wysylane sa naglowki ( automatycznie, tak jakby przegladarka za Ciebie uruchomila headers() ), dlatego by sesja mogla ruszyc musza byc spelnione warunki umozliwiajace wysylanie naglowkow, i znowu klania sie manual -

Cytat
Additionally, session_cache_limiter() and the session.cache_limiter configuration setting can be used to automatically generate the correct caching-related headers when sessions are being used.


warto nieraz na poczatek zajrzec do manuala i sie zwyczajnie doksztalcic
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.