Autor | Zpráva | ||
---|---|---|---|
fili Profil |
#1 · Zasláno: 11. 8. 2013, 10:49:16
Mám prihlásenie so SESSION
$login = $_POST['login']; $password = sha1($_POST['password']); $result = mysql_query("SELECT `password` FROM owners WHERE login='".mysql_real_escape_string($login)."'"); $row = mysql_fetch_row($result); if($password == $row[0]) { $_SESSION['prihlaseny'] = 'ano'; echo "<div><a href=\"logout.php\">Odhlásiť</a><p> </p> <<a href=\"aktualizacia-uctu.php\">Aktualizácia účtu</a> <a href=\"aktualizacia-regudajov.php\">Aktualizácia registračných údajov</a></div>"; } else { echo "Uviedli ste nesprávne meno alebo heslo!"; } ?> mám <? session_start(); ?> <?php if($_SESSION['prihlaseny'] != 'ano') die("Nepovolený vstup! Najprv sa prihláste."); ?> Kde je chyba? Robím také niečo 1x |
||
Duchaplny Profil |
#2 · Zasláno: 11. 8. 2013, 11:04:44
fili:
Zdravím, <?session_start();?> by malo byť na každej stránke, najlepšie, keď to dáte priamo do hlavičky, ktorá sa stále opakuje.. chyba bude asi v tomto:
$_SESSION['prihlaseny'] = 'ano'; jedno "=" znamená, že sa hodnota vpravo, presunie vľavo, čiže x=5 by na ďalšom riadku bolo x==5 true.. čo mi príde, že váša premenná $_SESSION['prihlaseny'] sa zmení (nech už bola čímkoľvek) na "ano". Skúste si ju vypísať na konci tej podmienky "if($password == $row[0]) ", a ak mám pravdu, použite 2x "=" $_SESSION['prihlaseny']=='ano' .
ten druhý script skúste napísať takto: <?php if($_SESSION['prihlaseny'] <> 'ano') die("Nepovolený vstup! Najprv sa prihláste."); ?> |
||
Joker Profil |
#3 · Zasláno: 11. 8. 2013, 11:06:40
fili:
Patří to úplně na začátek. Jestli se to chová divně, přes var_dump($_SESSION); se dá zjistit, co vlastně v session je uložené.
Jinak poznámka, u hodnot typu ano/ne se lépe pracuje s datovým typem boolean, než s řetězci. A kontrolu přihlášení může databáze udělat rovnou, stačí do WHERE za login=jméno ještě přidat AND password=heslo. A pak jen zkontrolovat, jestli to něco vrátilo. |
||
fili Profil |
#4 · Zasláno: 11. 8. 2013, 15:21:57
Duchaplny:
Do hlavičky? session_start();
Ja to mám ešte pred <html>, tak som to vyčítal na nete. Alebo to má byť predsa v <head>? použite 2x "=" $_SESSION['prihlaseny']=='ano' ,
to som si zmenil aj mne sa to zdá lepšie - ale nemám žiadne skúsenosti - nič sa tým ale nezmenilo <?php if($_SESSION['prihlaseny'] <> 'ano') die("Nepovolený vstup! Najprv sa prihláste."); ?> Joker Pridal som si aj password do podmienky, aj keď login by mal byť unikátny inak ho nedovolí zaregistrovať. var_dump($_SESSION); pri tej druhej nič |
||
Micruss Profil |
zkus tam dát $_SESSION = array();
asi takto if($password == $row[0]) { $_SESSION = array(); $_SESSION['prihlaseny'] = 'ano'; jinak já to dělám tak že když kontroluji přihlášení tak zapínám session a pak mažu starý data a nahrazuji novýma ;-) |
||
fili Profil |
#6 · Zasláno: 11. 8. 2013, 17:40:27
Micruss:
var_dump($_SESSION); vyhodilo array(0) { } |
||
Micruss Profil |
#7 · Zasláno: 11. 8. 2013, 18:13:10
fili:
tak jedině ještě zkusit místo $_session=array(); dát session_start(); jinaknwm |
||
Davex Profil |
fili:
• Odesílá se sušenka se session ID? • Je session_id() při každém spuštění skriptu stejné?
• Nedojde během inicializace session k chybě? • Není vypnuté vypisování chyb? • Není v PHP vypnuté short_open_tag ?
|
||
nemeja Profil |
#9 · Zasláno: 11. 8. 2013, 20:28:31
Co používáš za interpret? Máš načetlý modul session-module(WAMP ho má standartně vypnutý)?
|
||
fili Profil |
#10 · Zasláno: 11. 8. 2013, 20:50:33 · Upravil/a: fili
Micruss:
aj tak mi vyhadzuje array(0) { } Davex, nemeja Nemám šajnu, ako to všetko zistím? Davex: Dal som do kódu ini_set('display_errors', 'On'); error_reporting(E_ALL); Notice: Undefined index: prihlaseny in /..., nie je mi celkom jasne ako to mám definovať |
||
nemeja Profil |
zkus
<?php echo phpinfo(8); Vyjede ti: session Session Support enabled |
||
Davex Profil |
fili:
Na začátek skriptu si dáš ladící výpis. Co vypíše po prvním a druhém spuštění? <?php ini_set("display_errors", "On"); error_reporting(E_ALL); if (session_start()) { echo "<p>session inicializovano"; } else { echo "<p>chyba pri spusteni session<br>"; print_r(error_get_last()); } echo "<p>session_id(): " . session_id(); echo "<p>short_open_tag: " . ini_get("short_open_tag"); echo "<p>ted: " . date("r"); if (!empty($_SESSION['session'])) { echo "<p>hodnota: $_SESSION[session]"; } $_SESSION['session'] = date("r"); nemeja: Kdyby bylo session vypnuté, tak by neexistovalo pole $_SESSION . Kdyby nebyla přítomna podpora session, tak by neexistovala funce session_start() , která je pro funkčnost session klíčová.
|
||
fili Profil |
#13 · Zasláno: 12. 8. 2013, 15:40:10
nemeja:
Áno hodilo mi to Session Support enabled session.auto_start je Off session.bug_compat_42 je Off Davex: To mi vyhodilo Notice: A session had already been started - ignoring session_start() in... on line 70 a session inicializovano session_id(): mkh.... short_open_tag: 1 ted: Mon, 12 Aug 2013 15:30:33 +0200 array(1) { ["session"]=> string(31) "Mon, 12 Aug 2013 15:30:33 +0200" } Notice: Undefined index: prihlaseny in ..... on line 101 Som z toho vedľa |
||
nemeja Profil |
Session fungujou, jseš si opravdu jistý, že se kód provede a Session je definovaná? Dej si nad definování
$_SESSION["prihlaseny"] nějaký ladící výpis, například echo "Definuju session"; .
|
||
fili Profil |
#15 · Zasláno: 12. 8. 2013, 17:28:49
nemeja:
To mi vyhodilo takto: Notice: Undefined index: prihlaseny in ... on line 101 Definuju session Taký mal byť výsledok? Robím to 1x, tak.... |
||
Davex Profil |
A co při druhém spuštění?
Zůstává stejné? session_id(): mkh.... Vypíše se hodnota? hodnota: Mon, 12 Aug 2013 15:30:33 +0200 |
||
fili Profil |
#17 · Zasláno: 12. 8. 2013, 20:45:37
Davex:
Druhé spustenie znamená druhé prihlásenie po predchádzajúcom odhlásení? session_id(): ... tam je to rozdielne
Pokiaľ ide o hodnoty, tak ich vypíše, ale samozrejme iný čas a stále vypisuje Notice: Undefined index: prihlaseny in ... |
||
Actimel Profil |
#18 · Zasláno: 12. 8. 2013, 21:15:57
fili:
Někde je něco špatně, když nezůstane ta session nadefinovaná nebo tam máš nějákou tvoji chybu (na tuhle možnost sázím víc). Kdyžtak sem postni kód obou dvou stránek (předpokládám, že na první stránce nadefinuješ a na druhé vypisuješ) , ať víme jak se o to snažíš. |
||
Davex Profil |
fili:
„Druhé spustenie znamená druhé prihlásenie po predchádzajúcom odhlásení?“ Ne, do adresního řádku prohlížeče zadáš adresu skriptu, kde je ten ladící výpis a stiskneš klávesu F5. > session_id(): ... tam je to rozdielne > Pokiaľ ide o hodnoty, tak ich vypíše, ale samozrejme iný čas To není možné. Pokud je session_id pokaždé jiné, tak se nemůže vypisovat hodnota: Mon, 12 Aug 2013 15:30:33 +0200 a musí se vypisovat pouze datum ted: Mon, 12 Aug 2013 15:30:33 +0200 .
Jednoznačně to znamená, že z prohlížeče nepřichází cookie PHPSESSID s identifikátorem session. Nemáš v prohlížeči vypnuté cookies nebo neposílá se přihlášený uživatel na jinou doménu než je přihlašovací formulář?
|
||
fili Profil |
#20 · Zasláno: 12. 8. 2013, 21:58:59 · Upravil/a: fili
Davex:
"ted:" tam bolo Druhé spustenie je rovnaké session_id(): frf...
session inicializovano session_id(): frf... short_open_tag: 1 ted: Mon, 12 Aug 2013 21:56:14 +0200 hodnota: Mon, 12 Aug 2013 21:55:40 +0200 Actimel Prvy je len formular na prihlasenie <h2>Prihlásenie</h2> <div class="login_form"><br /> <form action="prihlasenie.php" method="post"> Meno: <input type="text" name="login" /><br /> Heslo: <input type="password" name="password" /><br /> <input type="submit" value="Prihlásiť" /> </form> </div> „$login = $_POST['login']; $password = sha1($_POST['password']); $result = mysql_query("SELECT `password` FROM owners WHERE login='".mysql_real_escape_string($login)."'"); $row = mysql_fetch_row($result); if($password == $row[0]) { $_SESSION['prihlaseny'] == 'ano'; echo "<div><a href=\"logout.php\">Odhlásiť</a><p> </p> <<a href=\"aktualizacia-uctu.php\">Aktualizácia účtu</a> <a href=\"aktualizacia-regudajov.php\">Aktualizácia registračných údajov</a></div>"; } else { echo "Uviedli ste nesprávne meno alebo heslo!"; } ?>“ |
||
Actimel Profil |
#21 · Zasláno: 12. 8. 2013, 22:17:28
fili:
„ $_SESSION['prihlaseny'] == 'ano'; “
tohle je špatně žejo... máš tam o rovnítko navíc $_SESSION['prihlaseny'] = 'ano'; |
||
fili Profil |
#22 · Zasláno: 12. 8. 2013, 22:53:01
Davex:
Pokiaľ ide o cookies, tak mi <?php echo phpinfo(8); ?> vyhodilo:
session.cookie_domain no value no value session.cookie_httponly Off Off session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 1000 1000 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.hash_bits_per_character 5 5 session.hash_function 0 0 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path /domains/.... no value session.serialize_handler php php session.use_cookies On On session.use_only_cookies On On session.use_trans_sid 0 0 |
||
fili Profil |
#23 · Zasláno: 13. 8. 2013, 08:49:59
Actimel:
To bolo na radu niekoho z tohoto fóra. S jedným = mi vyhadzuje viz. nižššie. Je to správne? Robím také niečo 1x. Toto "session_id(): frfs...." má byť pri jednom užívateľovi rovnaké pri každom prihlásení? Alebo pri rovnakom užívateľovi pri ďalších prihláseniach iné? Notice: A session had already been started - ignoring session_start() in .... on line 78 session inicializovano session_id(): frfs.... short_open_tag: 1 ted: Tue, 13 Aug 2013 08:42:53 +0200 hodnota: Tue, 13 Aug 2013 08:42:30 +0200 |
||
Actimel Profil |
#24 · Zasláno: 13. 8. 2013, 11:33:49
fili:
„Notice: A session had already been started - ignoring session_start() in .... on line 78“ hezky ti to tady píše, máš někde session_start() , kde už by být neměl - zkus ho smazat.
Jinak SESSID se vygeneruje nový jen pokud ho uživatel jěště/už nemá (ještě nebyl na dané stránce/cookie se SESSID expirovala) nebo pokud ho sám někde regeneruješ session_regenerate_id() .
|
||
fili Profil |
#25 · Zasláno: 13. 8. 2013, 22:00:50
Actimel
Vďaka, odstránil som ho a používam tento kód od Davexa, mám ho umiestnený ešte pred <html>, vďaka Davex a aj ostatným za help > <?php > ini_set("display_errors", "On"); > error_reporting(E_ALL); > > if (session_start()) { > echo "<p>session inicializovano"; > } else { > echo "<p>chyba pri spusteni session<br>"; > print_r(error_get_last()); > } > echo "<p>session_id(): " . session_id(); > > echo "<p>short_open_tag: " . ini_get("short_open_tag"); > > echo "<p>ted: " . date("r"); > if (!empty($_SESSION['session'])) { > echo "<p>hodnota: $_SESSION[session]"; > } > $_SESSION['session'] = date("r"); Teraz mi po prihlásení vypisuje aj login prihláseného užívateľa, takže by to malo byť OK? Je to takto v poriadku? if($password == $row[0]) { $_SESSION['prihlaseny'] = 'ano'; echo "Prihlásený užívateľ: ".mysql_real_escape_string($login).""; |
||
Kubo2 Profil |
#26 · Zasláno: 13. 8. 2013, 23:24:04
fili:
Ten kód máš z článku na blogu Michala Tomanóczyho? Pamätám si ho, pretože presne to isté som skúšal, keď som začínal. Na začiatku stránky s týmto kódom <?php if($_SESSION['prihlaseny'] != 'ano') die("Nepovolený vstup! Najprv sa prihláste."); ?> session_start() ?
Pretože ak tam máš iba tento kód, tak je zrejmé, že to nefunguje, totiž preto, lebo si nezapol sessions, a tým pádom neexistuje ani pole $_SESSIONS, ktoré by si mohol testovať. Ale to len tak mimochodom, preletel som to len letmo a z posledného príspevku som usúdil, že vlákno je zväčša už vyriešené. > if($password == $row[0]) > { > $_SESSION['prihlaseny'] = 'ano'; Myslím, že už ťa tu upozornili, že nie je vhodné používať ano/nie ako náhradu logických hodnôt true/false. if ($password === $row[0]) $_SESSION['prihlaseny'] = true; <?php session_start(); if (!isset($_SESSION['prihlaseny']) || !$_SESSION['prihlaseny']) die("Najprv sa prihláste, a potom to skúste znovu."); |
||
Davex Profil |
fili:
„odstránil som ho a používam tento kód od Davexa“ Ten kód tam celý nemusíš mít a stačí samotné <?php ini_set("display_errors", "On"); error_reporting(E_ALL); session_start(); Ten zbytek sloužil pouze k ověření, že session funguje, a to fungovalo. Podstatné je mít session_start() na úplném začátku všech skriptů, kde se pracuje se $_SESSION .
Zapnuté zobrazování chybových hlášek je dobré při hledání chyb. Při ostrém provozu se vypíná a nahrazuje se logováním chyb do souboru. |
||
fili Profil |
#28 · Zasláno: 14. 8. 2013, 09:27:18
Kubo2:
Áno, našiel som ho na webe, pretože sa učím a potrebujem vedieť ako má také niečo vyzerať a ako to funguje, mne sa najlepšie učí praxou. Ako som písal, tak som session_start(); mal na začiatku,
ale mal som s tým problémy na ďalšej stránke, kde mi stále vyhadzovalo "Nepovolený vstup! Najprv sa prihláste." if ($password === $row[0]) $_SESSION['prihlaseny'] = true; Davex Vďaka, som rád, že mi to funguje. Takéto vypisovanie loginu je ok? echo "Prihlásený užívateľ: ".mysql_real_escape_string($login).""; |
||
Actimel Profil |
fili:
> Takéto vypisovanie loginu je ok? > echo "Prihlásený užívateľ: ".mysql_real_escape_string($login)."";
mysql_real_escape_string() se používá na escape proměnných ve SQL dotazech. Na escapnutí znaku při výpisu na stránku používěj - když teda escapuješ - htmlspecialchars()
|
||
Časová prodleva: 10 dní
|
|||
Kubo2 Profil |
#30 · Zasláno: 24. 8. 2013, 20:10:14
fili:
„3x =?“ Porovnávaš typ aj hodnotu. (Počul/Čítal si o typovaní premenných?) Tými troma rovnítkami porovnávam v podstate typ (boolean) aj hodnotu (true). PHP má štyri základné typy - string, int, float (alebo double?) a boolean. Typovanie premenných |
||
Téma pokračuje na další straně.
|
0