Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Mechanizm logowania oparty na sesjach
Forum PHP.pl > Forum > Przedszkole
Bastian
Witam,
Pisze prosty mechanizm logowania oparty na sesjach. Zalozenie jest takie: jest mozliwosc rejestracji, gdzie skrypt zapisuje daje osoby rejestrującej sie do pliku baza.txt. Skrypt rejestracji wygląda następująco:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
  5. <title>Moj projekt</title>
  6. </head>
  7. <body>
  8.  
  9. <?php
  10.  
  11. define('BAZA','./baza.txt');
  12.  
  13. function Dodawanie($login, $haslo, $email)
  14. {
  15. if(strlen($login) < 3)
  16. {
  17. return false;
  18. }
  19. if(strlen($haslo) < 3)
  20. {
  21. return false;
  22. }
  23. if(!preg_match("/^[a-zA-Z0-9\.\_\-]+\@[a-zA-Z0-9\.\_\-]+\.[a-z]{2,4}$/D",$email))
  24. {
  25. return false;
  26. }
  27.  
  28. $baza = fopen(BAZA,'a');
  29.  
  30. $tablica_bazy = array (0 =>
  31. (nl2br(htmlspecialchars($login))),
  32. (nl2br(htmlspecialchars($haslo))),
  33. );
  34.  
  35. fwrite($baza, implode("::",$tablica_bazy)."\r\n");
  36. fclose($baza);
  37.  
  38. return true;
  39. }
  40.  
  41. if ($_SERVER['REQUEST_METHOD'] == "POST")
  42. {
  43. if(Dodawanie($_POST['login'],$_POST['haslo'],$_POST['email']))
  44. {
  45. echo '<p>Dziekujemy, twoje konto zostalo utworzone</p>';
  46. }
  47. else
  48. {
  49. echo '<p>Podales bledne lub za krotkie dane</p>';
  50. }
  51. echo '<a href="index3.php">Powrot</a>';
  52. }
  53. ?>
  54. <form method="post" action="adduser3.php">
  55. <h>Login</h>
  56. <input type="text" name="login" />
  57. <h>Haslo</h>
  58. <input type="text" name="haslo" />
  59. <h>Email</h>
  60. <input type="text" name="email" />
  61. <input type="submit" value="wyslij" />
  62. </form>
  63. </body>
  64. </html>


I tu nie ma problemu. Następnie właściwy skrypt logowania, w zalożeniu ma sprawdzać czy osoba wchodząca na stronę na jest zapisana w sesji i jesli nie to dostaje $id=0 a jesli jest i jej id jest wieksze od 0 to pojawia sie komunikat powitalny. Dok pliku wygląda tak:

  1. <?php
  2.  
  3.  
  4.  
  5. function wczytywanie()
  6. {
  7. global $rezultat;
  8. $wpisy=file('./baza.txt');
  9.  
  10. $rezultat=array();
  11.  
  12. foreach($wpisy as $wpis)
  13. {
  14. $wpis=explode("::",trim($wpis));
  15. $rezultat[]=array('login' =>$wpis[0], 'haslo' =>$wpis[1]);
  16.  
  17.  
  18.  
  19. }
  20.  
  21. };
  22.  
  23. wczytywanie();
  24.  
  25. function sprawdzanko($login, $haslo)
  26. {
  27. global $rezultat;
  28. foreach($rezultat as $id => $dane)
  29. {
  30. if($dane['login']== $login && $dane['haslo']==$haslo)
  31. {
  32. return $id;
  33. }
  34. }
  35. return false;
  36. };
  37.  
  38.  
  39. if(!isset($_SESSION['uzytkownik']))
  40. {
  41.  
  42. $_SESSION['uzytkownik'] = 0;
  43. }
  44.  
  45. if($_SESSION['uzytkownik'] > 0)
  46. {
  47. echo 'Witaj '.$rezultat[$_SESSION['uzytkownik']['login']].' na stronie';
  48.  
  49. }
  50. else
  51. {
  52. if($_SERVER['REQUEST_METHOD']=='POST')
  53. {
  54. if(($id=sprawdzanko($_POST['login'],$_POST['haslo'])) !== false)
  55.  
  56. {
  57. echo 'Zostales zalogowany';
  58.  
  59. include('./zakaz.php');
  60. }
  61. else
  62. {
  63. echo 'Podales zle dane';
  64. }
  65. }
  66. else
  67. {
  68. echo '<form method="post" action="index3.php"/>
  69. Zaloguj sie:<input type="text" name="login"><input type="text" name="haslo" />
  70. <input type="submit" value="OK" /></form>';
  71. }
  72.  
  73. }
  74. ?>
  75.  
  76.  
  77.  

Po wpisaniu prawidlowych danych user kierowany jest na odpowiednia stronę(wnętrze.php), która ma mechanizm blokujący userów, ktorzy nie są zalogowani. :
  1. <?php
  2. if($_SESSION['uzytkownik'] = 0)
  3. {
  4. }
  5. else
  6. {
  7. echo 'To jest wnetrze';
  8. }
  9. ?>


Rejestracja oraz logowanie działają. Jednak nie dzialają sesje. NIe ma komuniatu powitalnego oraz po wpisaniu z ręki scieżki do pliku wnętrze.php widzę jego zawartośc....Prosiłbym o pomoc bo zaczynam sie gubić worriedsmiley.gif
cojack
Chyba sobie jaja robisz że ma Ci pokazać zostałeś zalogowany jak po tym od razu masz header z location. To niby w którym momencie ma Ci ten tekst pokazać? Pomiędzy przesyłaniem i sprawdzaniem serwera dns a robieniem Ci kanapek? Bez przesady. A w pliku wnętrze.php brakuje session_start();
sadistic_son
Po pierwsze wysyłasz nagłowki po wyświetleniu tekstu. Tak nie wolno, nagłowki muszą być wysłane zanim cokolwiek pojawi sie w html.
  1. /*58.*/echo 'Zostales zalogowany';
  2. /*59.*/header('Location: <a href="http://grzempek.c0.pl/test_php/PROJEKT/wnetrze.php" target="_blank">http://grzempek.c0.pl/test_php/PROJEKT/wnetrze.php</a> ');


Po drugie masz błąd w składni:
  1. //nie tak:
  2. if($_SESSION['uzytkownik'] = 0)
  3. //tylko tak:
  4. if($_SESSION['uzytkownik'] == 0)

Po trzecie, czwarte itd. wyszukamy jak poprawisz to i napiszesz rezultaty.

EDIT: i jak wyżej wspomniano... brakuje session_start w wnetrze.php
Bastian
Sorki tam powiniem umiescic include..juz poprawilem. Jednak wyświetlanie komunikatu o zalogowaniu nie jest dla mnie tak nurtujące jak niedziałające sesje..

EDIT: sadystyczny_synu juz spiesze z testami winksmiley.jpg
cojack
Cytat
Po pierwsze wysyłasz nagłowki po wyświetleniu tekstu. Tak nie wolno, nagłowki muszą być wysłane zanim cokolwiek pojawi sie w html.


bzdura
sadistic_son
Cytat(cojack @ 21.11.2009, 02:02:27 ) *
bzdura
Skoro dla Ciebie to bzdura to kłóć się z manualem i każ poprawić twórcom php to zdanie:"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."
Bastian
Ok tak więc kod wygląda następująco.

plik index3.php:

  1. <?php
  2.  
  3.  
  4.  
  5. function wczytywanie()
  6. {
  7. global $rezultat;
  8. $wpisy=file('./baza.txt');
  9.  
  10. $rezultat=array();
  11.  
  12. foreach($wpisy as $wpis)
  13. {
  14. $wpis=explode("::",trim($wpis));
  15. $rezultat[]=array('login' =>$wpis[0], 'haslo' =>$wpis[1]);
  16.  
  17.  
  18.  
  19. }
  20.  
  21. };
  22.  
  23. wczytywanie();
  24.  
  25. function sprawdzanko($login, $haslo)
  26. {
  27. global $rezultat;
  28. foreach($rezultat as $id => $dane)
  29. {
  30. if($dane['login']== $login && $dane['haslo']==$haslo)
  31. {
  32. return $id;
  33. }
  34. }
  35. return false;
  36. };
  37.  
  38.  
  39. if(!isset($_SESSION['uzytkownik']))
  40. {
  41.  
  42. $_SESSION['uzytkownik'] = 0;
  43. }
  44.  
  45. if($_SESSION['uzytkownik'] > 0)
  46. {
  47. echo 'Witaj '.$rezultat[$_SESSION['uzytkownik']['login']].' na stronie';
  48.  
  49. }
  50. else
  51. {
  52. if($_SERVER['REQUEST_METHOD']=='POST')
  53. {
  54. if(($id=sprawdzanko($_POST['login'],$_POST['haslo'])) !== false)
  55.  
  56. {
  57. echo 'Zostales zalogowany';
  58. include('./wnetrze.php');
  59. }
  60. else
  61. {
  62. echo 'Podales zle dane';
  63. }
  64. }
  65. else
  66. {
  67. echo '<form method="post" action="index3.php"/>
  68. Zaloguj sie:<input type="text" name="login"><input type="text" name="haslo" />
  69. <input type="submit" value="OK" /></form>';
  70. }
  71.  
  72. }
  73. ?>
  74.  
  75.  
  76.  


Plik wnetrze.php

  1. <?php
  2. $session_start();
  3. if($_SESSION['uzytkownik'] == 0)
  4. {
  5. }
  6. else
  7. {
  8. echo 'To jest wnetrze';
  9. }
  10. ?>
  11.  


Wpisalem nie logujac sie jeszcze nigdzie w pasku adresu ściezke do pliku wnetrze.php i teraz nie wyswietla sie tekst "to jest wnetrze" ale tez nie przekierowuje mnie nigdzie. Po zalogowaniu się wyświetla się "Zostałeś zalogowany" ale nie przenosi mnie do pliku wnętrze.php. ..

PS Kurde czemu do tych url przyklejają sie jakies dodatkowe atrybuty ? :/
PS2. Tez studiując php uczono mnie ze przed headerami nie moze byc htmla, ale prosze nie o to sie tu rozchodzi winksmiley.jpg
sadistic_son
Spróbuj tak:
  1. $session_start();
  2. if($_SESSION['uzytkownik'] == 0)
  3. {
  4. }
  5. else
  6. {
  7. echo 'To jest wnetrze';
  8. }

PS. Spadam spać, jeśli nie pomogłem - sorki.
Bastian
Nie pomoglo
cojack
To że oni sobie piszą to nie znaczy że być nie może.

var_dump($_SESSION); w wnętrze.php i pokaż co tam masz po zalogowaniu się, i przy próbie logowania rób też var_dump, dane i exity strzelaj, to jest naprostrzy i najskuteczniejszy sposób debugowania winksmiley.jpg
Bastian
Witam,
Problem już rozwiązany. Chodziło o to, że nie zainicjowałem powiązania zmiennej $id z mechanizmem sesji, poprzez wpisanie id usera do tablicy sesji.

  1. $_SESSION['uzytkownik'] = $id;


  1. <?php
  2.  
  3.  
  4.  
  5. function wczytywanie()
  6. {
  7. global $rezultat;
  8. $wpisy=file('./baza.txt');
  9.  
  10. $rezultat=array();
  11.  
  12. foreach($wpisy as $wpis)
  13. {
  14. $wpis=explode("::",trim($wpis));
  15. $rezultat[]=array('login' =>$wpis[0], 'haslo' =>$wpis[1]);
  16.  
  17.  
  18.  
  19. }
  20.  
  21. };
  22.  
  23. wczytywanie();
  24.  
  25. function sprawdzanko($login, $haslo)
  26. {
  27. global $rezultat;
  28. foreach($rezultat as $id => $dane)
  29. {
  30. if($dane['login']== $login && $dane['haslo']==$haslo)
  31. {
  32. return $id;
  33. }
  34. }
  35. return false;
  36. };
  37.  
  38.  
  39. if(!isset($_SESSION['uzytkownik']))
  40. {
  41.  
  42. $_SESSION['uzytkownik'] = 0;
  43. }
  44.  
  45. if($_SESSION['uzytkownik'] > 0)
  46. {
  47. echo 'Witaj '.$rezultat[$_SESSION['uzytkownik']['login']].' na stronie';
  48.  
  49. }
  50. else
  51. {
  52. if($_SERVER['REQUEST_METHOD']=='POST')
  53. {
  54. if(($id=sprawdzanko($_POST['login'],$_POST['haslo'])) !== false)
  55.  
  56. {
  57. $_SESSION['uzytkownik'] = $id;
  58.  
  59.  
  60. }
  61. else
  62. {
  63. echo 'Podales zle dane';
  64. }
  65. }
  66. else
  67. {
  68. echo '<form method="post" action="index3.php"/>
  69. Zaloguj sie:<input type="text" name="login"><input type="text" name="haslo" />
  70. <input type="submit" value="OK" /></form>';
  71. }
  72.  
  73. }
  74. ?>
  75.  
  76.  
  77.  


Plik wnetrze.php sprawdzający czy id usera jest w sesji i moze on zobaczyć treść, również poparwiony przez usunięcie $ przy inicjajci sesji:

  1. <?php
  2. if($_SESSION['uzytkownik'] == 0)
  3. {
  4. }
  5. else
  6. {
  7. echo 'To jest wnetrze';
  8. }
  9. ?>
  10.  


Pewnie będę Was jeszcze męcuć. Tymczasem, dzieki i pozdrawiam

Witam,

A więc ostatecznie mój skrypt logowania działa. Przy jego poprawie wykorzystałem uwagi bardziej doświadczonych kolegów. W związku z tym musze wyjaśnić coś co powoduje, że (prawie) wszystko działa a wg mnie nie powinno tongue.gif
Ostateczny mechanizm logowania, sprawdzania po sesjach ID uzytkownika wygląda tak:

  1. <?php
  2.  
  3.  
  4.  
  5. function wczytywanie()
  6. {
  7. global $rezultat;
  8. $wpisy=file('./baza.txt');
  9.  
  10. $rezultat=array();
  11.  
  12. foreach($wpisy as $wpis)
  13. {
  14. $wpis=explode("::",trim($wpis));
  15. $rezultat[]=array('login' =>$wpis[0], 'haslo' =>$wpis[1]);
  16.  
  17.  
  18.  
  19. }
  20.  
  21. };
  22.  
  23. wczytywanie();
  24.  
  25. function sprawdzanko($login, $haslo)
  26. {
  27. global $rezultat;
  28. foreach($rezultat as $id => $dane)
  29. {
  30. if($dane['login']== $login && $dane['haslo']==$haslo)
  31. {
  32. return $id;
  33. }
  34. }
  35. return false;
  36. };
  37.  
  38.  
  39. if(!isset($_SESSION['uzytkownik']))
  40. {
  41.  
  42. $_SESSION['uzytkownik'] = 0;
  43. }
  44.  
  45. if($_SESSION['uzytkownik'] > 0)
  46. {
  47. echo 'Witaj '.$rezultat[$_SESSION['uzytkownik']['login']].' na stronie';
  48.  
  49. }
  50. else
  51. {
  52. if($_SERVER['REQUEST_METHOD']=='POST')
  53. {
  54. if(($id=sprawdzanko($_POST['login'],$_POST['haslo'])) !== false)
  55.  
  56. {
  57. $_SESSION['uzytkownik'] = $id;
  58.  
  59. header('Location: <a href="http://grzempek.c0.pl/test_php/PROJEKT/wnetrze.php" target="_blank">http://grzempek.c0.pl/test_php/PROJEKT/wnetrze.php</a> ');
  60.  
  61. }
  62. else
  63. {
  64. echo 'Podales zle dane';
  65. }
  66. }
  67. else
  68. {
  69. echo '<form method="post" action="index3.php"/>
  70. Zaloguj sie:<input type="text" name="login"><input type="text" name="haslo" />
  71. <input type="submit" value="OK" /></form>';
  72. }
  73.  
  74. }
  75. ?>
  76.  
  77.  
  78.  


