Nefunkcni SESSIONS – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nefunkcni SESSIONS – PHP – Fórum – Programujte.comNefunkcni SESSIONS – PHP – Fórum – Programujte.com

 

Kall_Ell0
Návštěvník
12. 5. 2009   #1
-
0
-

Ahoj všem, potřeboval bych poradit. Mám vytvořené logování. po zadání jména a hesla se heslo ověří se záznamem v DB. Pokud se zhoduje vytvoří se sessions a nastaví uživatele jako přihlášeného. Tím mu zpřístupním několik odkazů. Až sem vse funguje. Když se přihlásím tak se mě ukáže skrytý obsah a proměná $_SESSION['jmeno'] vrací jméno přihlášeného uživatele. Ale když kliknu na jakýkoliv odkaz a dojde ke znovunačtení stránky, sessions je pryč a vrátí mě to zpět na přihlašovací obrazovku. Nevím jak dál dám sem můj kód snad v něm najdete chybu.



public function loginUser(){
$this -> url = $_SERVER[PHP_SELF];
if ((empty($_SESSION['email'])) AND (isset($_POST['email']))) {
/* jestli je odeslany formular s prihlasenim nacte podle zadaneho e-mailu
uzivatele a overi jeho heslo */
$this -> sql ="SELECT * FROM user WHERE email = '".$_POST['email']."'";
$result = parent::sql($this -> sql);
$this -> user = mysql_fetch_array($result);
self::overHesloUser($_POST['heslo']);
}
else self::ukazFormularPrihlaseni();
// pokud neni User prihlaseny a neni odeslany formlar, obrazi formular s prihlasenim
}
public function overPrihlaseni() {
if (isset($_SESSION['email'])) {
return true;
print "<br>Uzivatel ".$_SESSION['jmeno']." ".$_SESSION['primeni']." je prihlasen";
}
return false;
}
private function overHesloUser($heslo){
// overeni hesla Usera
$hesloSha = sha1($heslo);
if ($this->user["heslo"] == $hesloSha) {
$_SESSION = $this ->user;
print "<br> jmeno ".$_SESSION['jmeno'];
Print "Vitej";
}
else {
print "spatny heslo";
self::ukazFormularPrihlaseni();
}
}


a volám to následonvě



$user = new user;
$user -> loginUser();

if ($user -> overPrihlaseni()) {
$user -> ukazFormularOdhlaseni();

skrytá část kódu
}



Nahlásit jako SPAM
IP: 80.87.189.–
KIIV
~ Moderátor
+43
God of flame
12. 5. 2009   #2
-
0
-

a mas tam nekde taky session_start() ?

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
survik1
~ Moderátor
0
Posthunter
12. 5. 2009   #3
-
0
-

Tak postupně.
Viz KIIV, máš tam session_start() ?

Pak řádek 26 - přepisuješ celé pole $_SESSION. Připíše se ti vše potřebné? (vzhledem k celýmu chybějícímu objektu a struktury DB nemám ponětí, jak ti to tam funguje). V případě, že chceš pole jen přidat, máš tu .=

Zkus dát print_r($_SESSION); a sledovat, co to udělá.

Nahlásit jako SPAM
IP: 89.102.156.–
Život je jen hra, která se nedá vyhrát.
Kall_Ell0
Návštěvník
13. 5. 2009   #4
-
0
-

To survik1 :
Ano jasně, SESSION_START(); volám v indexu. Třída USER je docela rozsáhlá, nemůžu ji se vložit celou, vložil jsem jen část která pracuje se SESSIONS. V constructu je jen pripojeni k DB a nastavení proměné $this -> url, nic víc. Ostatní třídy jsou pro registraci a editaci uživatele.

volání session v indexu:



session_start();
if ($_POST["odhlasit"] == true) {
print "<br> Uzivatel ".$_SESSION['jmeno']." ".$_SESSION['primeni']." je odhlasen";
session_destroy();
}

na řádku 26 vkladám pole s informacemi o uživateli do SESSION, jako je jméno, příjmení, mail, atd. To se vloží jen při přihlášení, když se ověřuje heslo. Pak už k tomu nedojde, protože podmínka (řádek 4) je vyhodnocená jako false a k přepisu session nedojde.

Když odešlu formulář s heslem, tak je podmínka vyhodnocená jako pravda (řádek 4 - $_SESSION['email'] nastaven ještě není a POST je nastaven), pokračuje to dál, kde script načte podle zadaného emailu uživatele z DB a porovná zadané heslo s heslem z DB. Když se zhoduje( řádek 25) tak se info o uživateli vloži do SESSIONS.

Po přihlášení následuje ověření:
if ($user -> overPrihlaseni())
voláse třída overPrihlaseni, ktera jen zjistí jestli je nastavena proměná $_SESSION['email'] pokud je, tak je uživatel přihlášený. Po přihlášení se tahle podmínka vyhodnotí jako pravda a vypíše jméno a příjmení přihlášeného uživatele a zobrazí menu. Jak jdu dál v menu a dojde ke znovunačtení, už je SESSION pryč tahle podmínka je false a zobrazi se mě jen přihlašovací formulář.

Nahlásit jako SPAM
IP: 80.87.188.–
Kall_Ell0
Návštěvník
13. 5. 2009   #5
-
0
-

Věřím tomu, že to bude nějaká blbost. Ale už do toho kódu koukám druhej den a nic nevidím. Teď jsem ale zjistil jednu věc. Podmínka na řádku 16 v třídě ověřeníPřihlášení je vyhodnocená jako false i když je proměná $_SESSION['email'] nastavená! Dal jsem před volání té podmínky příkaz print, aby mě ji vypsal a vypíše mě správný mail. Tak teď nevím kde je chyba.

Nahlásit jako SPAM
IP: 80.87.188.–
survik1
~ Moderátor
0
Posthunter
13. 5. 2009   #6
-
0
-

Divný... tak pak zkus funkci empty()

Jo a dodatek. Máš tam return true; (řádek 17) před print, proto nedojde k vypsání toho textu.

Nahlásit jako SPAM
IP: 89.102.156.–
Život je jen hra, která se nedá vyhrát.
Kall_Ell0
Návštěvník
13. 5. 2009   #7
-
0
-

Upřesním.




// ověření uživatele
if ($user -> overPrihlaseni()) {
// i když se volání vrátí false, níže uvedený volání metody zobrazení formuláře se provede a zobrazí se další
// část kódu s nabídkou.
$user -> ukazFormularOdhlaseni();
další část kódu
}


public function overPrihlaseni() {
print "<br> Overeni prihlaseni uzivatele<br>";
// níže uvedený print mě napíše i mail z proměné session
print "<br> email v overeni ".$_SESSION['email'];
// níže uvedená podmínka je vyhodnocená false! protože příkaz print uvedený v if se v prohlížeči
// nezobrazí
if (isset($_SESSION['email'])) {
return true;
print "<br>Uzivatel ".$_SESSION['jmeno']." ".$_SESSION['primeni']." je prihlasen";
}
return false;

Nahlásit jako SPAM
IP: 80.87.188.–
KIIV
~ Moderátor
+43
God of flame
13. 5. 2009   #8
-
0
-

a zmenil si to $_SESSION = $this ->user; ?

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kall_Ell0
Návštěvník
13. 5. 2009   #9
-
0
-

KIIV napsal:
a zmenil si to $_SESSION = $this ->user; ?



Myslíš změnit to na .= ? Já ale nechci do proměné $_SESSION nic dalšího přidávat. chci aby se do ní vložilo jen jednou po přihlášení vše o uživateli a pak s tím pracovat. Nic jiného tahle proměná nebude obsahovat. Nic méně to zkusím. Ono je to v podstatě jedno protože se to k tomu přiřazení dostane jen po odeslání toho přihlašovacího formuláře.

Nahlásit jako SPAM
IP: 80.87.189.–
KIIV
~ Moderátor
+43
God of flame
13. 5. 2009   #10
-
0
-

To Kall_Ell : no ne, ty si timdle cely to pole znicis a premazes jmenem uzivatele... jestli si tam nemel na mysli treba $_SESSION['user'] = $this->user;

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kall_Ell0
Návštěvník
14. 5. 2009   #11
-
0
-

Tak jsem provedl nasledující úpravu té heslo ověřovací třídy.



private function overHesloUser($heslo){
// overeni hesla Usera
$hesloSha = sha1($heslo);
if ($this->user["heslo"] == $hesloSha) {
$_SESSION['jmeno'] = $this ->user['jmeno'];
$_SESSION['primeni'] = $this ->user['primeni'];
$_SESSION['email'] = $this ->user['email'];
$_SESSION['prihlasen'] = 1;
print "<br> email ".$_SESSION['email'];
Print "Vitej";
}


a už to funguje. Takže děkuji KIIV. Ale stejně to nechápu. Předpokládal jsem, že když přiřadím celé pole do session příkazem $_SESSION = $this -> user, tak vrátí $_SESSION['jmeno'] jméno uživatele. Což při prvním načtení funguje ale při přechodu na další stránku už ne. Myslel jsem, že v tom není rozdíl.

Nahlásit jako SPAM
IP: 80.87.188.–
KIIV
~ Moderátor
+43
God of flame
14. 5. 2009   #12
-
0
-

To Kall_Ell : nuz muj napad to nebyl.. zminil to survik1... kazdopadne je dobre vedet, ze priradit pole do session, asi nepujde tak snadno :)

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kall_Ell0
Návštěvník
14. 5. 2009   #13
-
0
-

To KIIV :

jj máš pravdu, všem děkuji za pomoc a nápady.

Nahlásit jako SPAM
IP: 80.87.188.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 80 hostů

Podobná vlákna

Sessions — založil tomj

Priradenie SESSIONS — založil tomi86

Problém zo Sessions — založil jozo0025

Zničení Sessions? — založil Poky

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý