Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Zmienne sesyjne
Forum PHP.pl > Forum > Przedszkole
polak89
Witam. Napisalem prosty system uwierzytelniania. W pierwszej fazie po zalogowaniu strona do ktorej przesylane sa zmienne z formularza ustawia odpowiedznie zmienne sesyjne. Jeśli wartość zmiennej $_SESSION['logged'] = 1 uzytkownik sie zalogowal:

  1. <?php
  2. $_SESSION['username'] = $_POST['user'];
  3. $_SESSION['userpass'] = $_POST['pass'];
  4. $_SESSION['logged'] = 0;
  5.  
  6. // sprawdza informacje o uzytkowniku
  7.  
  8. if (($_SESSION['username'] == 'login') and
  9. ($_SESSION['userpass'] == 'haslo')) {
  10.  $_SESSION['logged'] = 1;
  11.  }
  12. ?>

Jeśli uzytkownik jest zalogowany na tej stronie zostaja wyswietlone linki edycji i usuwania wiadomosci. Aby usunac lub edytowac rekord z bazy danych uzytkownik musi byc zalogowany:
  1. <?php
  2. case 'delete':
  3.  
  4.  
  5.  if ($_SESSION['logged'] != 1) {
  6.  
  7.  echo 'Nie jestes zalogowany';
  8.  
  9.  exit();
  10.  } else {
  11.  
  12.  $sql = &#092;"DELETE FROM newsletter \" .
  13. &#092;"WHERE news_id=\" . $_GET['id'];
  14.  
  15.  mysql_query($sql, $conn)
  16.  or die ('Nie mogę skasowac artykułu: ' . mysql_error());
  17.  }
  18.  
  19. if( $_SESSION['logged'] == 1) {
  20.  
  21.  redirect('newsletter/wiesci.php');
  22.  }
  23.  break;
  24. ?>

Za pomoca funkcji redirect(); skrypt przekierowuje uzytkownika na strone wynikowa. Niestety w tym przypadku ustawia zmienna $_SESSION['logged'] = 0. Czy ktoś wie jak rozwiazac ten problem?
dadexix
to co napisałes to jest jeden czy 2 skrypty bo nie wiem..?

po zatym
Kod
$_SESSION['logged] = 1;
nie rozumiem problemu troche źle opisane ale może to to... albo dajesz $_SESSION[] albo $_SESSION['']...

edi:
już wiem w czym jest problem - sesje przypisuje na dany katalog a Twój skrypt do którego przekierowywuje jest w innym katalogu... zaraz coś pomyślimy:P
polak89
To sa 2 skrypty. Chodzi o to ze po przekierowaniu za po moca funkcji redirect() zmienna $_SESSION['logged'] zostaje ustawiona na wartosc 0 a nie na 1.
no_face
Mi sie zas wydaje, ze w pliku wiesci.php nie umiesciles na poczatku skryptu zapisu session_start(), sprawdz.
polak89
Cytat
Mi sie zas wydaje, ze w pliku wiesci.php nie umiesciles na poczatku skryptu zapisu session_start(), sprawdz.


session_start() zostala ustawiona w kazdym z plikow
dadexix
może byś dał plik wiesc.php?
polak89
plik wiesci.php

  1. <?php
  2.  
  3. require_once 'conn.php';
  4.  
  5.  
  6.  
  7. $sql = "SELECT * FROM newsletter ORDER BY date DESC";
  8.  
  9. $results = mysql_query($sql, $conn)
  10.  or die (' Nie mogę pobrac newsa: ' . mysql_error());
  11.  
  12. $_SESSION['username'] = $_POST['user'];
  13. $_SESSION['userpass'] = $_POST['pass'];
  14. $_SESSION['sprawdz'] = 0;
  15.  
  16. // sprawdza informacje o uzytkowniku
  17.  
  18. if (($_SESSION['username'] == 'zdrajca-band') and
  19. ($_SESSION['userpass'] == 'zdrajca')) {
  20.  $_SESSION['sprawdz'] = 1;
  21.  }
  22.  
  23.  
  24.  
  25. ?>
  26.  
  27. <!DOCTYPE html
  28. PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  29. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  30.  
  31. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  32.  
  33. <head>
  34.  
  35. <title>ZDRAJCA</title>
  36.  
  37. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  38.  
  39. <link rel="Stylesheet" type="text/css" href="style.css" />
  40.  
  41.  
  42. </head>
  43.  
  44. <body style="background: rgb(0, 0, 0) url(introx/i9.jpg) no-repeat fixed 50%;">
  45.  
  46. <h1>NEWS</h1>
  47.  
  48.  
  49. <?php
  50.  
  51. $arrLocale = array( "pl_PL", "polish_pol" );
  52. setlocale( LC_ALL, $arrLocale );
  53.  
  54.  
  55. if (mysql_num_rows($results)) {
  56.  
  57. echo '<center><a href="compose.php">dodaj</a><a href="transactscript.php?action=wyloguj">wyloguj</a></center>';
  58.  
  59.  
  60. while ($row = mysql_fetch_array($results)) {
  61. echo "<span class=\"date\">" .
  62.  date('j', strtotime($row['date'])) . strftime(' %B %Y', strtotime($row['date'])) .
  63.  "</span>\n";
  64. echo "<p class=\"body\">\n" .
  65.  ucfirst(nl2br($row['body'])) .
  66.  "\n</p>\n";
  67.  
  68. if (isset($_SESSION['sprawdz']) and $_SESSION['sprawdz'] == 1) {
  69.  
  70. echo "<p class=\"action\">\n" .
  71. "<a href=\"compose.php?a=edit&id=" . $row['news_id'] . "\">edytuj</a>\n".
  72. "|\n" .
  73. "<a href=\"transactscript.php?action=delete&id=" . $row['news_id'] . "\">usuń</a>\n</p>\n";
  74.  }
  75.  
  76. }
  77. }
  78. else {
  79. echo "<span style=\"font-family: 'Courier New'; font-style: italic;\">Brak newsów. Aby dodać nowy kliknij <a href=\"compose.php\">tutaj</a>.</span>";
  80. }
  81.  
  82.  
  83. ?>
  84.  
  85. </body>
  86. </html>
dadexix
powiedz mi coś
Cytat
Chodzi o to ze po przekierowaniu za po moca funkcji redirect() zmienna $_SESSION['logged'] zostaje ustawiona na wartosc 0 a nie na 1.

sprawdzałeś w ogóle? bo w tym skrypcie nigdzie nie używasz ten zmiennej sesyjnej..?
polak89
Cytat
nie rozumiem problemu troche źle opisane


Ludzie!!! Czy wy naprawde nie rozumiecie istoty tego problemu?? Loguje sie poprzez plik login.php... stroną wynikową jest stron wiesci.php ktora otrzymuje zmienne formularza i przypisuje im zmienne sesyjne.
plik wiesci.php:
  1. <?php
  2. $_SESSION['username'] = $_POST['user'];
  3. $_SESSION['userpass'] = $_POST['pass'];
  4. $_SESSION['logged'] = 0;
  5.  
  6. // sprawdza informacje o uzytkowniku
  7.  
  8. if (($_SESSION['username'] == 'login') and
  9. ($_SESSION['userpass'] == 'haslo')) {
  10.  $_SESSION['logged'] = 1;
  11.  }
  12. ?>

a nastepnie sprawdza zawartosc zmiennej $_SESSION['sprawdz']. Jesli zmienna ma wartosc 1 uzytkownik jest zalogowany. Nastepnie strona wiesci.php wyswietla linki edycji i usuwania wiadomosci jesli uzytkownik jest zalogowany:
  1. <?php if (isset($_SESSION['sprawdz']) and $_SESSION['sprawdz'] == 1) {
  2.  
  3. echo "<p class=\"action\">\n" .
  4. "<a href=\"compose.php?a=edit&id=" . $row['news_id'] . "\">edytuj</a>\n".
  5. "|\n" .
  6. "<a href=\"transactscript.php?action=delete&id=" . $row['news_id'] . "\">usuń</a>\n</p>\n";
  7.  }
  8. ?>

Klikajac lacze "usuń" przekazujemy do skryptu transactscript.php zmienna action=delete jesli chcemy usunac wiadomosc. Plik transactscript nie wyswietla zadnej tresci jedynie przekierowuje uzytkownika na strone wynikowa wiesci.php jesli ten jest zalogowany czyli $_SESSION['sprawdz'] = 1.
plik transactcript.php:
  1. <?php
  2. case 'delete':
  3.  
  4.  
  5.  if ($_SESSION['sprawdz'] != 1) {
  6.  
  7.  echo 'Nie jestes zalogowany';
  8.  
  9.  exit();
  10.  } else {
  11.  
  12.  $_SESSION['sprawdz'] = 1;
  13.  
  14.  $sql = "DELETE FROM newsletter " .
  15. "WHERE news_id=" . $_GET['id'];
  16.  
  17.  mysql_query($sql, $conn)
  18.  or die ('Nie mogę skasowac artykułu: ' . mysql_error());
  19.  }
  20.  
  21. if( $_SESSION['sprawdz'] == 1) {
  22.  
  23.  redirect('newsletter/wiesci.php');
  24.  }
  25.  break;
  26.  
  27. ?>

Problem pojawia sie w momencie przekierowania na strone wiesci.php ktora powinna zawierac zmienna sesyjna $_SESSION['sprawdz']=1 aby moc ponownie wyswietlic łącza "usuń" i "edytuj". ŁĄcza natomiat NIE SĄ wyświetlane a zmienna sesyjna$_SESSION['sprawdz'] zwraca wartosc 0... kazdy plik w swojej gornej czesci zawiera funkcje session_start wiec nie wmawiajcie mi ze jej nie ma snitch.gif wiec moje pytanie jest nastepujace: dlaczego plik wiesci.php "gubi" zmienne sesyjne?a moze problem tkwi w pliku transactscript? prosciej nie potrafie...

hey...ludzie! zyjecie? jest tos mi w stanie pomoc?
no_face
Dlatego, ze po przeladowaniu nie masz juz zmiennych POST, przez co:
  1. <?php
  2. $_SESSION['username'] = $_POST['user'];
  3. $_SESSION['userpass'] = $_POST['pass'];
  4. $_SESSION['sprawdz'] = 0;
  5. ?>

zmienne sesyjne maja false, dalej
  1. <?php
  2. if (($_SESSION['username'] == 'zdrajca-band') and
  3. ($_SESSION['userpass'] == 'zdrajca')) {
  4.  $_SESSION['sprawdz'] = 1;
  5.  }
  6. ?>

nie przypisuje zmiennej sprawdz 1
polak89
Cytat
Dlatego, ze po przeladowaniu nie masz juz zmiennych POST

wiec jak moge poprawic powyzszy kod?
no_face
Nie przerabiajac struktury Twojego skryptu zamien:

  1. <?php
  2. $_SESSION['username'] = $_POST['user'];
  3. $_SESSION['userpass'] = $_POST['pass'];
  4. ?>

na
  1. <?php
  2. if (isset($_POST['user']) && isset($_POST['pass']))
  3. {
  4.  $_SESSION['username'] = $_POST['user'];
  5.  $_SESSION['userpass'] = $_POST['pass'];
  6. }
  7. ?>
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.