$_SESSION kiíratása, hogyan?

$_SESSION kiíratása, hogyan?
2020-12-31T20:21:35+01:00
2021-01-01T17:52:16+01:00
2022-12-06T16:30:38+01:00
EraVera
Sziasztok, 

van egy nagyon egyszerű beléptető skript, ami egy tömbben tárolja a felhasználónév jelszó párost.
A felhasználó név a user teljes neve.

Ha mindent rendben talál a program akkor belépteti a felhasználót. Ez idáig jól működik.

Most azt a feladatot kaptam, hogy, a belépés után írassam ki a beléptetett felhasználó keresztnevét.

Ez a form és a beléptető szkript:

<?php session_start(); /* Munkamenet indítása */ /* Ürlap ellenörzése */ if(isset($_POST['Submit'])){ /* Beállítjuk a felhasználónév és jelszó tömböt */ $logins = array('Csoró Lali' => '123456','username1' => 'password1','username2' => 'password2'); /* Ellenrizzük a beküldött adatokat, majd váltózóba tesszük */ $Username = isset($_POST['Username']) ? $_POST['Username'] : ''; $Password = isset($_POST['Password']) ? $_POST['Password'] : ''; /* Ellenörizzük, hogy a jelszó és felhasználónév szerepel-e a tömbben */ if (isset($logins[$Username]) && $logins[$Username] == $Password){ /* Sikeres ellenörzés esetén beállítjuk a munkamenet változókat és átrányítunk a védett oldalra. */ $_SESSION['UserData']['Username']=$logins[$Username]; header("location:index.php"); exit; } else { /*Sikertelen belépés, hiba üzenet beállítása */ $msg="<span style='color:red'>Érvénytelen bejelentkezési adatok</span>"; } } ?> <form action="" method="post" name="Login_Form"> <table width="400" border="0" align="center" cellpadding="5" cellspacing="1" class="Table"> <?php if(isset($msg)){?> <tr> <td colspan="2" align="center" valign="top"><?php echo $msg;?></td> </tr> <?php } ?> <tr> <td colspan="2" align="left" valign="top"><h3>Login</h3></td> </tr> <tr> <td align="right" valign="top">Username</td> <td><input name="Username" type="text" class="Input"></td> </tr> <tr> <td align="right">Password</td> <td><input name="Password" type="password" class="Input"></td> </tr> <tr> <td> </td> <td><input name="Submit" type="submit" value="Login" class="Button3"></td> </tr> </table> </form>
Ez pedig az index.php

<?php session_start(); /* Starts the session */ if(!isset($_SESSION['UserData']['Username'])){ header("location:login.php"); exit; } ?> Kiíratás: <?php echo $_SESSION['UserData']['Username']; ?>
Ebben a formában a kiíratásnál megkapom a felhasználó jelszavát.

Ha le cserélem erre: 

Kiíratás: <?php echo $_SESSION['UserData']['Password']; ?>
Akkor viszont nem hogy a nevét kapnám vissza, hanem hiba üzenetet, és akkor még hogyan lesz a teljes nevéből csak keresztnév?

Ez a hiba üzenet: Warning: Undefined array key "Password" in C:\xampp\htdocs\teszt\index.php on

line 8

Értem én, hogy nem definiált tömb kulcs, de akkor hogyan lesz belőle definiált?