Po wpisaniu w polach logowania loginu i hasła zgodnego z plikiem bazy, przenosi mnie do pliku wnętrze.php. Po wyczyszczeniu ciastek próba wejscia po scieżce na wnętrze.php konczy sie przeniesieniem na onet. CO mnie nurtuje: skoro jakie numer ID ma pierwszy user widniejący w pliku bazy?questionmark.gif Musi mieć 1, ale dlaczego skoro numerowanie w tablicach zaczyna się od 0 a ja nigdzie nie określiłem początkowej liczby indeksu. Orginalny kod wyglądał tak:

  1. <?php
  2.  
  3. $uzytkownicy = array(1=>
  4. array('login' => 'user1', 'haslo' => sha1('ppp')),
  5. array('login' => 'user2', 'haslo' => sha1('ddd')),
  6. array('login' => 'user3', 'haslo' => sha1('fff'))
  7. );
  8.  
  9. function czyIstnieje($login, $haslo)
  10. {
  11. global $uzytkownicy;
  12.  
  13. $haslo = sha1($haslo);
  14.  
  15. foreach($uzytkownicy as $id => $dane)
  16. {
  17. if($dane['login'] == $login && $dane['haslo'] == $haslo)
  18. {
  19. // O, jest ktos taki - zwroc jego ID
  20. return $id;
  21. }
  22. }
  23. // Jeżeli doszedłeś a tutaj, to takiego użytkownika nie ma
  24. return false;
  25. } // end czyIstnieje();


Jak widać index zaczyna sie od 1. W moim skrupcie loginy i hasla nie sa w kodzie umiejscowione na sztywno tylko pobierane z pliku baza.txt i dostałem poradę zeby uproscic tą tablicę...

Druga sprawa: We fragmencie;

  1. if($_SESSION['uzytkownik'] > 0)
  2. {
  3. echo 'Witaj '.$rezultat[$_SESSION['uzytkownik']['login']].' na stronie';
  4.  
  5. }


NIe wyświetla się nazwa usera. Jak pobrac z tablicy sesji nazwe uzytkownika?

Ociu
Panowie, proszę budować posty zawierające więcej słów niż jedno czy dwa. Takie posty będą traktowane jako nabijanie.
cojack, skoro zanegowałeś post sadistic_son'a, to warto by podać jakieś argumenty.
Bastian
Cytat(Ociu @ 28.11.2009, 09:55:12 ) *
Panowie, proszę budować posty zawierające więcej słów niż jedno czy dwa. Takie posty będą traktowane jako nabijanie.
cojack, skoro zanegowałeś post sadistic_son'a, to warto by podać jakieś argumenty.


Witam,
W poscie #11 w przerwszym zdaniu i kodzie komentującym wyjaśniłem co było problemem. Zawsze wyjaśniam, nie tylko z czystej empatii dla następnych, ale również dla siebie na przyszłość.

Wracając do wątku: zadam pytanie wprost. Czy id pierwszego usera w pliku baza.txt wynosi 1? Jesli tak to dlaczego?
Quantum
Cytat(sadistic_son)
Po pierwsze wysyłasz nagłowki po wyświetleniu tekstu. Tak nie wolno, nagłowki muszą być wysłane zanim cokolwiek pojawi sie w html.


output_buffering, ob_ ?
Bastian
Panowie tamten problem został rozwiązany. Chodzi mi tylko o odpowiedz na moje ostatnie pytania guitar.gif

Ok, już rozwiałem moje wątpliwości. Oczywiście stwierdzenie, że "wszystko działa" było błędne, gdyż dopiero teraz sprawdziłem logowanie pierwszego usera w bazie (pliku baza.txt) no i okazało się, że przeniosło mnie na onet, dzięki

Kod
#
<?php
#
session_start();
#
if($_SESSION['uzytkownik'] == 0)
#
{
#
header('Location: http://www.onet.pl/');
#
}
#
else
#
{
#
echo 'To jest wnetrze';
#
}
#
?>


a więc, jednak pierwszy user ma id =0....trza to poprawić..
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.