Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: $_SESSION
Forum PHP.pl > Forum > Przedszkole
katomasz
Mam dwie strony. Na pierwszej sprawdzane jest logowanie i ustawiana sesja $name=$_SESSION['user']. Na drugiej sprawdzam if(isset($_SESSION['user'])) to ma wykonywać dalsze instrukcje, jeżeli nie ma wyjść. I zawsze wychodzi. Jeżeli próbuję wyciągnąć zmienną sesji, to tam nic nie ma. Dlaczego??
dr_bonzo
Bo trzeba cos do sesji zapisac:
$_SESSION['user'] = 'nazwa usera';
katomasz
Bo i tak jest. Wcześniej jest błąd. Prawidłowo jest $name='uzytkownik', a następnie $_SESSION['user']=$name. I to właśnie działa, a na następnej stronie już nie.
strife
Cytat(katomasz @ 2005-05-20 20:20:22)
Bo i tak jest. Wcześniej jest błąd. Prawidłowo jest $name='uzytkownik', a następnie $_SESSION['user']=$name. I to właśnie działa, a na następnej stronie już nie.

A masz na samym początku session_start" title="Zobacz w manualu PHP" target="_manual ?
katomasz
Oczywiście. Na początku każdej strony jest session_start();
Pigula
to moze pokaz kod to ktos moze i cos ci podpowie
katomasz
Więc jeszcze raz. Pierwsza strona logowania. Ustawiana jest zmienna $_SESSION, która pobiera dane z nazwy użytkownika. W każdym następnym pliku, który, jak to z reguły bywa, musi być autoryzowany, sprawdzam, czy użytkownik, który próbuje się tam dostać otrzymał SID. Jeżeli tak to dalej jeżeli nie to do strony logowania. I niestety, SID jest tylko na stronie logowania (zamiast przeniesienia do następnej strony sprawdzam, czy na tej stronie jest ustawiona sesja, czy nie - i jest). Ale niestety, na każdej następnej już nie. I pytanie Dlaczego?questionmark.gif
Pigula
sprobuj dowiazac do linka SID i sprawdz. a mi chodzilo o kod bo tak co piszesz to powinno dzialac a nie dziala wiec moze masz blad gdzies w skrypcie.
katomasz
Sprawdzę, ale mam możliwość dopiero w poniedziałek. Kod jest na pewno poprawny, bo gdy moje dzieło nie działało, to przepisałem żywcem przykłady z książek i było to samo. Chodziło mi o to, czy nie trzeba ustawić jakiś zmiennych w plikach konfiguracyjnych Apache'a lub php.
Dzięki, sprawdzę i odpowiem.
nospor
Cytat
Kod jest na pewno poprawny, ... przepisałem żywcem przykłady z książek i było to samo
Wierz mi, w książkach też zdarzają się byki
Pigula
Cytat(katomasz @ 2005-05-21 11:54:23)
Sprawdzę, ale mam możliwość dopiero w poniedziałek. Kod jest na pewno poprawny, bo gdy moje dzieło nie działało, to przepisałem żywcem przykłady z książek i było to samo. Chodziło mi o to, czy nie trzeba ustawić jakiś zmiennych w plikach konfiguracyjnych Apache'a lub php.
Dzięki, sprawdzę i odpowiem.

jezeli sprawdzasz strone na localhost i nic nie kombinowales przy skonfiguracji serwera to on raczej nie jest ot jego wina. a co do kodu to jak nospor mowi w ksiazkach tez sa bledy. pozatym naprawde duzym problemem nie jest zaznaczyc tekst a potem Ctrl+C i Ctrl+V smile.gif
katomasz
Nie jestem dzieckiem i nie jestem "ciemniakiem". Wiem co wpisałem i posta podałem dlatego, że nie orientuję się dlaczego to nie działa, chociaż powinno. Myślę, że jeżeli takie mam słyszeć porady, to lepiej ich nie słyszeć. Proszę o zrozumienie, ale nie posunąłem się w tej sprawie, nie licząć przekazania, aby dowiązać SID do linka, ani kroku. Jedyne co, to mogę się niedługo zgubić o co mi chodziło.
Bonhart
Cytat(katomasz @ 2005-05-21 20:22:50)
Proszę o zrozumienie, ale nie posunąłem się w tej sprawie, nie licząć przekazania, aby dowiązać SID do linka, ani kroku. Jedyne co, to mogę się niedługo zgubić o co mi chodziło.

a moze ustawiasz gdzies session_name, sprawdz jeszcze czy masz wlaczone raportowanie bledow (albo ustaw sobie error_reporting(E_ALL)). Moze wysylasz gdzies jakis bialy znak smile.gif. I nie denerwuj sie tak bo trudno wrozyc z kuli co ktos tam ma w kodzie smile.gif
katomasz
Oto błąd, który się zgłasza po wywołaniu $_SESSION['name'] - Undefined index: name in , i tu nazwa pliku. Podkreślam jeszczed raz, że początek pliku, to session_start(); . Wychodzi na to, że dane sesji nie są przekazywane pomiędzy stronami. Dlaczego?
scanner
Cytat(katomasz @ 2005-05-21 20:22:50)
Nie jestem dzieckiem i nie jestem "ciemniakiem".

Jesteś.
Zgodnie z zaakceptowanym przez Ciebie Regulaminem Forum (pkt IV.2.d) Twoim obowiązkiem jest podać błędnie działający kod.
Nikt z nas nie jest jasnowidzem.

Kolejny Twój post bez zacytowania odpowiednich fragmentów kodu spowoduje zamknięcie wątku.
katomasz
Ależ proszę, chociaż wszystko jest w poprzednich postach, ale "kawę na ławę" panie Scanner.
Plik logowanie.html

<FORM METHOD=POST ACTION="Loguj.php">
<CENTER> <BR><B>PROSZ PODAĆ DANE DO LOGOWANIA</B><BR><BR><BR>
<INPUT TYPE=text NAME=LOGIN SIZE=20><BR><FONT SIZE="-1"><B>LOGIN</FONT></B><BR><BR><BR>
<INPUT TYPE=PASSWORD NAME=PASS SIZE=21><BR><FONT SIZE="-1"><B>HASŁO</B><BR><BR><BR>
<INPUT TYPE=submit VALUE=Loguj>
</CENTER>
</FORM>

Plik loguj.php

<?php
session_start();
$name=$_POST['LOGIN'];
$pass=$_POST['PASS'];
if ($name=="") $name="zzzz";
$nazwa=$name."\t".$pass."\t";
$file=fread(fopen("users.dat", "rb"),999);
if (!$file)
{
echo 'brak pliku';
}
if (strstr($file, $nazwa))
{
if ($name=="Administrat")
$name=$name."super";
$_SESSION['user']=$name;
header ("Location: main.php");
}
else
{
print "<B><CENTER>Logowanie nie powiodło się</CENTER></B><BR><BR><BR>";
print "<A HREF=logowanie.html>POWRÓT</A>";
}
?>

plik main.php

<?php
session_start();
error_reporting(E_ALL)
if (isset($_SESSION['user']))
header ("Location : logowanie.html");
print "udało się";
echo '<CENTER>Zalogowany' .$_SESSION['user']. '</CENTER>';
?>

i właśnie w pliku main.php zgłaszany jest błąd - Undefined index: name in , i tu nazwa pliku. Czy jest to wystarczająco jasno?
Poza tym "postarajmy się" nie oznacza trzeba. Chyba ktoś tu nie rozumie niektórych słów. A szkoda.
nospor
Używaj bbcode!!!

patrze na ten main.php i patrze i jakos nie widze zebys gdzies uzywal indexu name. A taki ponoc blad ci wywala...
katomasz
Sorki, ale to pozostało po próbach. Powinno być - Undefined index: user in , i tu nazwa pliku.
nospor
a nie powinno wywalac czegoś takiego skoro najpierw sprawdzasz czy jest ustawione to user. Bo masz przecież if'a : if (isset($_SESSION['user']))

edit: zapomniales o klamrach dla tego warunku i tylko jedną linię on obejmuje
katomasz
Jeszcze raz ten kod, który teraz jeest już całkiem w porządku

plik main.php

<?php
session_start();
error_reporting(E_ALL)
if (!isset($_SESSION['user']))
header ("Location : logowanie.html");
print "udało się";
echo '<CENTER>Zalogowany' .$_SESSION['user']. '</CENTER>';
?>

czyli, jeżeli zmienna sesji nie ustawiona wróć do logowanie.html, jeżeli ustawiona, wypisz echo. Sytuacja ma się w ten sposób, że dla kody zmienna sesji nie istnieje, bo czy jest if (isset; czy też if (!isset; to to działa tak samo.
nospor
Po raz drugi: używaj bbcode.

POzatym co ztergo ze ty robosz !isset skoro resztę i tak wywalasz poza warunkiem. powinno raczej byc tak:
  1. <?php
  2. if (!isset($_SESSION['user']))
  3. header (&#092;"Location : logowanie.html\");
  4. else
  5. {
  6.  print &#092;"udało się\";
  7.  echo '<CENTER>Zalogowany' .$_SESSION['user']. '</CENTER>';
  8. }
  9. ?>
katomasz
Niewiele to zmienia, bo dla mnie ważny jest jeden warunek. Proste, jeżeli coś nie jest spełnione to wykonaj (w tym przypadku wyjdź do innego pliku) Więc nie ma szans, aby przeszedł dalej w tym kodzie. Jeżeli warunek spełniony, to tak jakby nie był sprawdzany. Poza tym jeżeli zrobiłem tak jak mówisz (else i w klamry) to nie wywala żadnego błędu. Po prostu nie spełnia to żadnego warunku.
nospor
Cytat
Poza tym jeżeli zrobiłem tak jak mówisz (else i w klamry) to nie wywala żadnego błędu. Po prostu nie spełnia to żadnego warunku.
A wlasnie ze spelnia: a konkretnie !isset i wkoncu masz ok main.php bo się nie wykrzacza.
katomasz
Nie spełnia, ponieważ nie wykonuje kodu po if, ani nie wykonuje kodu po else. Po prostu omija te linie i idzie dalej
nospor
jeżeli masz if i else do if'a do któryś z tych kawalkow będzie zawsze wykonany. Daj se echo przed header (tylko w klamry weź) i zobaczysz ze wchodzi do tego if'a
katomasz
Zgadza się. Dlaczego więc po pierwsze, jeżeli już to nie wykonuje instrukcji header, a po drugie dlaczego stwierdza, że sesja nie istnieje?
nospor
daj exit; po header

A do main.php przekierowuje cie automatycznie po zalogowaniu?
katomasz
Jeżeli nazwa użytkownika i hasło zgadzają się to tak. Wpisanie exit; nie rajcuje, ponieważ potrzebuję powrotu do strony logowanie.html, a nie zatrzymania kodu.
nospor
no i tak bedzie bedzie. Wysle naglowek poprzez header, a exit spowoduje, zeby w tym pliku nic wiecej sie wykonalo co moze nabruździć. jak nie wierzysz to se manuala przeczytaj
katomasz
No dobrze. Więc jak zrobić, żeby w przypadku nieistnienia sesji następowało przekierowanie. A tak w ogóle, to dlaczego ta sesja nie jest przekazywana?
nospor
chyba napisalem. daj exit;
  1. <?php
  2. if (!isset($_SESSION['user']))
  3. {
  4. header (&#092;"Location : logowanie.html\");
  5. exit;//to powinno pomóc :)
  6. }
  7. else
  8. {
  9.  print &#092;"udało się\";
  10.  echo '<CENTER>Zalogowany' .$_SESSION['user']. '</CENTER>';
  11. }
  12. ?>


a czemu nie przekazywana? a session ID (SID) przekazujesz?
katomasz
Niestety, exit; nie pomaga. Nie następuje przekierowanie, lecz zatrzymanie w tym punkcie na tej stronie. Sesja jest przekazywana, ale tutaj już jest zgubiona. Nie wiem dlaczego.
nospor
co do header to masz blad. dwuktopek dales za daleko. powinno byc:
header ("Location: logowanie.html");
katomasz
To prawda. Dzięki, jeden błąd wykryty. Teraz pozostał problem z przekazaniem SID do następnej strony. Co zrobić?
nospor
ale w jaki sposób ty ten sid przekazujesz? przez url? nie zauewazylem abys gdzies mial cos takiego ...?SID=...
katomasz
Proszę więc o radę jak to przekazać, żeby działało. Jak wpisałem tak jak pytałeś, to SID nie zgadzał się z aktualnym na nowej stronie. Podaj fragment kodu, jak to przekazać.
nospor
a masz w php.ini taki wpis: session.use_cookies = 1. Jak nie to ustaw i miej wlaczone ciastka (tylko serwer zrestartuj po zmianach). POwinnno dzialac. testowalem teraz u siebie i dziala
katomasz
Wszystko jest tak jak piszes, jedynie nie działa. Dlaczego?
nospor
No dobra. A spróbuj tak:
plik loguj.php:
  1. <?php
  2.  
  3. session_name('sid');
  4. $name=$_POST['LOGIN'];
  5. $pass=$_POST['PASS'];
  6. if ($name==&#092;"\") $name=\"zzzz\";
  7. $nazwa=$name.&#092;"t\".$pass.\"t\";
  8. $file=fread(fopen(&#092;"users.dat\", \"rb\"),999);
  9. if (!$file)
  10. {
  11. echo 'brak pliku';
  12. }
  13. if (strstr($file, $nazwa))
  14. {
  15. if ($name==&#092;"Administrat\")
  16. $name=$name.&#092;"super\";
  17. $_SESSION['user']=$name;
  18. header ('Location: main.php?sid='.session_id());
  19. }
  20. else
  21. {
  22. print &#092;"<B><CENTER>Logowanie nie powiodło się</CENTER></B><BR><BR><BR>\";
  23. print &#092;"<A HREF=logowanie.html>POWRÓT</A>\";
  24. }
  25.  
  26. ?>


plik main.php:
  1. <?php
  2.  
  3. session_name('sid');
  4. if (!isset($_SESSION['user']))
  5. {
  6. header (&#092;"Location: logowanie.html\");
  7. exit;//to powinno pomóc :)
  8. }
  9. else
  10. {
  11.  print &#092;"udało się\";
  12.  echo '<CENTER>Zalogowany' .$_SESSION['user']. '</CENTER>';
  13. }
  14.  
  15. ?>


Wklej do obu plików dokladnie jak napisalem. Wejdź na strone logowania i się zaloguj. Jak to nie pomoże to wymiekam sad.gif
katomasz
Wielkie dzięki. To działa.
nospor
ufff, nareszczie biggrin.gif
tylko pamiętaj, aby teraz do każdego linku dodawać to sid
katomasz
Jeszcze raz wielkie dzięki
Gość_Gibcio
  1. <?
  2. if(isset($_SESSION['user']))
  3. {
  4. echo'<font size=\"2\" face=\"Arial\">';
  5. echo'<table border=\"0\" width=\"100%\">';
  6. echo'<tr>';
  7. echo'<td width=\"100%\">';
  8. echo'Administracja.';
  9. echo'</td>';
  10. echo'</tr>';
  11. echo'</table>';
  12. echo'<br>';
  13. echo'<table border=\"0\" width=\"100%\">';
  14. echo'<tr>';
  15. echo'<td width=\"20%\">';
  16.  
  17. echo'</td>';
  18. echo'<td width=\"80%\">';
  19.  
  20. echo'</td>';
  21. echo'</tr>';
  22. echo'</table>';
  23. echo'</font>';
  24. }
  25. else
  26. {
  27. header(&#092;"Location:admin/logowanie/blad.php\");
  28. }
  29. ?>

Jak uruchomie strone to wywala mi następujacy błąd:

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\usr\apache\httpd\html\admin\index.php:2) in c:\usr\apache\httpd\html\admin\index.php on line 3

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\usr\apache\httpd\html\admin\index.php:2) in c:\usr\apache\httpd\html\admin\index.php on line 3
Administracja.

jest jakieś lekarstow na to czy trzeba coś zmienić w ustawieniach sesji?
czachor
Wystarczy, że poszukasz na forum pod hasłem headers already sent.
Gość_Reinmar
Usuń enter przed <?, bo przed session_start() nie mogą być żadne znaki wysłane do przeglądarki. Powinno działać. Jak coś to pod: http://forum.php.pl/index.php?showtopic=31653 jest to troche lepiej przedyskutowane.
gregi1
Mam pytanie, otoz mam plik z funkcjami i chcialbym aby po kliknieciu w przycisk zaloguj przenioslo mnie automatycznie na strone dobre.php.
  1. <?php
  2. ........
  3. ........//obsluga innych rzeczy + formularz do logowania + formularz do rejestracji
  4. $_SESSION['user']=$user;
  5.  header ('Location: dobre.php');
  6.  exit;
  7. ?>


A kod ktory podalem po kliknieciu w zaloguj wyswietla mi pusta strone.

Plik dobre.php wyglada tak:

  1. <?php
  2. require_once ("funkcje.php");
  3. //kod PHP
  4. if (isset($_SESSION['user']))
  5. {
  6. echo "Może posłużyć jako menu, czy coś innego ;)";
  7. echo "<br><A HREF='wyloguj.php'>Wyloguj</a>";
  8. }
  9. else
  10. {
  11. echo "<H3 ALIGN=center>Nie masz uprawnień do korzystania z tej strony! Wróc i się zaloguj</h3>";
  12. ?>


Dodam ze jak w tym pliku z funkcjami dam zamiast header np
Kod
echo "bla bla bla"
echo "<a href='dobre.php'> MOJ LINK</a>"

to po kliknieciu w "zaloguj" przenosi mnie na strone z tym bla bla bla i linkiem do strony dobre.php, ale chcialbym aby tam sie przenosic od razu po zalogowaniu. Moze mi ktos podpowiedziec jak to zrobic?
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.