Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]System logowania - problem
Forum PHP.pl > Forum > Przedszkole
cent4
Witam.
Mam problem z systemem logowania.
Gdy jest on zewnętrzny (sam system logowania bez zagnieżdżania w stronę) wszystko działa.

Natomiast ja wkładam go w stronę www nie działa. Klikam na zakładkę strefa użytkownika - wpisuje dane i nic - pisze mi, że jestem nie zalogowany, natomiast gdy drugi raz kliknę na strefa użytkownika i wpiszę dane - zaloguję się bez problemu - co jest nie tak?

tak wygląda strona główna:
  1. <li><a href="index.php?go=home">Home</a></li>
  2. <li><a href="index.php?go=strefa">Strefa uczestnika</a></li>
  3. ...
  4.  
  5. <div id="KONTENER_TLO">
  6.  
  7. <?
  8. switch ($_GET['go'])
  9. {
  10. case 1:
  11. include("strefa.php");
  12. break;
  13.  
  14. case logout:
  15. include("logout.php");
  16. break;
  17.  
  18. case zalogowany:
  19. include("zalogowany.php");
  20. break;
  21. }
  22. ?>
  23.  
  24. </div>


tak wygląda plik zalogowany.php:
  1.  
  2. if (isset($_SESSION['user_id']) and isset($_SESSION['login']))
  3.  
  4. {
  5. ........
  6.  
  7. }
  8. ?>


a tak wygląda plik strefa.php:
  1. <?php
  2. ?>
  3.  
  4. .....
  5.  
  6. <form action="index.php?go=strefa" method="post">
  7. <?php
  8. if (isset($_POST['konto']) and isset($_POST['password']) )
  9.  
  10. {
  11.  
  12. require('conn.php');
  13.  
  14. $konto=mysql_real_escape_string(trim($_POST['konto']));
  15.  
  16. ..........
  17.  
  18. }
  19. else{
  20. ?>
  21. TUTAJ MIEJSCE NA LOGIN I HASŁO W HTML
  22. </form>
  23. <?php
  24. }
  25. ?>
1937817
W 2 kodzie pasowało by dopisać na początku <?php
I jeszcze mała edycja 1 kodu:
  1. <li><a href="index.php?go=home">Home</a></li>
  2. <li><a href="index.php?go=strefa">Strefa uczestnika</a></li>
  3. ...
  4.  
  5. <div id="KONTENER_TLO">
  6.  
  7. <?php
  8. switch ($_GET['go'])
  9. {
  10. case 1:
  11. include("strefa.php");
  12. break;
  13.  
  14. case logout:
  15. include("logout.php");
  16. break;
  17.  
  18. case zalogowany:
  19. include("zalogowany.php");
  20. break;
  21. }
  22. ?>
  23.  
  24. </div>
  25.  
mortus
Skoro w $_GET['go'] przekazujesz nazwę podstrony, to dlaczego masz
  1. case 1:
  2. include("strefa.php");
  3. break;
Powinno być:
  1. switch($_GET['go']) {
  2. case 'strefa':
  3. include("strefa.php");
  4. break;
  5. case 'home':
  6. include("home.php");
  7. break;
  8. case 'zalogowany':
  9. include("zalogowany.php");
  10. break;
  11. case 'logout':
  12. include("logout.php");
  13. break;
  14. ...
  15. }
No i gdzie jest sam proces logowania? No i jeszcze w pliku strefa.php sprawdzenie zmiennych $_POST['konto'] i $_POST['password'] oraz samo logowanie powinno się odbyć jeszcze zanim wyślesz do przeglądarki formularz, czyli przed:
  1. <form action="index.php?go=strefa" method="post">
Oczywiście jeżeli użytkownik nie został jeszcze zalogowany. Podałeś za mało kodu i trudno się domyślić, co jest nie tak.
cent4
Problem leży na pewno po stronie pliku zalogowany.php, gdy "//if (isset($_SESSION['user_id']) and isset($_SESSION['login']))" jest wyłączone - wszystko działa prawidłowo, tylko nie pisze, jaki user jest zalogowany (Witaj xxx). Natomiast jak to włączę - muszę logować się 2 razy:

  1. <?php
  2. ?>
  3.  
  4. ............
  5.  
  6. <?php
  7.  
  8.  
  9. //if (isset($_SESSION['user_id']) and isset($_SESSION['login']))
  10.  
  11. {
  12.  
  13. echo "<CENTER><img src=\"images/otwarte.png\" width=\"90\" height=\"90\" border=\"0\"></CENTER>";
  14.  
  15. echo "Witaj: ";
  16.  
  17. echo $_SESSION['login'];
  18.  
  19. echo "<br />";
  20.  
  21. echo "Jestes zalogowany w strefie użytkownika. ";
  22.  
  23. echo "<br /><br />";
  24.  
  25. <TABLE>
  26. <TR>
  27. <TD width=\"80px\">
  28. <img src=\"images/pdf-logo.png\" width=\"40\" height=\"40\" border=\"0\">
  29. </TD>
  30. <TD>
  31. <a href='plik.php?nazwa=test.pdf'>pobierz test</a>
  32.  
  33. </TD>
  34. </TR>
  35. <TR>
  36. <TD width=\"80px\">
  37. <img src=\"images/pdf-logo.png\" width=\"40\" height=\"40\" border=\"0\">
  38. </TD>
  39. <TD>
  40. <a href='plik.php?nazwa=test2.pdf'>pobierz test2</a>
  41. </TD>
  42. </TR>
  43. </TABLE>
  44. "
  45. ;
  46.  
  47.  
  48. echo "<br /><br />";
  49.  
  50. echo "<a href=\"index.php?go=logout\">Wyloguj się</a>";
  51.  
  52. }
  53.  
  54. //else
  55.  
  56. //{
  57.  
  58. //echo "Nie jestes zalogowany";
  59.  
  60.  
  61.  
  62. //}
  63. ?>
mortus
Czy mi się wydaje, czy Ty w każdym pliku rozpoczynasz sesję (session_start())? Nie możesz tak robić, sesję powinieneś rozpocząć tylko raz, najlepiej w pliku index.php.
cent4
Dalej problem ten sam...

Jak wyłączę:

  1. // if (isset($_SESSION['user_id']) and isset($_SESSION['login']))


wszystko jest ok...

Co może być problemem?
bobo168
Wyświetl sobie te sesje ($_SESSION['user_id'],$_SESSION['login'])) , zobacz czy coś w nich w ogóle jest.
cent4
Nie ma nic w tych sesjach za pierwszym razem jak się loguję...

Jak drugi raz się loguję to już mam dane w tych sesjach.

O co może chodzić?
mortus
Wrzuć tutaj skrypt logowania, bo wygląda na to, że tam tkwi problem.
cent4
Nie wiem czy przypadkiem tutaj nie tkwi problem bo:
1. <form action="index.php?go=strefa" method="post"> - odnosi się do indexu najpierw
2. w skrypcie logowania to samo w linii: header("Location: $domena"."index.php?go=zalogowany");

Na początku jesk kod html - nie ma nic w php w tym pliku oprócz tego co zamieszczam poniżej
sesje php zaczynam na stronie index.php
Oto fragment odpowiedzialny za logowanie:
  1. <?php
  2.  
  3. unset($_SESSION['user_id']);
  4. unset($_SESSION['login']);
  5. echo "sesja user_id: ";
  6. echo $_SESSION['user_id'];
  7. echo "sesja login: ";
  8. echo $_SESSION['login'];
  9.  
  10.  
  11. if (isset($_POST['konto']) and isset($_POST['password']) )
  12. {
  13. require('conn.php');
  14. $konto=mysql_real_escape_string(trim($_POST['konto']));
  15. $password=mysql_real_escape_string(trim($_POST['password']));
  16. if ($konto!="" and $password!="")
  17. {
  18. $password = md5($password);
  19. $zapytanie="SELECT id FROM user WHERE login='$konto' and password ='$password'";
  20. $temp=mysql_query($zapytanie) or die("Wystšpił błšd");
  21. $ile=mysql_num_rows($temp);
  22. $temp=mysql_fetch_array($temp);
  23. $id=$temp['id'];
  24. if ($ile==1)
  25. {
  26. $_SESSION['user_id']=$id;
  27. $_SESSION['login']=$konto;
  28. //echo('Zostales zalogowany. ');
  29. $domena='http://nawr.pl/';
  30. header("Location: $domena"."index.php?go=zalogowany");
  31. }
  32. else echo ('Podales zle dane. Kliknij wstecz aby sprobowac ponownie.');
  33. }
  34. }
  35. else{
  36. ?>
  37.  
  38.  
  39. <form action="index.php?go=strefa" method="post">
  40.  
  41. <table align="center">
  42. <tr>
  43. <td colspan="2" align="center">
  44. <img src="images/zamkniete.png" width="90" height="90" border="0">
  45. </td>
  46. </tr>
  47. <tr>
  48. <td>
  49. <br>
  50. <br>
  51. </td>
  52. </tr>
  53. <tr>
  54. <td>
  55. <img src="images/user.png" width="40" height="40" border="0">
  56. </td>
  57. <td>
  58. <input onclick="this.value=''" name="konto" value="Nazwa konta" type="text" />
  59. </td>
  60. </tr>
  61. <tr>
  62. <td>
  63. <img src="images/klucze.png" width="40" height="40" border="0">
  64. </td>
  65. <td>
  66. <input onclick="this.value=''" name="password" value="Hasło" type="text" />
  67. </td>
  68. </tr>
  69. <tr>
  70. <td>
  71. </td>
  72. <td align="center">
  73. <input type="submit" value="Zaloguj" />
  74. </td>
  75. </tr>
  76. </table>
  77. </form>
  78.  
  79.  
  80. <?php
  81. }
  82. ?>
mortus
Z założenia zmienne $_SESSION['user_id'] oraz $_SESSION['login'] nie powinny istnieć, więc po co ten kod:
  1. unset($_SESSION['user_id']);
  2. unset($_SESSION['login']);
Powinniśmy raczej zrobić coś takiego:
  1. if(isset($_SESSION['user_id'] && $_SESSION['user_id'] != '' && isset($_SESSION['login']) && $_SESSION['login'] != '') {
  2. echo 'Jesteś już zalogowany!';
  3. // opcjonalnie
  4. // header("Location: index.php?go=zalogowany");
  5. }
Poza tym użyłbym raczej operatora && zamiast and, ponieważ oba te operatory działają inaczej.
W funkcji header() wystarczy podać "Location: index.php?go=zalogowany" .
No i pozostaje jeszcze kwestia tego, czy w pliku index.php nie dochodzi gdzieś do modyfikacji zmiennych $_SESSION['user_id'] i $_SESSION['login']. Najlepiej wrzuć tutaj kod całego pliku index.php.
cent4
Mortus wszystko działa pięknie - WIELKIE DZIĘKI guitar.gif

A jak zrobić, żeby w sesji też przekazać imie i nazwisko uzytkownika, tak jak jest to zrobione z "loginem" i "id"?
Oczywiście pola imie i nazwisko mam w tabeli
mortus
Zamiast pobierać z bazy danych samo id pobierasz również imię i nazwisko (linia 19)
  1. $zapytanie = "SELECT id, imie, nazwisko FROM user WHERE login='$konto' AND password='$password'";
i przepisujesz do sesji w bloku
  1. if($ile == 1) {
  2. $_SESSION['id'] = $temp['id'];
  3. $_SESSION['imie'] = $temp['imie'];
  4. $_SESSION['nazwisko'] = $temp['nazwisko'];
  5. // reszta operacji
  6. }
cent4
mortus You Are The Best - dzienks yahoo.gif
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.