Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Logowanie i przekierowanie
Forum PHP.pl > Forum > Przedszkole
OlgaG
Napisałam proste logowanie:

  1. <?php
  2. //rozpoczynamy nową sesję
  3.  
  4. //generowanie nagłówka html
  5. require_once("files/htmlgenerator.php");
  6.  
  7. //połączenie z bazą danych
  8. require_once("files/connect.php");
  9.  
  10. //sprawdzanie poprawności loginu i hasła
  11.  
  12.  
  13. //jeśli hasło i login są ok
  14. else
  15. {
  16.  
  17.  
  18. //zapisujemy w tablicy Session, że użytkownik jest zalogowany
  19. $_SESSION['login'] = 'zalogowany';
  20.  
  21. //zapisujemy w tablicy Session login użytkowanika
  22. $_SESSION['user'] = $_POST['login'];
  23.  
  24. echo <<<LUZ
  25.  <script LANGUAGE="JavaScript" TYPE="text/javascript">
  26. window.setTimeout("location.href='files/welcome.php'",1000);
  27. </SCRIPT> 
  28. LUZ;
  29. ?>


Problem w tym, że po przekierowaniu na stronę welcome.php w tablicy $_SESSION nic nie ma zapisane. Jak zatem zrobić, by przed przekierowaniem zapisać dane w $_SESSION?

Nie używam header() do przekierowania, bo rzuca błędem, że nagłówki wysłał już plik connect.php
KCG
A dałeś session_start() w drugim pliku?
.radex
header() nie działa, kiedy napiszesz już coś (np. echo 'cos'; header('cos') )... Po za tym możesz użyć HTML'owego meta refresh.

Daj treść drugiego pliku.
OlgaG
Ok, treść drugiego pliku, czyli tego na który jest przekierowanie:

  1. <?php
  2. //rozpoczynamy nową sesję
  3.  
  4. require_once("htmlgenerator.php");
  5.  
  6. $html = new htmlgenerator("welcome","Strona powitalna");
  7.  
  8. $html->createMenu();
  9.  
  10. echo "<h1>Witaj w systemie dodawania treści do bloga</h1>";
  11.  
  12.  
  13. ?>


Jak sobie robię print($_SESSION); to pokazuje pustą tablicę.
Lejto
jak ci wywala błędy z headerem to użyj
  1. <?php
  2. ?>
OlgaG
Ok, ale dlaczego nie zapisują się dane w tablicy $_SESSION. Czy mam jakiś błąd w pliku welcome.php?
.radex
Chyba nie da się wyechować całej tablicy $_SESSION. Jak chcesz uzyskać dostęp to bezpośrednio, np:

  1. <?php
  2. echo $_SESSION['login'];
  3. ?>
-OlgaG-
Da się. Jak w pliku welcome.php, zamiast w pliku index.php(czyli już po przeniesieniu) uzupełniam tablicę $_SESSION, to robiąc print($_SESSION) pięknie wyświetlają mi się wszystkie dane. Wyraźnie nie zapamiętuje tych danych w pliku skąd idzie przeniesienie. sciana.gif
.radex
A sprawdzałaś? Może się mylę, ale wydaje mi się, że jak uzupełnisz tablicę, no to możesz zrobić taki trik, ale po przeniesieniu już nie, bo nie pamięta tego co zostało wpisane jako normalna zmienna, a to co jest w pliku...
Hazel
Jeśli robisz przekierowanie za pomocą JS, nie ma prawa przesłać sesji do kolejnej strony.

Stosuj jednak nagłówki. To by wyglądąło mniej więcej tak:
  1. <?php
  2. //rozpoczynamy nową sesję
  3.  
  4. //generowanie nagłówka html
  5. require_once("files/htmlgenerator.php");
  6.  
  7. //połączenie z bazą danych
  8. require_once("files/connect.php");
  9.  
  10. //sprawdzanie poprawności loginu i hasła
  11.  
  12.  
  13. //jeśli hasło i login są ok
  14. else
  15. {
  16.  
  17.  
  18. //zapisujemy w tablicy Session, że użytkownik jest zalogowany
  19. $_SESSION['login'] = 'zalogowany';
  20.  
  21. //zapisujemy w tablicy Session login użytkowanika
  22. $_SESSION['user'] = $_POST['login'];
  23.  
  24. header('Location: welcome.php');
  25. }
  26. ?>
I teraz w pliku welcome.php normalnie masz wszystkie zmienne sesji, jakie powinnaś mieć. Jeśli nie dałaś całego kodu, to header() może nie działać praktycznie tylko wtedy, gdy wcześniej do przeglądarki wysyłany jest jakiś output. Po prostu go stamtąd wyrzuć i będzie działać.
OlgaG
Jak stosuje header() to przyczepia mi się do pliku connect.php, że niby tam są wysłane już jakieś nagłówki. Treść tego pliku to po prostu połączenie z bazą danych:
  1. <?php
  2. //połączenie z bazą
  3. $conn = @new mysqli("localhost", "root", "vertrigo", "aplikacja");
  4.  
  5. //obsługa błędów
  6. if(mysqli_connect_errno() !=0)
  7. {
  8. $errno = mysqli_connect_errno();
  9. $errmsg = mysqli_connect_error();
  10. echo "Połączenie z bazą danych nie powiodło się: ($errno) $errmsg<br />\n";
  11. }
  12.  
  13. //ustawienie kodowania
  14. $conn->query("SET NAMES 'utf8'");
  15. ?>


Co tutaj powoduje błąd w header()?

Co ciekawe: sesje zaczęły się zapisywać, nawet przy użyciu przekierowania przez JS dry.gif Zawartość tablicy SESSION mi się nie wyświetlała, bo robiłam szkolny błąd: print zamiast print_r wstydnis.gif
nowotny
Uruchom ten plik w przeglądarce i obejrzyj źródło...
OlgaG
Uruchomiłam - pusto, nic nie idzie, w każdym razie źródło nic nie pokazuje. sciana.gif

Nagłówki są generowane w index.php . Czy to ma wpływ na użycie header()?
VegA
Dam gotowca smile.gif

Kod index.php:

  1. <?php
  2. include("polacz_z_baza_mysql.php");
  3. ?>
  4. <html>
  5. <head>
  6. </head>
  7. <body>
  8. <?php
  9. if (!isset($_SESSION['authenticated']))
  10. {
  11. ?>
  12. <form action="index.php" method="post">
  13. Login <input type="text" size="10" name="login" /><br>
  14. Hasło <input type="password" size="10" name="password" /><br>
  15. Zapamiętaj mnie<input type="checkbox" name="rememberme" value="yes" /><br>
  16. <input type="submit" name="submit" value="Loguj" />
  17. <?php
  18.  
  19. if (!empty($_POST['login']) && !empty($_POST['password']))
  20. {
  21.  
  22. $login=$_POST['login'];
  23.  
  24. $sql1="SELECT * FROM `users` WHERE `login` LIKE '$aaa'";
  25. $zrob=mysql_query($sql1);
  26.  
  27. while($wiersz=mysql_fetch_array($zrob))
  28. {
  29. if($_POST['login']==$wiersz['login'] && md5($_POST['password'])==$wiersz['haslo'])
  30. {
  31. $_SESSION['authenticated']=$_POST['login'];
  32.  
  33. echo "<script language='javascript'>";
  34. echo "window.top.location='strona_glowna.php';";
  35. echo "</script>";
  36. }
  37. else
  38. {
  39. print "<font color='red' size=1 face='verdana'>Podałeś zły login lub hasło!</font>";
  40. }
  41. }
  42.  
  43. }
  44.  
  45. ?>
  46. <?php
  47. }
  48. ?>
  49. </form>
  50. </body>
  51. </html>


Kod strona_glowna.php:

  1. <?php
  2.  
  3. if ( isset( $_SESSION['authenticated'] ) )
  4. {
  5.  
  6. include("polacz_z_baza_mysql.php");
  7.  
  8. $login=$_SESSION['auth'];
  9. ?>
  10. <html>
  11. <head>
  12. </head>
  13. <body>
  14. <?php
  15. print "Witaj ".$login."";
  16. ?>
  17. </body>
  18. </html>
  19. <?php
  20. }
  21. else
  22. {
  23. echo "<p align=center>Prawdo podobnie się nie zalogowałeś, albo zostałeś wylogowany. Proszę się zal
    ogować jeszcze raz!</p>"
    ;
  24. echo "<p align=center><a href='index.php' target='_top'>Zaloguj się ponownie!</a></p>";
  25. }
  26.  
  27. ?>


Tam gdzie jest $sql to jest zmienna z pliku "polacz_z_baza_mysql.php". Więc to już chyba sam napiszesz ;] pzdr
Mam nadzieje, że pomogłem
OlgaG
Dzięki VegA. Z tego co widze to Twój skrypt też przekierowuje za pomocą JS. Mój z tym przekierowaniem też już działa smile.gif , ale i tak dzięki. Zawsze można podpatrzeć jak inni to piszą. Intryguje mnie jednak dlaczego header() nie chce działać. Hazel, czy możesz mi wytłumaczyć co masz na myśli pisząc "jakiś output", bo nie bardzo kojarzę? dry.gif
KCG
Może wklej cały błąd.I po co dołączasz files/htmlgenerator.php?
OlgaG
Błąd wygląda tak

  1. <?php
  2. Warning: Cannot modify header information - headers already sent by (output started at C:Program FilesVertrigoServwwwaplikacjafilesconnect.php:1) in C:Program FilesVertrigoServwwwaplikacjaindex.php on line 83
  3. ?>


a pliczek htmlgenerator.php zawiera klasę, której metody generują kod html. Zrobiłam tak, by odseparować kod html od php.
Synapsa
Znaczy że już nagłówki zostały wysłane.
Daj na początku kodu ob_start" title="Zobacz w manualu PHP" target="_manual
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.