Autor Zpráva
tJan-cz
Profil
Dobrý den,

mam utvořenou třídu, která je includovana do logovací stránky, hledám nějaký čistý způsob, abych mohl ajaxem zavolat metodu, která se postará o přihlášení nebo odhlášení.

Poraďte, děkuji..

class Login{
    
    private $login,$password,$MySQL_, $is_login;
    public $err;
    
    public function __construct($login,$password){

        $this->MySQL_ = new mysqli("localhost", "root", "", "fox");
        if ($this->MySQL_->connect_errno) {
            $this->err = "<p>Připojení k databázi selhalo!</p>";
        } else $this->MySQL_->set_charset("utf8");
        
        $this->login = $this->MySQL_->real_escape_string($login);
        $this->password = $this->MySQL_->real_escape_string($password);
        $this->is_login = false;
        
        $result = $this-> MySQL_->query("SELECT * FROM `zakaznici` WHERE `Login_name`='" . $this->MySQL_->real_escape_string($this->login) . "';");
        
        $row = $result->fetch_array(MYSQLI_NUM);
        
        if($this->password == $row[3]){
            $this->is_login = true;
            session_set_cookie_params(60*60*2);
            session_regenerate_id();
            $_SESSION['login'] =  $this->MySQL_->real_escape_string($this->login);
            $_SESSION['id'] = $row[0]; 
        }
    }
    
    public function odhlas(){
        if($this->is_login) echo "neni"; else echo "je";
        # odhlasime se 
        if($this->is_login){
            echo "deleted";
            $this->is_login = false;
            unset($_SESSION['login']); 
            unset($_SESSION['id']);
            session_destroy(); 
        }
    }
    
    };

přihlášení bych provedl například:

$GLOBALS['login'] = new Login("oaskj","71e0401bc6b9489ae7262805f77d910fcb39bb9abff5cabb8e04ab5663ed08e3");

Přes globální proměnné to nelze, nevím jak na to ...
shaggy
Profil
tJan-cz:
hledám nějaký čistý způsob
Tak prečo uvažuješ nad globálnymi premennými?

Nechápem, kde je problém (neštudoval som tvoj kód, je ho zbytočne veľa). Pri prihlásení pošleš cez ajax prihlasovacie údaje, pri odhlásení iba "zrušíš" session prihláseného človeka. Čo ti na tom nefunguje? S čím konkrétne máš problém?
tJan-cz
Profil
shaggy:
Problém vcelu není žádný, ono to funguje a vím jak se to dělá. Globální proměnné mi právě taky přijde jako prasárna. Chtěl jsem mit prostě jednu třidu, která se stará o přihlášení a odhlášení...

nemuselo by to být přihlašování, to je vcelku jedno jde mi o toto:

na strance prihlaseni.php je includnuty skript s třidou Login
pro přihlášení bych zavolal ajaxem jiný script např.: login.php který by obsahoval pouze $login = new Login("jmeno","hash_heslo"); problém je v tom že třida není přístupná. chtěl bych aby byla třída přístupná ze všech scriptů včetně již např $login...
pro odhlášení bych zavolal script logout.php který by měl pouze $login->odhlas();

