Autor Zpráva
numhex
Profil
Zdravím, mám vlemi specifický problém a tak jsem pro jeho lepší vysvětlení vytvořil 5 souborů, jejichž funkci popíšu v následujících několika řádcích:

Jak to funguje:
Pomocí formuláře se odešlou hodnoty 'user' & 'pass' na stránku vybrat_obsah.php a pokud jsou to "správné" hodnoty,
tak se 'auth' nastaví na 1 a uživateli tak bude umožněno prohlížet stránku vybrat_obsah.php, pokud ale užitel zadá "špatné" hodnoty,
tak je přesměrován zpět na stránku prihlasit.php

Popis problému:
Problém je, že při kliknutí na odkaz, který vkládá obsah jiného souboru na aktuální stránku pomocí include, se hodnota 'auth'
nastaví zpět na 0. Má to prakticky stejný efekt jako session_destroy.
Tzn.: že po kliknutí na odkaz je uživatel přesměrován zpět na stránku prihlasit.php + server vypíše chyby: undefined index user & pass.

Otázka tedy je: existuje nějaký způsob jak session udržet naživu i při použítí odkazu spolu s include?

prihlasit.php :
<?php
session_unset();
?>
<html>
<head>
<title>Přihlašte se prosím</title>
</head>
<body>

<div style="position:relative; margin:0px auto; padding:20px 0px 0px 0px; width:400px; background:grey; text-align:center; border:1px solid black;">

  <form method="post" action="vybrat_obsah.php">
    
    <input type="text" name="user">
    <br>  
    <input type="password" name="pass">
    <br> 
    <input type="submit" name="odeslat" value="Přihlásit se">
    
  </form>

</div>

</body>
</html>

vybrat_obsah.php:
<?php     
session_start();

$_SESSION['user'] = $_POST['user'];
$_SESSION['pass'] = $_POST['pass'];
$_SESSION['auth'] = 0;


if ( $_SESSION['user'] == "slon" &&
     $_SESSION['pass'] == "chobot123" ) 
   { $_SESSION['auth'] = 1; } 
   else { header('Refresh: 5; URL = prihlasit.php'); }      
?>

<html>
<head>
<title><?php echo $odkaz ?></title>
</head>
<body>

<div style="position:relative; margin:0px auto; padding:20px 0px 0px 0px; width:400px; background:grey; text-align:center; border:1px solid black;">

<a href="vybrat_obsah.php?str=obsah1">obsah1</a>
<br>
<a href="vybrat_obsah.php?str=obsah2">obsah2</a>
<br>
<a href="vybrat_obsah.php?str=obsah3">obsah3</a>

</div>

<?php
if (!isset($_GET['str'])) { //pokud hodnota 'str' neni nastavena, tak nedelej nic
} else {                    //pokud hodnota 'str' je nastavena, tak:
$str_var = $_GET['str'];    //nacti hodnotu 'str' do promenne $str_var

$odkaz = "odkazy/".$str_var.".php"; //do promenne $odkaz nacti hodnotu: odkazy(nazev slozky) / $str_var.php(nazev souboru - obsah1 nebo obsah2 nebo obsah3)

include $odkaz; //napr.: include "odkazy/obsah1.php"
} 
?>

</body>
</html>

-- následující soubory se nacházejí ve složce: odkazy --

obsah1.php :
<h1>OBSAH 1</h1>
obsah2.php :
<h1>OBSAH 2</h1>
obsah3.php :
<h1>OBSAH 3</h1>
suvel
Profil
vybrat_obsah.php: Po kliknutí na řádek 23, 25 nebo 27 si všechny session na řádcích 4-6 vynuluješ
numhex
Profil
suvel:
To je prakticky to co jsem napsal v popisu problému. Chci vědět jestli existuje nějaký způsob jak, po kliknutí na odkaz, session nevynulovat?
Budulinek
Profil
numhex:
samozřejmě existuje. Problém je v tom, že si automaticky při načtení stránky vybrat_obsah.php přepisuješ session řádkem 4-6. i v případě, že formulář neodešleš a tím pádem se ti (nejen) $_SESSION['auth'] nastaví na 0.

V tomto případě je asi nejjednosušší to obalit podmínkou a testovat odeslání formuláře a až pak nastavovat session.
suvel
Profil
Pro jednoduché, spolehlivé a bezpečné fungování je stejně třeba použít databázi. Jestli ji nemáš k dispozici, dá se to nahradit souborem, ve kterém bude uloženo $jmeno a md5($heslo) a vždy v případě potřeby samostatným scriptem otestovat přihlášení a nemotat to do jiných scriptů.
numhex
Profil
Díky za tipy, problém jsem vyřešil přidáním dalšiho souboru, který ověří přihlašovací jméno + heslo, nastaví hodnotu 'auth' na 1 nebo 0 a podle toho přesměruje uživatele na stránku prihlasit.php nebo vybrat_obsah.php.

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: