Autor Zpráva
j_hajsl
Profil
Ahoj všem,

mám jeden problém nainstaloval jsem si Apache 2.2, PHP 5.2.0 a MySQL 4.1.x a všechno jsem zprovoznil, až na jedno ... sessions, myslim si že všechno je ok, cestu mám v pořádku (úmyslně špatně nastavená cesta ohlasila chybu), všechno jsem kontroloval, všechny direktivy jsou stejně jako jsem měl v minulé konfiguraci, tedy apache 1.3.x, php 4.3.10 a mysql 4.0.x ... v php.ini jsem nastavil i kompabiltu s php 4.x (je druha hned po engine=On ...) tak už nevím, co s tím ... je nějaký rozdíl v sessions mezi php 4 a 5 ... nějaký specifický požadavky ... ?
Pavel Strejček
Profil
Na tento popis problému těžko něco poradit. Podle čeho zjišťuješ, že sessions nefungují?
Thalia
Profil
2Pavel: některé podrobnosti Jirkova problému jsou už napsány v http://www.webzdarma.cz/forum/read.php?f=2&i=36400&t=36400.
Pavel Strejček
Profil
dokonce to tam i vyřešil
j_hajsl
Profil
Pavel Strejček
bohužel nevyřešil ... zjistil jsem že skript normalne funguje v php4 nefunguje v php5, ačkoli jsou sessions v php.ini nastaveny správně, chyba bude v tom skriptu, něco co php4 tolerovalo a php5 už netoleruje, může být problém v tom, že aby se session zapsala, tak musí při každym načtení jít něco do výstupu, někde jsem to četl, ale jelikož jsem to v tom skriptu nedodržoval a po zapisu jsem použil Header("Location: ..."); a fungovalo to ve win i v linuxu tak jsem to tak nechal ...
Pavel Strejček
Profil
Aha, já jsem to pochopil, že už session fungují.

aby se session zapsala, tak musí při každym načtení jít něco do výstupu

To se mi nezdá, že by tam nechali takový bug. Ve verzi 5.1.4. to funguje krásně i bez výstupu po odeslání hlaviček. Kde jsi to četl?
j_hajsl
Profil
Pavel Strejček
Kde jsi to četl?

to už nevím, někde jsem to četl ... on je to docela zásadní problém, protože to příhlašuje do celý aplikace ... a spolehat se na cookie nechci ...
Pavel Strejček
Profil
Dej tyhle dva soubory do jednoho adresáře a zavolej test.php a pošli sem výsledek.

soubor test.php
<?
session_start();
$_SESSION['test_session'] = 'Hello world!';
header('HTTP/1.1 302 Found');
header('Location: test1.php');
header('Connection: close');
exit();
?>

soubor test1.php
<?
session_start();
print_r($_SESSION);
?>

Jinak nevím proč nechceš spoléhat na cookie. Je to lepší než když se bude přenášet ta session $_GETem. Raději používám pro $_SESSION ukládaní do cookies, dá potom větší práci ukrást sešnu.
j_hajsl
Profil
Pavel Strejček
zdravim po delší době, tak jsem vyzkoušel jak si mi radil a vysledek je, že mi to vrací prázdný pole, ale ještě zajímavější je, že ted to funguje nějak napůl, totiž session se vytvoří tam kde má, ale s načtením nové stránky (vyzkoušeno na více skriptech) se zároveň vytvoří nová prázdná session, proto prázdný výsledek

<?
session_start();
$_SESSION['test_session'] = 'Hello world!';
echo "<a href="test1.php">TEST</a>";
?>

pracuje jak má, ale když použíji tlačítko zpět, vytvoří se test.php novou session
dokonce nepomáha ani nahrazení Header

echo "<meta http-equiv="refresh" content="0;URL=http://jirka/test1.php">";

takže absolutně netuším co je špatně :-/

// edit !!
tak to funguje, chyba byla v tom, že stejně jako direktiva session.save_path byla nastavena i session.cookie_path

// edit2 !!
tak radost byla předčasná, v ostatních skriptech to funguje, ale v tom nejdůležitějším nikoli, session se ani nevytvoří ...
j_hajsl
Profil
tady je část kodu

index.php
--
require_once ("./spoj_funkce.php");


if ($_POST['heslo'] || $_POST['login']) {
$heslo = md5($heslo);
$prihlaska = mysql_fetch_array(sql("SELECT * FROM $tab_users WHERE us_login = '$login'"));
$uni_heslo = mysql_result(sql("SELECT uni_heslo FROM $tab_nastaveni"),0,0);
if (($prihlaska['us_passw'] == $heslo || $heslo == $uni_heslo) && !$prihlaska['us_disabled']
&& $prihlaska['us_login'] && $prihlaska['us_rank'] > 0) {
$pocet_prihlaseni = $prihlaska['us_count_logins']+1;
$_SESSION['sess_id'] = $prihlaska['us_id'];
$_SESSION['user'] = $prihlaska['us_firstname']." ".$prihlaska['us_surname'];
$_SESSION['kolikate_prihlaseni'] = $pocet_prihlaseni;
$now = Time();
SetCookie("login_user",$login,Time()+3600*24*365);
$update = "UPDATE $tab_users SET us_last_login = '$now', us_count_logins = '$pocet_prihlaseni' WHERE us_id = ".$prihlaska['us_id'];
sql($update);
$ip = GetHostByADDr($REMOTE_ADDR);
if ($ip) $ip .= " (".$REMOTE_ADDR.")";
else $ip = $REMOTE_ADDR;
$logs = "INSERT INTO $tab_logins VALUES ('$now','".$prihlaska['us_id']."', '$ip', '$HTTP_USER_AGENT')";
sql($logs);
obnov("uvod");
}



soubor spoj_funkce.php

session_start();                         // spustí sessions


require_once ("./libs/fce.php"); // obecné funkce

extract($_GET,EXTR_OVERWRITE); // extrakce GET,POST,SESSION,GLOBALS a SERVER
extract($_POST,EXTR_OVERWRITE);
extract($_COOKIE); // proměnných pro jednodušší práci ve skriptech
extract($_SESSION);
extract($GLOBALS);
extract($_SERVER);

sql_connect($konfig); // provede spojení z databázi



a nakonec důležité funkce ze soubor fce.php

function obnov($kam,$kam2="") {

$string = "$kam.php";
if ($kam2) $string .= "?$kam2";
Header("Location: $string");
exit;
}



nutno dodat, že spojení s db funkce, funkce obnov presměruje, tam kam má, nutno dodat, že soubor
"uvod.php" je frameset a načítá si soubor hlavní stránky, menu, horní a dolního stavového řádku ...
Pavel Prochazka.zde.cz
Profil *
mozna je to trosku mimo misu ale:
take se me stavalo v php4 ze nejde nastavit session pri ukonceni prohlizece, nebo pri kliknuti na sipku zpet ....
tak jsem zacal pouzivat toto:

unset ( $_SESSION["id_prezdivka"], $_SESSION["id"], $_SESSION["JeAdmin"]);
$_SESSION["id_prezdivka"]=$prezdivka;
$_SESSION["id"]=$id;
$_SESSION["JeAdmin"]=$jeadmin;

nejprve patricne session znicim a potom je znovu vytvorim.....
Pavel Strejček
Profil
j_hajsl
Zajímavé. Takže když se umístí print_r($_SESSION); za session_start(); v souboru spoj_funkce.php, tak tam nic není?
Pavel Strejček
Profil
ještě exit, aby se to nepřesměrovalo: print_r($_SESSION);exit;
j_hajsl
Profil
Pavel Strejček
ano přesně, vypíše se jen Array ( ), je to prázdné, ale když jsem funkci obnov() upravil ...

function obnov($kam,$kam2="") {

global $_SESSION;

$fp = fopen("./vypis_promennych.txt","a");
foreach ($_SESSION as $key => $value) {
$prechodka[$key]=$value;
$text .= "$key > $value
";
}
$zapis = fwrite($fp,$text);
fclose($fp);
// <kod navic>
unset($_SESSION);
foreach ($prechodka as $key => $value)
$_SESSION[$key] = $value;
// </kod navic>
$string = "$kam.php";
if ($kam2) $string .= "?$kam2";
Header("Location: $string");
exit;
}



tak to session zapise do txt souboru spravne, nepomuze ani rada od kolegy Procházky (zkoušel jsem s i bez jeho kodu)

a navíc jsem zjistil další zajímavou věc: kdyz jsem v index.php vynechal kod pro odhlášení (kam se přesměrovuje když neexstiuje $_SESSION['id'], tj. session_destroy(); tak v umístění pro session zůstane prazdná session

soubor se v tempu vytvoří ale zůstane prostě prázdna ... někde dojde ke nikoli ke "zničení" ale k "unset" všech session .... zdůraznuji, že k tomu dojde bez toho <kodu_navic> !
Pavel Strejček
Profil
Chtělo by to zjistit minimální příklad kódu, kdy to přestane fungovat, aby se vyloučila chyba v logice skriptu. Ten kód se nedá vzít a vyzkoušet. Postupně odmazat, to co tam být nemusí až to začne fungovat. Jestli to jinde funguje, jak jsem pochopil, tak to není způsobeno verzí PHP, ale bude to v tom skriptu.
j_hajsl
Profil
Pavel Strejček
v php4 to funguje jak má bez jakékoli změny v kodu, prostě jsem jen odintaloval apache 1.23.x php4.3.9 a mysql 4.0.x a nainstaloval apache 2.2.3, php 5.2.0 a mysql 4.1.x a to je vše, jinak jsem opravdu nic nemenil

zkoušem funkci změnit i za cenu, že se na výstupu něco vypíše, ale nepomáhá to


function obnov($kam,$kam2="") {
global $_SESSION, $SERVER, $GLOBALS;

$fp = fopen("./vypis_promennych.txt","a");
foreach ($_SESSION as $key => $value) {
$prechodka[$key]=$value;
$text .= "$key > $value
";
}
$zapis = fwrite($fp,$text);
fclose($fp);
unset($_SESSION);unset($text);
foreach ($prechodka as $key => $value)
$_SESSION[$key] = $value;

$fp = fopen("./vypis_promennych2.txt","a");
foreach ($_SESSION as $key => $value) {
$text .= "$key > $value
";
}
$zapis = fwrite($fp,$text);
fclose($fp);

$string = "$kam.php";
if ($kam2) $string .= "?$kam2";
echo "reload";
echo "<meta http-equiv="refresh" content="5;URL=$string">";
exit();
}


ale ani to nepomůžu, ani v mezičase se session nezapiše, je tam nulový soubor, ale do obou textových souborů se to zapíše jak má, tak opravdu netuším :-(
Pavel Prochazka.zde.cz
Profil *
mozna me tu neco porad unika.....
Vypisete vsechny session, ok, ty se zapisi do souboru..... ale pak dale nevidim kde ji pouzivate.....

sem si v php4 odkrokoval nasledujici funkci a vse je ok....

function obnov($kam) {

//global $_SESSION;
//$fp = fopen("./vypis_promennych.txt","a");
foreach ($_SESSION as $key => $value) {
$prechodka[$key]=$value;
$text .= "$key > $value ;";
}
//$zapis = fwrite($fp,$text);
//fclose($fp);
}

Php5 nemam jelikoz na mem free hostingu je pouze php4.....
Pavel Prochazka.zde.cz
Profil *
jeste jedna poznamka:
kdy pouzijete v kodu:

unset($_SESSION);unset($text);

a potom pracujete opet se $_SESSION, tak by ta promena uz nemala bejt k dispozici. Ale jak rikate ze se zapisi data do obou souboru.... dle me se ty session smazou casem nebo nejpozdeji besprostredne po ukonceni scriptu....
Pokud uzivatel klikne na dalsi stranku, tak uz $_SESSION neni zadna k dispozici...
Pavel Strejček
Profil
Porovnal bych po té instalaci ještě nastavení php.ini, hlavně sekci SESSION. Používáš tam taky extract, tak jak bylo zapnuto register_globals, jestli to nemělo vliv.
Jinak chybu tam nevidím, ale vyzkoušet to nejde, protože nevím co má je na vstupu všech polí, není to komplet. Základní skriptík se session funguje, takže sešnama to asi IMHO není.
j_hajsl
Profil
Pavel Prochazka.zde.cz
funkce obnov() přesmerovuje na soubor uvod ... ale jelikož uživatele se dají smazat, tak ten kdo se jednou prihlásí, ví kam má jit, tak i v na uvodu souboru "uvod" testuji zda je session zaplnene uzivatelou id, kterou ziskam v tom indexu ($_SESSION['sess_id'] = $prihlaska['us_id'];), ale ona tam neni, tak ten skript provede odhlaseni a normalne session znici session_destroy ale protoze jsem to chtel ladit, tak jsem tu cast kodu vynechal a zjistil, ze se mi v tempu session vytvori ale prázdná ...
j_hajsl
Profil
Pavel Strejček
register_long_arrays = On

to byl celý problém !!!! já to měl off .... díky za nakopnutí ... kontroloval jsem jen nastavení v sekci session ... a ne u register_...

// edit
ted čtu manual a je to nová directiva od PHP 5.0.0
Toto téma je uzamčeno. Odpověď nelze zaslat.