Kérem szépen segítsen valaki. Előre is köszönöm.
Mutasd a teljes hozzászólást!
Persze hogy nem, hiszen bele se teszed. Nézd már meg azt a nyamvadt kódot amikor feltöltöd a SESSION tömböt, el sem tárolod. Jelszót pedig ne is tárolj munkamenetben sima szövegként.
Mutasd a teljes hozzászólást!

  • Itt a javított kód, hasonlítsd össze a régivel majd.

    <?php session_start(); /* Munkamenet indítása */ /* Ürlap ellenörzése */ if(isset($_POST['Submit'])){ /* Beállítjuk a felhasználónév és jelszó tömböt */ $logins = array('Csoró Lali' => '123456','username1' => 'password1','username2' => 'password2'); /* Ellenrizzük a beküldött adatokat, majd váltózóba tesszük */ $Username = isset($_POST['Username']) ? $_POST['Username'] : ''; $Password = isset($_POST['Password']) ? $_POST['Password'] : ''; /* Ellenörizzük, hogy a jelszó és felhasználónév szerepel-e a tömbben */ if (isset($logins[$Username]) && $logins[$Username] == $Password){ /* Sikeres ellenörzés esetén beállítjuk a munkamenet változókat és átrányítunk a védett oldalra. */ $_SESSION['UserData']['Password']=$Password; $_SESSION['UserData']['Username']=$logins[$Username]; header("location:index.php"); exit; } else { /*Sikertelen belépés, hiba üzenet beállítása */ $msg="<span style='color:red'>Érvénytelen bejelentkezési adatok</span>"; } } ?> <form action="" method="post" name="Login_Form"> <table width="400" border="0" align="center" cellpadding="5" cellspacing="1" class="Table"> <?php if(isset($msg)){?> <tr> <td colspan="2" align="center" valign="top"><?php echo $msg;?></td> </tr> <?php } ?> <tr> <td colspan="2" align="left" valign="top"><h3>Login</h3></td> </tr> <tr> <td align="right" valign="top">Username</td> <td><input name="Username" type="text" class="Input"></td> </tr> <tr> <td align="right">Password</td> <td><input name="Password" type="password" class="Input"></td> </tr> <tr> <td> </td> <td><input name="Submit" type="submit" value="Login" class="Button3"></td> </tr> </table> </form>
    Mutasd a teljes hozzászólást!
  • Amúgy neked a az explode-ra lesz szükséged azaz:

    $nev = explode(" ", $_SESSION['Userdata']['Username'); echo $nev[1];
    Mutasd a teljes hozzászólást!
  • Igen elvileg ez lenne,

    mert az echo $nev[0]; /* ez adná a verzetéknevet */ és ahogy írtad az $nev[1]; /* ez pedig a keresztnevet */
    De valamiért mégis hiba üzenetet ad ezt: 

    Warning: Undefined array key 1 in C:\xampp\htdocs\teszt\index.php on line 8

    Valamiért az a gyanum, hogy az index oldal meg sem kapja a felhasználó nevet.

    Jól gondolom?
    Mutasd a teljes hozzászólást!
  • var_dump-al írasd ki a $_session['Userdata'] tömböt
    Mutasd a teljes hozzászólást!
  • Igen látom a plusz sort

    A munkamenet beállításnál ez:

    $_SESSION['UserData']['Password']=$Password;
    Mutasd a teljes hozzászólást!
  • Így gondoltad?
    Mert erre ad valamiféle normálisnak tűnő választ.

    var_dump(['UserData']);
    Ez a válasz:

    array(1) { [0]=> string(8) "UserData" }
    Mutasd a teljes hozzászólást!
  • Helyesen ez kéne:
    var_dump($_SESSION[‘Userdata’]);
    Mutasd a teljes hozzászólást!
  • Nagyon boldog Új esztendőt kívánok neked.

    Sajnos ezzel még rosszabb. Ezt dobja:

    Fatal error: Uncaught Error: Undefined constant "‘Userdata’" in C:\xampp\htdocs\teszt\index.php:9 Stack trace: #0 {main} thrown in C:\xampp\htdocs\teszt\index.php on line 9
    Mutasd a teljes hozzászólást!
  • Boldog új évet!

    A kódot aposztróf  nélkül írta az iPhone, helyesen:

    var_dump($_SESSION['Userdata']);
    Mutasd a teljes hozzászólást!
  • Így akkor ez lesz:


    Warning
    : Undefined array key "Userdata" in C:\xampp\htdocs\teszt\index.php on line 9 NULL
    Mutasd a teljes hozzászólást!
  • Szerintem hiányzik a session_start() a fájl elejéről.
    Mutasd a teljes hozzászólást!
  • Nézd,
    erre

    var_dump($_SESSION);
    Ez lesz az eredmény:

    array(1) { ["UserData"]=> array(2) { ["Username"]=> string(6) "123456" ["Password"]=> string(6) "123456" } }
    Mutasd a teljes hozzászólást!
  • Ott van az, ez az egész  fájl.

    <?php session_start(); if(!isset($_SESSION['UserData']['Username'])){ header("location:login.php"); exit; } ?> <?php var_dump($_SESSION['Userdata']); ?>
    Mutasd a teljes hozzászólást!
  • UserData kisbetű/nagybetű!!!
    Mutasd a teljes hozzászólást!
  • Bakker ez már a pezsgő hatása.

    Ok javítva.

    Futás eredménye:

    array(2) { ["Username"]=> string(6) "123456" ["Password"]=> string(6) "123456" }
    Úgy tűnik itt bizony nem szerepel a felhasználó név, a jelszó ott van. Így persze nem is írathatom ki.
    Mutasd a teljes hozzászólást!
  • Case-szenzitív szegény, 'Userdata' és 'UserData' az nem ugyanaz. (Amiként az idézőjelek különféle fajtái (' " `) sem szabadon választhatóak, mind mást jelent.)
    Ettől függetlenül a teljes névből nem lesz keresztnév, ezt maga 'Joe Biden' mondta 'Cseh Mariska dr.'-nek.
    Mutasd a teljes hozzászólást!
  • Persze hogy nem, hiszen bele se teszed. Nézd már meg azt a nyamvadt kódot amikor feltöltöd a SESSION tömböt, el sem tárolod. Jelszót pedig ne is tárolj munkamenetben sima szövegként.
    Mutasd a teljes hozzászólást!
  • Igen erre már rá jöttem. De nem vagyok programozó, PHP-t is csak magamnak hobbiból tanulgatom.

    Ha jól gondolom, ki lehet szedni a teljes névből is a keresztnevet. Mondjuk a szóköztől balra levágom, ami van, és akkor már csak a keresztnév marad. 

    Erre biztos, hogy van a php-ben megoldás.
    Mutasd a teljes hozzászólást!
  • Nézném, ha látnám, de mint korábban is említettem, csak magam szórakoztatására tanulgatom a php nyelvet. Nagyon az elején vagyok. Amint látod ez is csak egy saját gépen teszt környezetben futatott kis kód. 

    Az nyilván való, hogy ilyen megoldást komoly, éles rendszeren nem használnék. Ha egyszer lesz ilyen saját rendszer ahova felhasználom, biztos, hogy emlékezni fogok rá. 

    A jelszó elkódolása majd egy következő projekt lesz, most egyenlőre ezt szeretném megoldani, hogy végre be kerüljön a tömbbe a felhasználó név, és aztán azt majd az index.php-ban ki olvassa, és vágja szét a szóköznél, majd a megmaradt keresztnevet írassa ki.
    Mutasd a teljes hozzászólást!
  • Nem, te nem tanulgatsz. Elvárod hogy más oldja meg helyetted. Már írtam mi a gond: be sem teszed a kívánt adatokat a SESSION tömbbe. Vizsgáld felül hol kerülnek be és milyen adatok ebbe, és módosítsd annak megfelelően hogy a kívánt adatok legyenek benne.

    Sikeres ellenörzés esetén

    Innentől érdekes.
    Mutasd a teljes hozzászólást!
  • Nem szeretnék el menni ebbe az irányba, ha nem haragszol. Te nem tudod, hogy két kérdés között mit csinálok. Ezeken az oldalakon:
    PHP: session_start - Manual
    És itt:
    PHP 5 Tutorial

    Szóval, hogy tanulom-e vagy sem ezt ne itt döntsük el, kérlek.
    Elvárásaim, pedig nincsenek, senkivel szemben.

    A segtséget pedig hálásan köszönöm.
    Szóval erről a részről van szó.

    /* Sikeres ellenörzés esetén beállítjuk a munkamenet változókat és átrányítunk a védett oldalra. */ $_SESSION['UserData']['Password']=$Password; $_SESSION['UserData']['Username']=$logins[$Username]; header("location:index.php"); exit; } else { /*Sikertelen belépés,
    shadow21 segítsége után, ha jól gondolom ezzel be kellene kerüljön SESSION tömbbe.

    $_SESSION['UserData']['Username']=$logins[$Username];
    Mutasd a teljes hozzászólást!
  • Megnézted már mit tartalmaz a $logins, és a $logins[$Username]? Ha megtetted volna, látnád mi a baj. Nem, a mutatott sorok egyike sem teszi el a SESSION tömbbe a felhasználó nevét, csak a jelszavát. Igazából vagy az első sort módosítod a megfelelő értékekre és a másodikat ki is veszed, vagy a teljes talált felhasználói adatok tömböt tárolod. Utóbbi felesleges, előbbi gyorsan megvan. Továbbra se tanulni akarsz, mert az alapokkal sem vagy tisztában, hanem elvárod hogy más kész kódot adjon olyan feladathoz aminek a megoldását tőled kérték (lásd a nyitó hozzászólásod).Tegyél hozzá valamit te is, tanuld meg a változó típusokat, tanulj meg debuggolni. A megoldást leírtam, alkalmazni neked kell.
    Mutasd a teljes hozzászólást!
  • Ok akkor nem akarok tanulni, csak hagyjuk már ezt a részét. 

    Nem mondtam , hogy bármit is tudnék, igen még az alapokat sem tudom, de hamarosan többet is tudni fogok.

    Újfent csak köszönöm a leírást és akár hiszed akár nem meg fogom oldani, úgy, hogy senkitől nem várok és kapok kész kódot.
    Mutasd a teljes hozzászólást!
  • Ha már az előző két példát nem nézted meg, akkor azt mondd meg, 'Ladó Zoltán Lajosné'-nak mi az utóneve?
    Mutasd a teljes hozzászólást!
  • Néztem, de amit ott írtál nem értettem a dr.' sortérés után jött.

    A mostaniból értem, hogy nem jó gondolat a felhasználónévből venni a megjelenítendő adatot.
    Mert az én elgondolásom szerint akkor ebből Zoltán Lajosné lesz.

    Szóval akkor jobb, ha csak kizárólag a keresztnevet kérjük be, és két azonos név között pedig a jelszó tesz különbséget. Ráadásul így nem kell semmit manipulálni a bekért névvel elég kiíratni azt a változót, amibe rakjuk.

    Jól értem?
    Mutasd a teljes hozzászólást!
  • Jó lenne tudni, hogy mi ezzel a cél. Például a prog.hu, ahol most vagyunk, nem kérdez IRL nevet, csak egy felhasználóazonsító nicknevet.
    Mutasd a teljes hozzászólást!
  • Nincs konkrét célom vele. Csak szeretném megoldani, továbra is tanulási céllal.

    Egyébként pedig célként mondhatjuk azt, hogy a beléptetett felhasználót a nevén szólítjuk egy szövegben az index oldalon.

    És igen ilyen esetben valóban elbaltázott az amiről írtál az előzőekben. Mert hogy néz ki az, hogy pl.: 
    Kedves Mariska dr. 
    vagy Tisztelt Zoltán Lajosné
    Szóval elég gáz

    De ugyan úgy a prog.hu megoldás sem jó hisz nicknéven sem igen szólítunk szövegben senkit.

    Itt a prog.hu-n jó mert nem szövegkörnyezetben használja.
    Mutasd a teljes hozzászólást!
  • Akkor valóban azt kell megkérdezni a felhasználótól, hogy hogyan szólítsa őt a program. Ha beírja, hogy "Kis Felség", akkor úgy. De azért érdemes megszűrni a karakterkészletet, hogy ne "<b>Bold</b>" legyen már. (Lásd még ezt: xkcd: Exploits of a Mom )
    Mutasd a teljes hozzászólást!
  • akár hiszed akár nem meg fogom oldani, úgy, hogy senkitől nem várok és kapok kész kódot

    Ez esetben miért nem csinálod azt, amit írtam? Megnézted mi van abban a bizonyos $logins-ban és a $logins[$Username]-ben? Ennyit kellene tenned. Sőt, még azt is leírtam hogy melyik sort kell módosítanod és melyiket kivenni, mivel felesleges. Lépésről lépésre haladj. Csak akkor fog menni ha érted hogy mi mit csinál. A copy-paste módszerből semmi nem válik hasznodra, hidd el.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd