Autor Zpráva
Kwoky
Profil *
Dobrý den,
Mám poměrně otravný problém se session. Na webu zadám do formuláře jméno, heslo a kliknu na přihlásit. Skript, který ověřuje jméno a heslo v databázi vypíše "Přihlášení bylo provedeno úspěšně" a opravdu to tak vypadá. Sotva ale kliknu na jakoukoliv stránku, přihlášení se "vypaří". Pokud se však přihlásím, na stránce s "Přihlášení bylo provedeno úspěšně" stisknu F5 a zkusím kliknout, na 90% vše funguje správně. Někdy musím obnovovat i vícekrát. Netušíte, co je to za zradu? Jakmile se "už opravdu přihlásím", tak vše jede naprosto bezchybně.

Našel jsem tu v diskuzi pár podobných příspěvků, ale řešení jsem nenašel.

Děkuji za pomoc.
king26
Profil
Na každý stránce, kde chceš se SESSION pracovat (mimo include souborů) musíš mít na začátku stránky session_start();
Sirius
Profil
Kwoky:
Napiš sem kód té přihlašovací stránky.

king26:
Jestli mu ostatní stránky po několika reloadech té přihlašovací fungují, tak nebude problém v session_start(), ale v přihlašovací stránce. Kdyby tam neměl session_start(), tak mu to nejede vůbec.
Medvídek
Profil
Kwoky:
A přesměrováváš po přihlášení ?
Kwoky
Profil *
Toto je kód, který mi zpracovává přihlášení (trochu jsem ho upravil, aby byl přehlednější):

<?
session_start();
header("Cache-control: private");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  //meta znacky
	<link rel="shortcut icon" href="images/favicon.ico" />
	<style type="text/css" media="all">
    @import "style.css";
</style>
	<title>SuperBenzin.cz - Tankujeme spolu</title>
</head>
<?
include ("nastaveni.php"); 
include ("connect.php"); //pripojeni k mysql serveru

echo '
<body class="bgctmava">
<div class="div_main">
<div class="obsah2 bgcsvetla fonter1">';

session_register("sessislogged");
session_register("sessisadmin");
session_register("sessjmeno");
session_register("sessheslo");

$_SESSION["sessislogged"]=0;
$_SESSION["sessisadmin"]=0;
$_SESSION["sessjmeno"]=$_POST["sessjmeno"];
$_SESSION["sessheslo"]=(sha1($_POST["sessheslo"])); //zadane uzivatelem
$tempjmeno=$_SESSION["sessjmeno"];

