Avatar
Salieri
Člen
Avatar
Salieri:

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
Hlavní zlo? **Školství a Matematika**!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Salieri
David Čápka:

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

Nahoru Odpovědět 26.11.2013 17:25
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:

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  +1 26.11.2013 17:30
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Salieri
Daniel Vítek:

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

 
Nahoru Odpovědět 26.11.2013 17:34
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Salieri
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Salieri
Člen
Avatar
Odpovídá na David Čápka
Salieri:

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
Hlavní zlo? **Školství a Matematika**!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Salieri
David Čápka:

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  +1 26.11.2013 18:05
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
mkub
Redaktor
Avatar
Odpovídá na Salieri
mkub:

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
Redaktor
Avatar
Odpovídá na Salieri
Kit:

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
Redaktor
Avatar
mkub:

trosku som to napisal nezrozumitelne...

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

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
Redaktor
Avatar
Odpovídá na Ori
mkub:

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 1.12.2013 5:28
Avatar
Silvinios
Redaktor
Avatar
Silvinios:

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
Redaktor
Avatar
Odpovídá na Silvinios
Kit:

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
Redaktor
Avatar
Odpovídá na Silvinios
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
Silvinios:

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
Redaktor
Avatar
Odpovídá na Silvinios
Kit:

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.