« 1 2 »
Autor Zpráva
fili
Profil
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>&nbsp;</p>
<<a href=\"aktualizacia-uctu.php\">Aktualizácia účtu</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"aktualizacia-regudajov.php\">Aktualizácia registračných údajov</a></div>";
  }
else
{
    echo "Uviedli ste nesprávne meno alebo heslo!";
}



?>
Na začiatku stránky, pred <html>kde mi vypíše hore uvedené linky
mám
<?  session_start(); ?>
a vyzerá to, že je všetko ok. Ale ak na ďalšie zabezpečené stránky dám
<?php
if($_SESSION['prihlaseny'] != 'ano')
    die("Nepovolený vstup! Najprv sa prihláste.");
?>
Tak už mi zobrazí v lepšom prípade hlášku - Nepovolený vstup! Najprv sa prihláste. Pričom na tej prvej strane, keď dám odhlásiť, tak to vyzerá, že prihlásenie bolo ok a odhlási ma.
Kde je chyba? Robím také niečo 1x
Duchaplny
Profil
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
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
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.");
?>
to mi nefunguje

Joker
Pridal som si aj password do podmienky, aj keď login by mal byť unikátny inak ho nedovolí zaregistrovať.
var_dump($_SESSION); 
mi na prvej stranke hodilo array(0) { }
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
Micruss:
var_dump($_SESSION);
vyhodilo array(0) { }
Micruss
Profil
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
Co používáš za interpret? Máš načetlý modul session-module(WAMP ho má standartně vypnutý)?
fili
Profil
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);
a vyhodilo mi:
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
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
Stále chce definovať 'prihlaseny', ako to mám definovať ako login?
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
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
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
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
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>
A tu sa spracuje:
$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>&nbsp;</p> <<a href=\"aktualizacia-uctu.php\">Aktualizácia účtu</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"aktualizacia-regudajov.php\">Aktualizácia registračných údajov</a></div>";   } else {     echo "Uviedli ste nesprávne meno alebo heslo!"; }       ?>
Actimel
Profil
fili:
$_SESSION['prihlaseny'] == 'ano';

tohle je špatně žejo... máš tam o rovnítko navíc

$_SESSION['prihlaseny'] = 'ano';
fili
Profil
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
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
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
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
>
 <?phpini_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).""; 
Teraz bojujem s vypísaním údajov do formulára na zmenu údajov.
Kubo2
Profil
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.");
?>
máš uvedené 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;
A potom kód na testovanie týchto session premenných:
<?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
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;
3x =?,
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()
Kubo2
Profil
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
« 1 2 »

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: