Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: $_SESSION

Aktivity
Avatar
Kamil
Člen
Avatar
Kamil:26.11.2013 17:24

Zdravím,

Při logování do IS jsem použival pro vypsání uživatele kdo se logoval $_SESSION["login"];

Nyní chci udělat to samé, celý postup. Bohužel nyní to samé nefunguje. Můžeme mi poradit?
1.soubor

<form action="index.php" method="POST">
<table>
<tr><td>Login:</td><td><input type="text" name="login" size="15"></td></tr>
<tr><td>Heslo:</td><td><input type="password" name="heslo" size="15"></td></tr>
<tr><td></td><td><input type="submit" value="Přihlásit se"><input type="reset" value="Reset"></td></tr>
</table>
</form>
<?php
  require("connect.php");
  if(isset($_POST["login"])and(isset($_POST["heslo"]))){
  if(empty($_POST["login"])and(empty($_POST["heslo"]))){
  echo("<font size=\"2\"><font color=\"red\">Nezadal jste login nebo heslo</font></font>");
  }
  else{
  $login=$_POST["login"];
  $heslo=$_POST["heslo"];
  $dotaz="select * from users where login=\"$login\" and heslo=\"$heslo\"";
  if($vysledek=mysql_query($dotaz)){
  echo ("<font size=\"2\"><font color=\"red\">Zadal/a jste špatné uživatelské jméno nebo heslo</font></font>");
  }
  /*$vysledek=mysql_query($dotaz)or die ("Chyba při přihlašování uživatele");*/
 $loguser=mysql_fetch_array($vysledek);
  if(mysql_num_rows($vysledek)==1){

    Session_start();
         $_SESSION["id"]= $loguser["ID"];
         $_SESSION["jmeno"]= $loguser["jmeno"];
         $_SESSION["prijmeni"]= $loguser["prijmeni"];
         $_SESSION["email"] = $loguser["email"];
         $_SESSION["login"]= $loguser["login"];
         $_SESSION["heslo"]= $loguser["heslo"];
         $_SESSION["cas"]=time()+900;
         header("location:index.php");

  }
  }



2.souboru
<?php
require("connect.php");
session_start();
echo($_SESSION["login"]);
?>

Vím asi namítnete SQL injection. To budu rešit jako problem další. Nyní potřebuji to $_SESSION

?>
\---

 
Odpovědět
26.11.2013 17:24
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kamil
David Hartinger:26.11.2013 17:25

Ano, vnímáme opravdu injekce, to bys měl řešit jako první.

Nahoru Odpovědět
26.11.2013 17:25
New kid back on the block with a R.I.P
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:26.11.2013 17:28

Neuvažuješ už opravdu nad nějakým viditelným linkem, když uživatel zakládá vlákno v sekci PHP, na PDO nebo alespoň ty sql injekce. Vždyť tu ty injekce řešíme donekonečna stále dokola

Nahoru Odpovědět
26.11.2013 17:28
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Petr Nymsa
David Hartinger:26.11.2013 17:30

Zatím není kam odkazovat, základy databází v PHP je poslední neaktuální sekce, musím ji nejprve aktualizovat. Injekcím a PDO samozřejmě věnuji samostatný článek, na který tu budeme odkazovat.

Nahoru Odpovědět
26.11.2013 17:30
New kid back on the block with a R.I.P
Avatar
Odpovídá na Kamil
Neaktivní uživatel:26.11.2013 17:34

nech si vypsat to $loguser["login"] jestli náhodou není prázdný

Nahoru Odpovědět
26.11.2013 17:34
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kamil
David Hartinger:26.11.2013 17:49

Nefunguje ti to proto, že session_start() můžeš volat jen před výpisem, tedy na začátku skriptu.

Editováno 26.11.2013 17:49
Nahoru Odpovědět
26.11.2013 17:49
New kid back on the block with a R.I.P
Avatar
Kamil
Člen
Avatar
Odpovídá na David Hartinger
Kamil:26.11.2013 18:02

Před require?
Jinak mě toto fungovalo, nevím proč teď ne. (MYSLÍM STEJNÝ ZÁPIS)

 
Nahoru Odpovědět
26.11.2013 18:02
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kamil
David Hartinger:26.11.2013 18:05

Před session_start() vypisuješ HTML formulář. To vyvolá odeslání HTML hlavičky a session_start() ji již nemůže modifikovat.

Nahoru Odpovědět
26.11.2013 18:05
New kid back on the block with a R.I.P
Avatar
mkub
Tvůrce
Avatar
Odpovídá na Kamil
mkub:27.11.2013 14:14

session_start() a header() by som da este pred zobrazenim formulara, lebo kazdezobrazenie textu, vratane aj prazdneho riadka sposobi poslanie hlavicky
a PHP sekvenciu u vkladanych dokumentov by som neukoncoval, lebo niektore editory na koniec este pridavaju novy riadok, alebo aj ty sa pomylis a zabudnes na odriadkovanie, co sposobuje tiez posielanie prazdneho riadkA
a ked PHP parser dojde na koniec neukoncenej PHP sekvencie, nevypise ziadnu chybu, automaticky ju ukonci a Apache okrem spracovaneho vysledku neposle nic, ani en nechceny riadok, ktory sa do zdrojaku dostal nedopatrenim

 
Nahoru Odpovědět
27.11.2013 14:14
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:27.11.2013 14:17

Ten formulář stejně patří až na konec. Máš to nějaké přeházené.

Nahoru Odpovědět
27.11.2013 14:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
mkub
Tvůrce
Avatar
mkub:27.11.2013 14:31

trosku som to napisal nezrozumitelne...

 
Nahoru Odpovědět
27.11.2013 14:31
Avatar
Ori I
Člen
Avatar
Ori I:27.11.2013 16:06

session_start musi byt pred zaciatkom skriptu(aj pred HTML, prelepsiu orientaciu kukni nieco o MVC patterne).

A dovod preco ti to predtym fungovalo, no pravdepodobne si pracoval na localhoste popripade zle nastavenom serveru, ktoremu to nevadilo.

 
Nahoru Odpovědět
27.11.2013 16:06
Avatar
mkub
Tvůrce
Avatar
Odpovídá na Ori I
mkub:1.12.2013 5:28

nielen session_start(), ale v tomto pripade by som cely PHP kod uviedol na zaciatok a na prvy riadok uviedol session_start(), za nim header(), ale nastavenie premennej $_SESSION[] moze byt hocikde v skripte, nemusi byt presne na zaciatku PHP kodu, tam,kde sa hodi, lebo tato premenna samotna definuje udaje,ktore sa maju ukladat v sessions...

aby som to ujasnil,funkcia session_start() nastavuje prostredie na ukladanie udajov o sessions, musi byt volana este skor, nez sa ma nieco poslat prehliadacu, cize by nemal byt pred:

<?php
session_start();
.
.
.

ani prazdny riadok, ani nic, co by mohlo poslat browseru nejaku hlavicku...
aj preto mu to nemusi fungovat

dalej mu to nemusi fungovat aj pre to, ze nema nastavenu spravne premennu pre docasne subory na strane servera

 
Nahoru Odpovědět
1.12.2013 5:28
Avatar
Silvinios
Tvůrce
Avatar
Silvinios:8.12.2013 11:33

V PHP se mi osvědčilo nepřistupovat k $_SESSION přímo, ale přes vlastní třídu, která mě od session_start() odstíní.

class Session {

  public static function getCurrent() {
    if (session_id() === '') {
      session_start();
    }
    return new Session;
  }

  protected function __construct() {
  }

  public function setAttribute($name, $value) {
    $_SESSION[$name] = $value;
  }

  public function getAttribute($name) {
    if (isset($_SESSION[$name])) {
      return $_SESSION[$name];
    }
    return null;
  }

  public function removeAttribute($name) {
    unset($_SESSION[$name]);
  }

}
 
Nahoru Odpovědět
8.12.2013 11:33
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Silvinios
Kit:8.12.2013 11:49

Možná by se použitelnost o něco zlepšila, kdybys ty metody přejmenoval. Třeba takto:

<?php
class Session {
    public static function getCurrent() {
        if (session_id() === '') {
            session_start();
        }
        return new Session;
    }

    protected function __construct() {
    }

    public function __set($name, $value) {
        $_SESSION[$name] = $value;
    }

    public function __get($name) {
        if (isset($_SESSION[$name])) {
            return $_SESSION[$name];
        }
        return null;
    }

    public function __unset($name) {
        unset($_SESSION[$name]);
    }
}
Nahoru Odpovědět
8.12.2013 11:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Silvinios
Kit:8.12.2013 12:06

Jinak to blbnutí se Singletonem mi připadá v daném případě poněkud zbytečné. Netuším, v čem se ti tento přístup osvědčil. Lépe se to testuje?

Nahoru Odpovědět
8.12.2013 12:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Silvinios
Tvůrce
Avatar
Odpovídá na Kit
Silvinios:8.12.2013 12:24

Díky moc za tip. Property overloading v PHP jsem neznal. Ještě mi tam chybí __isset.

 
Nahoru Odpovědět
8.12.2013 12:24
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Silvinios
Kit:8.12.2013 12:27

Myslím si, že si ho při svých schopnostech snadno dopíšeš :)

Nahoru Odpovědět
8.12.2013 12:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.