$dotaz = mysql_query("
SELECT *
FROM uzivatel
WHERE uzivatel_jmeno = '$tempjmeno'
LIMIT 1
") or die(mysql_error());

while ($row = mysql_fetch_array($dotaz))
{
$uzivatel_heslo = ($row["uzivatel_heslo"]); //vytazene z DB
if ($_SESSION["sessheslo"]==$uzivatel_heslo) 
{
// Seznam promennych ukladanych do session
$_SESSION["sessisadmin"]=($row["uzivatel_isadmin"]);
$_SESSION["sessemail"]=($row["uzivatel_email"]);
$_SESSION["sessuid"]=($row["uzivatel_id"]);
}
}

if ($_SESSION["sessheslo"]==$uzivatel_heslo) 
{
$_SESSION["sessislogged"]=1;
echo 'Přihlášení bylo provedeno úspěšně!';
}
else { 
echo 'Špatné jméno nebo heslo.';
}  
?>
Kwoky
Profil *
Ne, nepřesměrovávám.
Kwoky
Profil *
Vím, že je ten kód trochu delší a nechce se Vám ho luštit, ale prosím o pomoc. Je to trochu trapné, když musím uživatelům vysvětlovat, že neumím pořádně udělat přihlášení.
Alphard
Profil
Kwoky:
Nevidím žádný odkaz vedoucí ze stránky. Takže: přihlásím se, zobrazí se mi hláška "Přihlášení bylo provedeno úspěšně!" a co dál? Tlačítko Zpět?
Kwoky
Profil *
Ten přihlašovací kód výše je OK?
Odkaz ze stránky mám v menu, které je v samostatném includu na konci výše napsaného kódu. Například:
<a class="tlacitko" href="http://www.superbenzin.cz" title="Hlavní stránka SuperBenzin.cz">Hlavní stránka</a>
Alphard
Profil
Kwoky:
Ten přihlašovací kód výše je OK?
Ideální to rozhodně není, session_register() se už nepoužívá (jestli teda nejedete na nějaké staré verzi), pro ukládání hashe hesla do session nevidím důvod, pro kontrolu hesla v cyklu také není důvod. Při vhodné konstelaci hvězd by to ale snad fungovat mohlo. Jak ověřujete přihlášení na jiných stránkách?
Té hlavičce cache private nerozumím, to ať hodnotí někdo jiný.
Kwoky
Profil *
Ověřuji pomocí
if ($_SESSION["sessislogged"]==1)

Ve staré verzi nejedu, ale návod, podle kterého jsem to dělal v ní asi jel :) Zkusím to nahradit. Předpokládám ale, že to asi nebude ten hlavní problém (i když možné je všechno).
Ta cache hlavička je pozůstatek z doby, kdy jsem myslel, že by s tímto nefunkčním přihlášením mohla mít něco společného cache. Ale nezabralo to.
Alphard
Profil
Kwoky:
Těžko v tom hledat chybu. Problémy typu někdy to jde a někdy ne se s nedostatečným popisem co oboum stavům předcházelo hledají špatně. Musel byste se asi dohodnout s někým, kdo to vyzkouší, podívá se do zdrojáků apod.
Já vás maximálně odkáži na FAQ, kdybyste to chtěl zkusit kompletně předělat.
Kwoky
Profil *
Dobře, děkuji za snahu.
Pokud se Vám bude chtít, zkuste se na mém webu přihlásit a uvidíte, co to dělá/nedělá - jméno: demo, heslo: demo
http://www.superbenzin.cz/
Mastodont
Profil
Všechny session_register vyhodit a zkusil bych session_write_close před koncem skriptu, třeba se jen relace blbě ukládá..
Kwoky
Profil *
Všechny session_register jsem vyhodil.
Session_write_close jsem umístil. Stále stejné.
Asi to zkusím celé ještě jednou předělat, ale kdyby ještě někoho něco napadlo, budu jenom rád.
Mastodont
Profil
Tak si dělej ladicí výstupy $_SESSION případně dalších proměnných pomocí var_dump, var_export apod. a sleduj hodnoty
Kwoky
Profil *
Tak jsem do toho zkusil trochu vrtat a zjistil jsem toto. Smazal jsem všechny sessiony z adresáře na serveru a zkusil pustit web

v Opeře 10: Vytvoří se prázdná, 0 B velká session (v hlavičce je session_start, takže ok). Pokud reloaduju (F5) zůstává jediná session. Přihlásím se a zůstane ta samá session, jen naplněná daty (taky ok). Odhlásím se (session_destroy) a session má opět 0 B jako na začátku. Nové přihlášení naplní opět tu samou session daty. Po zavření prohlížeče se vytváří nová session s novým ID, ale opět jede vše správně.

ve Firefoxu 3.5.3 a IE6: Vytvoří se prázdná, 0 B velká session. Pokud reloaduju (F5), pokaždé se vytvoří další a další prázdná session. Přihlásím se, tím se vytvoří další session a naplní se daty. Při reloadu nebo kliku kamkoliv na stránce se session ID s přihlášením nějak "zapomene" a vytváří se další úplně nová prázdná session.

Jak je toto možné?! Je to něco s cookies?
Kwoky
Profil *
VYŘEŠENO!!! (pravděpodobně)
Stačilo nahradit všechna <? za <?php a už to jede v Opeře, IE i Firefoxu. Teď doufám praxe ukáže, že je to opravdu spravené. Děkuji všem za rady a za pomoc, vážím si toho. Ale že to teda byla prasárna :)
Kwoky
Profil *
Tak jsem se asi ukvapil. Sice už to šlo, ale stačilo zavřít IE a FF a chyba (neustálé zakládání nové session) byla zpět. Zkouším tedy teď předělat skript z FAQ a uvidím, co dělám špatně.
Trululum
Profil *
musis si tam pridat if(post je odoslany) tak vykonaj funkciu

session_register("sessislogged");
session_register("sessisadmin");
session_register("sessjmeno");
session_register("sessheslo");

$_SESSION["sessislogged"]=0;
$_SESSION["sessisadmin"]=0;
$_SESSION["sessjmeno"]=$_POST["sessjmeno"];
$_SESSION["sessheslo"]=(sha1($_POST["sessheslo"])); //zadane uzivatelem
$tempjmeno=$_SESSION["sessjmeno"];


lebo vlastne pri každom načítaní stránky ti vykonava priradovanie udajov do session
Trululum
Profil *
a pozri sa ci nemas niekde pouzite session_destroy() a ci na kazdej stranke mas na zaciatku ktora nieje pripojena pomocou include....... session_start()
Kwoky
Profil *
Trochu jsem se v tom zase hrabal a teď mi to funguje zcela správně v Opeře a IE6, ale ve Firefoxu to pořád blbne. Každopádně už tuším, kudy se vydat a během týdne si na to snad udělám čas. Děkuji za tipy.
Majkl578
Profil
session_register

No FUJ! Že se nestydíte, používat deprecated funkce, které jsou zapovězené už od příchodu PHP5.
Pro správnou funkčnost Sessions je stačí vždy aktivovat pomocí funkce session_start.
Použití je stejné jako u jiných ((super)globálních) polí [proměnných]:
$_SESSION['prvek'] = 'foo'; //registrace, popř. změna hodnoty
echo $_SESSION['prvek']; //použití
unset($_SESSION['prvek']); //zrušení

Pracuje se s nimi jako s normálními poli. Jen s tím rozdílem, že se "přenáší" mezi scripty. Pokud neumíš pracovat s poli, začni tam.e

Být tebou, zamyslel bych se nad tím, zda mám dostatečné znalosti na tvorbu víceuživatelského prostředí. Taky by sis měl zopakovat syntaxi (zkus prosím něco aktuálnějšího než návody pro PHP4). Nezapomeň něco o ošetřování už. vstupu a neexistujících proměnných.

PS: Takhle ošklivý kód jsem už nějakou chvíli neviděl... A doufám, že neuvidím...
Kwoky
Profil *
Kritiku beru. Ty session_register tam byly úplně zbytečně a už je tam nemám (viz příspěvek č.15).
Jen si nejsem jistý, jestli jsme se úplně pochopili. Mě to všechno funguje, jen Firefox to přihlášení "nechápe". Vytváří si pořád nové sessiony. Ošetření vstupu vyřeším až to poběží jak má. Chci mít teď ten kód co nejjednodušší.
Majkl578
Profil
[#24] Kwoky
Nevím, jestli generované hlášky Notice zjednoduší kód, ale pokud ano, tak na úkor výstupu. :)
Zkus udělat jednoduchý script na otestování firefoxu. Jednodoché zapnutí session a test jedné hodnoty:
<?php
session_start();
if (isset($_SESSION['test'])) var_dump($_SESSION['test']);
$_SESSION['test'] = rand(100,999);
Milan69
Profil *
Kwoky:
Na webu zadám do formuláře jméno, heslo a kliknu na přihlásit. Skript, který ověřuje jméno a heslo v databázi vypíše "Přihlášení bylo provedeno úspěšně" a opravdu to tak vypadá. Sotva ale kliknu na jakoukoliv stránku, přihlášení se "vypaří".

S podobným problémem jsem se setkal. Vyřešilo se to tím, že session_start(); jsem dal jako úplně první výstup (musí být opravdu první, před ním nesmí být nic). Ideální je dát to jako první přikaz.
Záludné je to ještě v tom, že někdy to funguje i když není session_start(); jako první (záleží na serveru/providerovi).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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