Nakonec jsem to udělal tak jak si to napsal ty, ale chci jen vědět jak udělat aby některé třidy a proměnné byli přístupné odkudkoliv...
shaggy
Profil
tJan-cz:
na strance prihlaseni.php je includnuty skript s třidou Login
bych zavolal ajaxem jiný script např.: login.php který by obsahoval pouze $login = new Login("jmeno","hash_heslo"); problém je v tom že třida není přístupná.
Tak logicky musíš includnúť triedu (súbor s triedou) aj do login.php. Je v tom problém? Prečo by si to chcel riešiť inak?
tJan-cz
Profil
no ja chtěl mít přístupné proměnné v třídě Login, když ho includnu aj do login a i logout, tak tam ty proměnné nejsou, chapeš ...
shaggy
Profil
tJan-cz:
Ale tie "premenné" predsa predáš ajaxu pri zavolaní.
Proste zavoláš súbor login.php a jemu napr. cez post pošleš používateľské meno a heslo. Tak sa to robí a tak je to správne. A hlavne - ak to má slúžiť na prihlásenie, je logické, že to tak máš predávať, žiaden skript predtým ešte nemá prístup k tým hodnotám (odosielaš ich až na login.php). A pri odhlásení ich nepotrebuješ.
tJan-cz
Profil
Toto je jasné ale je škoda že tady nelze využit krasu oop jako v c++ nebo jave ,... prostě naprd ....
shaggy
Profil
tJan-cz:
Nerozumiem, ako by si chcel využiť krásu OOP v tomto prípade. Predstav si to ako dve samostatné aplikácie prihlaseni.php a login.php - jedna o druhej nevie, preto je logické, že musíš druhému skriptu musíš predať potrebné premenné.
tJan-cz
Profil
Ja chtěl at o sobě vědí, misto if(isset($_SESSION["login"]))odhlas(); by bylo if($this->is_logined) chapeš
shaggy
Profil
Ja chápem, ale tým že je HTTP bezstavový protokol, nie je možné, aby boli premenné viditeľné - a presne na to slúžia session.
Mimochodom, čo je zlé na použití $_SESSION["login"]? Je to správna cesta.
TomasJ
Profil
tJan-cz:
Ja chtěl at o sobě vědí, misto if(isset($_SESSION["login"]))odhlas(); by bylo if($this->is_logined) chapeš
Potom si ukládej stavy o přihlášení do MySQL a zavoláním funkce $trida->is_logged($uzivatel) bys zjistil jestli je přihlášený.
Problém u toho je, že při znovunačtení stránky, se celá třída vytvoří nově včetně hodnot. Tohle já řeším nějakým komunikačním serverem, kde mám uloženo vše co potřebuji. Dá se to ovšem i přes soubory nebo MySQL.
shaggy
Profil
TomasJ:
bys zjistil jestli je přihlášený.
Nezistil, nevedel by o akého používateľa sa jedná (opäť by musel použiť session).
TomasJ
Profil
shaggy:
Nemusel by mít SESSION. Stačí nějaký identifikátor (např. sha1 z řetězce $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']), který by odeslal a dotázal se jestli je ten uživatel přihlášený. Session není například na trvalé přihlášení správná cesta.
tJan-cz
Profil
Děkuji moc za info, alespoň vím že by to tak nešlo udělat. I když by se jednalo o jinou aplikaci. Řeším ted jiný problém, ...
shaggy
Profil
TomasJ:
Session není například na trvalé přihlášení správná cesta.
Môžem vedieť, kde rieši trvalé prihlásenie? On sa pýta na predávanie premenných.
A tvoje riešenie tiež nie je najšťastnejšie - v prípade, že by na tej stránke boli ľudia z jednej firmy, ktorí súčasne používajú rovnaký prehliadač (nič nezvyklé vo firmách, kde sa o počítač stará jedna osoba), tak odhlásiš obidvoch.
TomasJ
Profil
shaggy:
Uvedl jsem to jako příklad.
Stačí nějaký identifikátor (např. sha1 z řetězce $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'])
tJan-cz
Profil
Nevyměnujte si zde názory ;) Nevíte jak vyřešit session v internet exploreru (všechny verze). Cookies je povoleno, avšak při např.: echo $_SESSION["login"]; skončím s undefined indexem, ... nevím jestli to nemůže dělat pouze na localhostu. Jinak ve veškerých prohlížečích Cookies se SESSION normalne funguje. Je mi to divné, jelikož SESSION je na staně serveru...
TomasJ
Profil
tJan-cz:
Session je dostupná až po dalším načtení stránky. Jinak se koukni zda máš session_start
A SESSIONS jsou uložené u klienta v cookies (standardně pod PHPSESSID).
Someone
Profil
TomasJ:
V obou dvou bodech, které zmiňuješ nemáš pravdu.
1) Session jsou dostupné okamžitě po zápisu
2) V sušence u klienta je uložený pouze klíč sloužící k identifikaci. Samotná data jsou uložena na serveru.
TomasJ
Profil
Someone:
Aha takže to si pletu s cookies? SESSION se chová jinak jak COOKIE ve čtení dat?
Tak to díky za ujasnění.

K tomu druhému bodu: No tak jsem to myslel. Prostě bez toho "SESSID" se k datům nedostane.
Someone
Profil
TomasJ:
No tak jsem to myslel
Chápu, ale říct, že sessions jsou uložená u klienta je dost zavádějící.
shaggy
Profil
TomasJ:
Prostě bez toho "SESSID" se k datům nedostane.
Áno, ale je to rovnaké, ako tá tvoja identifikácia na základe user-agenta + IP adresy. Nejak toho usera identifikovať musíš.

Ale riešite tu už od začiatku zbytočnosti - jeden nezávislý skript nemôže vedieť o premenných inicializovaných v druhom nezávislom skripte. Na to môžete použiť session, cookies, alebo prenášať dáta cez post/get.
tJan-cz
Profil
TomasJ:
session je startnute, navíc mam to nastavené v configu session.auto_start, problém se vyskytuje pouze na ie, a vubec to nechápu Someone ma pravdu, bohužel řešení v nedohlednu

shaggy:
Máš pravdu, ja to udělal nezavisle, jen jsem chtěl znát alternativy pro zpracovavani "jiných klíču" ve tříde, ale to je jedno. Měl jsem založit asi jiné vlákno, proste session funguje na NetScapu, Opeře, ... ale ten po*** IE dělá ve všem obstrukce. Přitom tam jsou cookies povoleny, vubec to nechápu, všechno vypadá dobře ale i po:

$_SESSION["login"] = 'neco';
echo $_SESSION["login"];

v IE skončím s tímto:
Notice: Undefined index: login in C:\xampp\htdocs\www\login.php on line 195 - session se proste neuloži a v sušenkovém manažeru ani památky po PHPSESSID. Mrcha jedna,...
tJan-cz
Profil
Dobrý, tak už jsem to vyřešil, bylo chybně nadefinované php.ini problém byl v řádku session.cookie_domain...

Jinak na můj dotaz jsem si již odpověděl: Lze udělat $_SESSION["id"] = new class_name(); - obecně jupíí
tJan-cz
Profil
if(!isset($_SESSION["basket"])){
    
     $objekt = new Kosik();
     $bytestring = serialize($objekt);
     $_SESSION["basket"] = $bytestring;
     
}else{

    $objekt = unserialize($_SESSION["basket"]);
}

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: