Autor Zpráva
Mi24v
Profil
Zdravím,
chci se jen zeptat na jeden problém. V jednom skriptě používám session. Na localhostu všechno jede, ale když skripty hodím na webhosting, session se neuloží.

Zkoušel jsem ji zavolat ve skriptě, kde se ukládá a zobrazila se. Jakmile ji ale zavolám z jiného skriptu, tak se už nezobrazí.
session_start() tam samozřejmě mám. Ještě připomínám, že na localu všechno jelo.

Chci se teda zeptat, jestli je možné, že aby se session neukládala. Jestli by mohla být nějak vyplá. Napadá mě akorát, že bych jí ještě mohl nastavit životnost...

Předem díky za rady a vaše zkušenosti... :-)
nightfish
Profil
jakým způsobem se identifikátor session přenáší? jestli přes cookies, tak zkontroluj, jestli jsou cookies povolené, jestli přes URL, tak zkontroluj, zda-li se do URL doplňuje identifikátor
jinak bez konkrétního kódu to asi podrobněji nepůjde
Mi24v
Profil
Tak jsem vyzkoušel na dvou webhostingách toto:

Soubor test.php:
<?php
session_start();

session_register("pocet");
session_register("kusu");
session_register("table");

$_SESSION['pocet'] = 1;
$_SESSION['kusu'][0] = 22;
$_SESSION['table'][0] = akce;

header ("location: test1.php");
exit;
?>


Soubor test1.php:
<?php
session_start();

echo $_SESSION['pocet'];
echo $_SESSION['kusu'][0];
echo $_SESSION['table'][0];
?>


U toho kde mi to blbne to vypíše:

1
2
a

U toho druhýho:

1
22
akce

Tak teď poraďte kde je problém... Že by různý verze PHP??
Mi24v
Profil
Myslel jsem, že pomůžou uvozovky, ale nic..
Andre
Profil
Jen nevím proč máš u test.php na konci exit; a proč je u session další index [0]. Jinak nevím.
BetaCam
Profil
Andre
Jen nevím proč máš u test.php na konci exit;

Protože za přesměrování by se měl vždy dávat exit; ( Pokud tedy není žádoucí dokončení scriptu za přesměrováním. )

Mi24v

No minimálně ty session_register() tam nemaj co dělat.
Andre
Profil
No minimálně ty session_register() tam nemaj co dělat.

session_register() by neměl mít žádný vliv na tu chybu.
el mariachi
Profil
Andre
to súhlasím, ale sú tam úplne zbytočné...

Mi24v
<?php
session_start();

echo $_SESSION['pocet'];
echo $_SESSION['kusu'][0];
echo $_SESSION['table'][0];
?>


skús napísať ako

<?php
session_start();

echo $_SESSION['pocet'];
echo $_SESSION['kusu'];
echo $_SESSION['table'];
?>


a ten prvý súbor skús takto :

<?php
session_start();

$_SESSION['pocet'] = 1;
$_SESSION['kusu'] = 22;
$_SESSION['table'] = "akce";

header ("location: test1.php");
?>


myslím že tu je teraz ten exit zbytočný, preto som ho dal preč, ale nemal by s tým mať žiadnu súvislosť. pokiaľ ho tam potrebuješ tak si ho tam kľudne pridaj, ale najskôr vyskúšaj toto
nightfish
Profil
header ("location: test1.php");
schválně - bude tohle fungovat, když budou vypnuté cookies? imho ne...
zkus
header("Location: test1.php?".SID);
BetaCam
Profil
Andre
session_register() by neměl mít žádný vliv na tu chybu.

O to nejde de o to, že session_register() je deprecated. A session_register() by se nemělo používat pokud se používá $_SESSION.

el mariachi

myslím že tu je teraz ten exit zbytočný, preto som ho dal preč, ale nemal by s tým mať žiadnu súvislosť. pokiaľ ho tam potrebuješ tak si ho tam kľudne pridaj, ale najskôr vyskúšaj toto

Platí "nepsané" pravidlo, že za přesměrováním má být vždy exit(); a je jedno jestli je přesměrování na konci souboru nebo ne.
Mi24v
Profil
Andre
to súhlasím, ale sú tam úplne zbytočné...
Mi24v
<?php
session_start();
echo $_SESSION['pocet'];
echo $_SESSION['kusu'][0];
echo $_SESSION['table'][0];
?>
skús napísať ako
<?php
session_start();
echo $_SESSION['pocet'];
echo $_SESSION['kusu'];
echo $_SESSION['table'];
?>
a ten prvý súbor skús takto :
<?php
session_start();
$_SESSION['pocet'] = 1;
$_SESSION['kusu'] = 22;
$_SESSION['table'] = "akce";
header ("location: test1.php");
?>
myslím že tu je teraz ten exit zbytočný, preto som ho dal preč, ale nemal by s tým mať žiadnu súvislosť. pokiaľ ho tam potrebuješ tak si ho tam kľudne pridaj, ale najskôr vyskúšaj toto

Tak takle to jede, tudíš bude asi problém s ukládáním do pole. To potřebuji pro ukládání dalších položek.
Mi24v
Profil
Můžu vůbec udělat toto:

$_SESSION['nazev']['index_pole']
BetaCam
Profil
Mi24v
Můžu vůbec udělat toto:

$_SESSION['nazev']['index_pole']


můžeš.
Mi24v
Profil
Tak už jsem na to přišel!!!! Ono se to všechno ukládalo a všechno v pohodě jelo. Jenže, když se znovu načte index.php (stránky jsou includované) tak se všechny session smažou!!!

Tak teď poraďte...

Toto je index:

<div class="pre"><pre><?php
session_start();
?>
<html>
<head>
<title>Semotex</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
<meta http-equiv="Content-Language" content="cs">
<?php
if(eregi("MSIE", $_SERVER['HTTP_USER_AGENT'])) {
echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"style_ie.css\">\n";
}else{
echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n";
}
?>
</head>
<body>
<a href="/SEMOTEX" class="logo"></a>
<span class="main_line"></span>
<span class="img_line"></span>

<?php

$top_tlacitka = 214;

include "mysql_connect.php";
include "include_banner.php";

echo "<marquee direction=\"left\" behavior=\"scroll\" scrolldelay=\"85\" style=\" width: 60%; height: 20px; position: absolute; top: 70px; left: 50px; z-index: 1005;\">";
$vysledek = mysql_query("SELECT * FROM ostatni;");
while ($vypis = mysql_fetch_array($vysledek)) {
echo "".$vypis['text']."\n";
}
echo "</marquee>";

echo "<ul>\n";
$sql = "SELECT * FROM menu WHERE `typ` = 'user' ORDER BY poradi;";
if ($vysledek = mysql_query($sql)){
while ($vypis = mysql_fetch_array($vysledek)){
echo "<li class=\"menu\" style='top: ".$top_tlacitka."px;'><a href=\"index.php?page=".$vypis['odkaz']."\" class=\"menu\" target=\"".$vypis['funkce']."\">".$vypis['nazev']."</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
}
}else{
echo "Databázový server neodpovídá.";
}
echo "</ul>\n";



$top_tlacitka = $top_tlacitka + 29;

echo "<ul>\n";
if($_COOKIE['admin']){

include "mysql_connect.php";

$sql = "SELECT jmeno FROM uzivatele WHERE `login` = '".$_COOKIE['admin']."';";
if($vysledek = mysql_query($sql)){
if($vypis = mysql_fetch_array($vysledek)){
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"index.php?page=profil.php\" class=\"menu_security\">Můj profil</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"index.php?page=kosik.php\" class=\"menu_security\">Nákupní košík</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"#\" onclick=\"window.open('administrace.php','Administrace','height=800, width=880, scrollbars=yes, location=no')\" class=\"menu_security\">Administrace</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"logout.php\" class=\"menu_security\">Odhlásit</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "</ul>";


echo "<span class=\"stav\">Přihlášen jako ".$vypis['jmeno']." | <img src=\"img/web/kosik.gif\" width=\"17\" height=\"17\" align=\"top\"> <a href=\"index.php?page=kosik.php\" style=\"color: #3a83ca;\">Nákupní košík</a> (";if (!isset($_SESSION['pocet'])){echo "0";}else{echo $_SESSION['pocet'];} echo ") | <a href=\"index.php?page=profil.php\" style=\"color: #3a83ca;\">Můj profil</a> | <a href=\"logout.php\" style=\"color: #3a83ca;\">Odhlásit</a></span>";
}
}

}elseif($_COOKIE['maloobchod']){

include "mysql_connect.php";

$sql = "SELECT jmeno FROM uzivatele WHERE `login` = '".$_COOKIE['maloobchod']."';";
if($vysledek = mysql_query($sql)){
if($vypis = mysql_fetch_array($vysledek)){
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"index.php?page=profil.php\" class=\"menu_security\">Můj profil</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"index.php?page=kosik.php\" class=\"menu_security\">Nákupní košík</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"logout.php\" class=\"menu_security\">Odhlásit</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "</ul>";



echo "<span class=\"stav\">Přihlášen jako ".$vypis['jmeno']." | <img src=\"img/web/kosik.gif\" width=\"17\" height=\"17\" align=\"top\"> <a href=\"index.php?page=kosik.php\" style=\"color: #3a83ca;\">Nákupní košík</a> (".$_SESSION['pocet'].") | <a href=\"index.php?page=profil.php\" style=\"color: #3a83ca;\">Můj profil</a> | <a href=\"logout.php\" style=\"color: #3a83ca;\">Odhlásit</a></span>";
}
}

}elseif($_COOKIE['user']){

include "mysql_connect.php";

$sql = "SELECT jmeno FROM uzivatele WHERE `login` = '".$_COOKIE['user']."';";
if($vysledek = mysql_query($sql)){
if($vypis = mysql_fetch_array($vysledek)){
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"index.php?page=profil.php\" class=\"menu_security\">Můj profil</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"index.php?page=kosik.php\" class=\"menu_security\">Nákupní košík</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"logout.php\" class=\"menu_security\">Odhlásit</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "</ul>";



echo "<span class=\"stav\">Přihlášen jako ".$vypis['jmeno']." | <img src=\"img/web/kosik.gif\" width=\"17\" height=\"17\" align=\"top\"> <a href=\"index.php?page=kosik.php\" style=\"color: #3a83ca;\">Nákupní košík</a> (".$_SESSION['pocet'].") | <a href=\"index.php?page=profil.php\" style=\"color: #3a83ca;\">Můj profil</a> | <a href=\"logout.php\" style=\"color: #3a83ca;\">Odhlásit</a></span>";
}
}

}else{
echo "<li class=\"menu_security\" style='top: ".$top_tlacitka."px;'><a href=\"index.php?page=login.php\" class=\"menu_security\">Přihlášení</a></li>\n";
$top_tlacitka = $top_tlacitka + 29;
echo "</ul>";

echo "<span class=\"stav\"><a href=\"index.php?page=login.php\" style=\"color: #3a83ca\">Přihlásit se</a></span>";

}
echo "</ul>\n";

echo "<span class=\"content\">";

$page=$_GET["page"];

if($page) {
if(file_exists($page)) {
include "$page";
}else{
include "404.php";
}
}else{
include "pages/uvod.php";
}

echo "</span>";
echo "<div style='position: absolute; left: 0px; top: ".$t
Mi24v
Profil
Vyřešeno!!! Dělalo to session_start() které bylo napsané ve skriptu úplně nahoře, smazal jsem to a jede to...
HonzaMac
Profil *
Tak, sice jsem si to nečetl celé, ale nyní jsem to řešil v práci.

Podobný script na serveru, kde jde Linux fungoval skvěle, ale na Windowsovem serveru nefungoval.

Příklad:
<?php
// index.php
session_start()
$_SESSION["neco"]="nic";
print_r($_SESSION["neco"]); // vypíše
header("Location: index2.php");
?>
<?php
// index2.php
session_start();
print_r($_SESSION["neco"]); // nevypiše nic? Proč?
// protože běžím ne windows serveru! 
?>


Ano, přesně tohle se mi stalo. Řešením bylo, že jsem před přesměrováním napsat ještě
session_close_write();

V linuxu se to udělá automaticky, ale ve windows ne.

Snad tento příspěvek někomu pomůže. Mě to trvalo několik hodin, než jsem přišel na to, proč to na Linuxu funguje a na Windows ne.
jrm
Profil
Jen poznámka - prohozená slova u poslední funkce:
session_write_close() ---> Write session data and end session
pietroverde
Profil
Řekněme, že mám stejný problém jako Mi24v, jen s tím rozdílem, že nepřesměrovávám, ale parametry přenáším v QUERY_STRING v URL, podle kterých se pak spouští příslušná funkce. Na lokálu mi všechno jede, ale jakmile to dám na webhosting, tak se $_SESSION nepřesnese.
Mám redakční systém, do kterýho (resp. na kterej) jsem implementoval správce souborů. v administraci redakčního systému si vytvořím obrázkovou galerii, kterou chci naplnit obrázkama vybranýma ze správce souborů. Mimo jiné potřebuju uchovat ID galerie, do který se mají zvolené obrázky uložit.

soubor admin.php v redakčním systému:

<html>
...
<a href="cesta/někam/filemanager.php?pridg=1">Otevřít správce souborů</a>
<!-- pridg = číslo galerie, do které se mají obrázky přidat -->
...
</html>




soubor filemanager.php ve správci souborů:

<?php
   function OdstranitXSS($vstup){
   // funkce zajištující ošetření vstupních proměnných...
   return $vstup;
   }
   
   if(function_exists('session_start')) session_start();
  
    Header('Cache-control: private, no-cache, must-revalidate');
    Header('Expires: 0');
    
    //$pridg = $_GET["pridg"];
    $_SESSION["pridat_do_galerie"] = OdstranitXSS($_GET["pridg"]);
    
    if(isset($_SESSION["pridat_do_galerie"]) && $_SESSION["pridat_do_galerie"]!=""):
      $cesta_zpet = "../../admin.php?akce=OtevritGalerii&modul=galerieobr&pridg=";
      $cesta_zpet .= "$_SESSION["pridat_do_galerie"]."";
    else:
      $cesta_zpet = "../../admin.php?akce=PrehledSouboru&modul=filemanager";
    endif;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=<?php echo CHARSET; ?>">
<title><?php echo TITLE; ?></title>
<link rel="stylesheet" type="text/css" href="<?php echo STYLESHEET; ?>">
</head>
<body>
<!-- vyzkouším, jestli se přenáší potřebné parametry -->
<p><?php echo "SESSION: ".$_SESSION["pridat_do_galerie"]; ?></p>
<p><?php echo "REFERER: ".$_SERVER["HTTP_REFERER"]; ?></p>
<!-- /vyzkouším, jestli se přenáší potřebné parametry -->

...

<?php
  include('filemanager.inc.php');
?>

...

</body>
</html>



Při přechodu z administrace do správce souborů na "filemanager.php?pridg=1" se mi $_SESSION["pridat_do_galerie"] zobrazí správně, tj. jednička. Při kontrole cookies vidím, že v počítači je uloženo jenom PHPSESSID. Neměla by tam být i hodnota "pridat_do_galerie"?
Jakmile ale přejdu do nějakého adresáře ve správci souborů, např. "filemanager.php?fmMode=open&fmObject=0", tak se mi už $_SESSION["pridat_do_galerie"] nepřenese.

Jak jsem řekl, na lokálu (Windows, Apache jako Fast-CGI) mi vše funguje OK. Webhosting jede na Linuxu. Zkoušel jsem různý varianty jako zakomentovat session_start() nebo hlavičky Header, kdyby to náhodou bylo tím, že se nemá používat cache. Zkusil jsem přidat session_write_close() na poslední řádek před vypsáním HTML. Všechno bez efektu, nebo prohlížeč souborů nefungoval správně a session se stejně nepřenášely.

P.S: ještě poznámka. Při použití MSIE se $_SERVER["HTTP_REFERER"] přenese jenom při přechodu z admin.php na filemanager.php, ale dál se už při pohybu ve správci souborů, tj. filemanager.php zůstává a mění se jen parametry URL za otazníkem, se už HTTP_REFERER nepřenese.
Ve Firefoxu se referer přenáší všude.
pietroverde
Profil
No, tak chybička se našla, v souboru filemanager.php mělo místo:

$_SESSION["pridat_do_galerie"] = OdstranitXSS($_GET["pridg"]);


být správně:

if(!isset($_SESSION["pridat_do_galerie"]) && $_SESSION["pridat_do_galerie"]!=""):
   $_SESSION["pridat_do_galerie"] = OdstranitXSS($_GET["pridg"]);
endif;


Pokaždé se dosazovala hodnota z parametru pridg z URL, ale ten tam byl jenom při přechodu z administrace do správce souborů, dál už ne, takže se tam dosadila prázdná hodnota.

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:

0