« 1 2 »
Autor Zpráva
davidmyska
Profil
Ahoj, v PHP jsem uplný začátečník poraďte mi jak mám u tohoto udělat: Jste přihlášen/a jako (a uživatelské jméno přihlášeného). Potřeboval bych aby se to nacházelo na tomto souboru (asi bude potřeba změnit index2.html na index2.php)
můžete se přihlásit na účet: "test" a heslo: "test"
Keeehi
Profil
davidmyska:
(asi bude potřeba změnit index2.html na index2.php)
Ano bude.

Bez PHP kódu ale nevíme, jak to u tebe funguje, takže ti nemůžeme pomoci. Ve většině případů by to bylo asi něco jako: echo "Jste přihlášen/a jako $_SESSION[uzivatel]";, což zatím u tebe nebude, protože sessions nepoužíváš.
Neas
Profil
souhlasím s Keeehi, bez php scriptu ti jen těžko můžeme poradit.
ps. to, že přihlášení přesměrovává na jinou stránku má nějaký důvod? pomocí ifu to můžeš zařídit tak, že přihlášeným uživatelům se zobrazý XXX a nepřihlášeným přihlašovaný formulář.
EDIT: ve FAQ si najdi registraci a přihlašování uživatelů: http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=2111
davidmyska
Profil
Neas:
díky přihlášení mám ale ještě bych k tomu potřebuval registraci
Neas
Profil
registrace je ještě jednodušší:
uděláš si formulář, ten odešleš metodou POST a někde na začátku scriptu (po připojení k databázi) napíšeš schematicky něco jako tohle:
zkontroluješ si, zda je formulář odeslán:
if(isset($_POST['odeslat']))

pokud ano, zkontroluješ si, zda jsou povinné údaje vyplněny:
if(!empty($_POST['jmeno']) && !empty($_POST['heslo']))

pak už jen ošetříš vstupy a uložíš do databáze pomocí mysql_query:
mysql_query("INSERT INTO users (username, password) VALUES ( ' ".mysql_real_escape_string($_POST['jmeno'])." ', ' ".sha1($_POST['heslo'])." ' ");

je to to nejprimitivnější řešení, v praxi by jsi měl ohlídat ještě minimálně, aby neexistovali 2 uživatelé se stejným jménem a aby se ti na web neregistrovali boti (pakliže si v php začátečník, řešil bych to logickou otázkou, kterou bot zodpovědět neumí)
od věci také není vložit na stránku 2 pole typu password, které se musejí rovnat (kvůli případným překlikům)
etc.
davidmyska
Profil
promiň ale jedinné co tak dokážu je upravit registraci kterou jsem měl už předtím, toto jaksi nechápu ale i tak díky
HajekJirka
Profil
davidmyska:
promiň ale jedinné co tak dokážu je upravit registraci kterou jsem měl už předtím
No tak si ji uprav. Nebo požádej někoho ať Ti to udělá, třeba google. (viz první stránka)
davidmyska
Profil
Nějak jsem to sesmolil, registrace pracuje dobře, ale přihlašování mi nejede
index.php:
<?php
$path = "/";  // máte-li stránky v rootu, nechte bezezměny, pokud je provozujete v nějakém podadresáři, zadejte jeho jméno
              // např. stránky mám na moje-domena.cz/adresar/, tak zadám $path = "/adresar/";

// funkce pro ošetření vstupních dat od uživatele
// viz http://cz.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc
function gpc_addslashes($str)
{
    return get_magic_quotes_gpc() ? $str : mysql_real_escape_string($str);
}

include "db.php"; // soubor db.php zajistí připojení k databázi a výběr databáze, se kterou pracujeme
session_start();  // tohle je nezbytné a je nutné uvést tuto funkci na všech stránkách, kam se přihlášený uživatel dostane
                  // možnost nastavit automatické spouštění session_start() nechávám stranou

// zjistíme, co chce uživatel dělat
if (isset($_SESSION['username']) && isset($_GET['logout']))
{
    // uživatel je přihlášen a chce se odhlásit, takže smažeme údaje o přihlášení
    $_SESSION = array();
    if (isset($_COOKIE[session_name()]))
    {
        setcookie(session_name(), '', time()-42000, '/');
    }
    session_unset();
    session_destroy();
    // a přesměrujeme na index.php
    header("location:http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303);
    exit;
}
elseif (isset($_SESSION['username']))
{
    //session_regenerate_id(); // ochrana před session fixation, lze vynechat
    // uživatel je přihlášen a nechce se odhlásit, zde zobrazíme obsah pro registrované
    // můžeme využit include apod.

    // tohle informuje uživatele, že je přihlášen a vypíše odkaz pro odhlášení
    // můžeme to ale přemístit do includovaného souboru (kam se nám hodí)
    echo "<p>Přihlášen: $_SESSION[username] <a href=\"http://".$_SERVER['SERVER_NAME'].$path."index.php?logout=1\">odhlásit</a></p>\n";
}
else
{
    // uzivatel není přihlášen
    // pokud odeslal přihlašovací údaje, snaží se přihlásit
    if (isset($_POST['username']) && isset($_POST['password']))
    {
        // ošetříme vstupní údaje od uživatele
        // funkce trim() má význam hlavně u hesla, ořeže bílé znaky (např. mezery) na začátku a konci řetězce
        $username = gpc_addslashes(trim($_POST['username']));
        $password = gpc_addslashes(trim($_POST['password']));

        // zjistíme, jestli je v databázi daný uživatel a jestli se prokazuje platným heslem
        // více o ukládání hesel, např. o tzv. solení, najdete na http://php.vrana.cz/ukladani-hesel.php
        $result = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username' AND password = sha1('$password')");

        if (mysql_result($result, 0))  // předpokládáme, že dotaz proběhl úspěšně, pokud ne, bude stejně vráceno false
                                       // true (a splnění podmínky) nastane pouze tehdy, když v databázi existuje správná kombinace uživatelského jména a hesla
        {
            // uložíme potřebné SESSION proměnné
            $_SESSION['username'] = $username;
            $_SESSION['cas_prihlaseni'] = time(); // čas, kdy se uživatel přihlásil, pozor, nejedná se o čas poslední akce, nevím, jestli ho využijete, může být smazán

            // po přihlášení uživatele přesměrujeme na index.php
            header ("location:http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303);
            exit;  // aby bylo pravidlům učiněno zadost, zde stejně končí podmínka a jiná nemůže být splněna
        }
        else
        {
            // uživatel zadal neplatné přihlašovací údaje
            // přesměrujeme ho na index.php a zobrazíme chybovou hlášku
            header ("location:http://".$_SERVER['SERVER_NAME'].$path."index.php?incorrect_login=1", TRUE, 303);
            exit;
        }
    }
    else
    {
      // uživatel není přihlášen a ani neodeslal přihlašovací formulář, tak mu ho zobrazíme
      echo "<div>";
      if (isset($_GET['incorrect_login']))
      {
          echo "<p style=\"color: #F00\">Zadali jste neplatné uživatelské jméno nebo heslo</p>\n";
      }
      // zobrazíme formulář pro přihlášení
      ?>
      <form action="index.php" method="post">
        Jméno:  <input name="username" type="text"><br>
        Heslo: <input name="password" type="password"><br>
        <input name="submit" type="submit" value="Přihlásit">
      </form>
      </div>
      <?php
    }
}
?>


registrace.php:
<?php
ob_start();               // cachujeme vystup
  if(isset($_POST['sent'])){      // pokud byl odeslan formular pokracuj timto
    $username=trim($_POST['username']);
    $password1=$_POST['password'];
    $password2=$_POST['password_znovu'];
    $mail=trim($_POST['mail']);
    $web=trim($_POST['web']);
    if($username=="" or $password1=="" or $mail==""){ // pokud nebylo vyplněno něco z toho, co je povinné, dáme vědět a skript ukončíme
      echo "Nebyly vyplněny všechny povinné údaje!";
    }else{              // povinné udaje vyplněny vsechny
      require "db.php";     // pripojime se k databazi
      $PocetStejnych=mysql_result(mysql_query("SELECT COUNT(*) FROM `uzivatele` WHERE `username`='$username' OR `mail`='$mail'"),0);
      if($PocetStejnych!=0){    // pokud v db je jiz takove jmeno nebo heslo...
        echo "Zadané jméno nebo email je již používán někým jiným!!!";
      }elseif($password1 != $password2){    // pokud se hesla nerovnají
        echo "Zadané hesla se neshodují!!!";
      }else{            // hesla se shoduji, vlozime tedy data do databaze
        $password=md5($password1);  // zahashujeme heslo
        if($web=="http://" or $web==""){ //pokud nezadal web tak dame promennou web prazdnou
          $web="";
        }
        $VlozData=mysql_query(" INSERT INTO uzivatele (`username`,`password`,`mail`,`web`)
                      VALUES
                    ('$username', '$password', '$mail', '$web')  ") or die (mysql_error());
        // Jako posledni hodnota je "0", to jsou ty prava uzivatele.
        if($VlozData){
          echo "Data byla uložena";
        }
      }

    }
  }else{
    echo "Nebyl odeslán formulář";
  }
// pokud pouzijete HEADER LOCATION tak by pred nim nemelo byt zadne platne ECHO
echo " <a href='index.php'>zpět</a>";
// samozrejme zde muze byt presmerovani na jinou stranku pomoci
// header ("Location: index.php");
ob_end_flush();
?>


formulář se nachází na registrace.html (myslím si že není potřeba zobrazovet kód)

tabulka v databázi:
CREATE TABLE `uzivatele` (
   `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
   `username` VARCHAR( 32 ) NOT NULL ,
   `password` VARCHAR( 32 ) NOT NULL ,
   `mail` VARCHAR( 64 ) NOT NULL ,
   `web` VARCHAR( 128 ) NOT NULL ,
       UNIQUE (`jmeno` , `mail` )
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_czech_ci;
jenikkozak
Profil
davidmyska:
Při registraci ukládáš heslo hashované pomocí md5(), při přihlašování ověřuješ jeho hash pomocí sha1().

Edit.: Navíc když uživatel při registraci vyplní heslo s mezerou na konci či na začátku, uloží se hash řetězce i s tou mezerou. Při přihlašování je mu tato mezera oříznuta pomocí funkce trim(), i kdyby na hashování byla použita totožná funkce, výsledné hashe se nebudou v tomto případě rovnat.
Komentáře jsou hrozně fajn, ale na takovémto fóru tak trochu ztrácejí smysl.
davidmyska
Profil
ikdyž jsem to dal na stejný hash pořád mi to nejede
jenikkozak
Profil
davidmyska:
Aha. A jak se ta nejízda projevuje?
Jo, a prosím už sem další skripty snad ani nedávej. Leda jejich část. :-)
davidmyska
Profil
nemůžu se přihlásit heslo a jméno je bez mezer hash je taky stejný
davidmyska
Profil
při venčení psa jsem si uvědomil že ten kód musí být nějak spojen s tabulkou v db, jak jsem se vrátil domů oběvil jsem že soubor index.php (řádek 54) ná zapsaný název tabulky jako "users" ale registrace.php má "uzivatele" a tabulka se jmenuje "uzivatele"
davidmyska
Profil
ale pořád to nejede najděte mi prosím chybu
trs
Profil *
A co (ne)dela? jakou chybu to vypisuje?
davidmyska
Profil
nemůžu se přihlásit
a chybou jsem myslel chybu v kódu tam něco musí být špatně ale já nevím co
jenikkozak
Profil
davidmyska:
Používáš-li na hashování SHA1, tak hash se ti nevejde do 32znakové buňky.
Pak si zkus chybu najít sám. Zakomentuj řádek 71 (uveď před něj dvě lomítka). Pokud nemáš na hostingu vypnuté zobrazování chybových hlášek, tak by ti to vypsalo chybu (třeba jak jsi měl špatně uvedený ten název tabulky). Pak si zkus třeba vypsat ty odeslané údaje a podívat se, jestli jsou v databázi stejně.
davidmyska
Profil
díky to by mě v životě nenapadlo že se to tam nevleze dal jsem to na 128 znaků a už to jede bez problémů
ještě bych se chtěl zeptat jestli by šlo nějak udělat aby se třeba účtu admin ukazovalo něco jiného než dalším účtům a ještě něco jiného nepřihlášeným uživatelům např:
nepřihlášený uživatel uvidí pouze základ
přihlášený uvidí něco navíc
admin uvidí ještě něco navíc
davidmyska
Profil
jak rozlišit přihlášené a nepřihlšené na to jsem už přišel ono je to vlastně v kódu indexu ale jak rozlišit běžný účet a admina to nevím ale asi tomu pomůže že jsem přidal sloupec v tabulce "prava" běžný uživatel má hodnotu "0" a admin má "1" při registraci tam automaticky skáče "0"
Neas
Profil
šlo. do tabulky si přidej sloupec "hodnost", "rank", nebo tak nějak, to je jedno. defaultně při registraci tam ukládej třeba 0 (stačí v phpmyadmin nastavit výchozí hodnotu, nemusíš to přidávat do scriptu při registraci). U admina totu buňku přepiš na 1 (další hodnosti můžou být 2, 3 etc.). Při přihlášení pak nastavuj session s hodnosti, která je uložená v db:
$_SESSION['hodnost'] = $fetch_array['hodnost'];

a pak někde, kde se má kód stránky lišit, testuj podmínku:
if($_SESSION['hodnost'] == 0)
{
//přihlášený uživatel
}
elseif($_SESSION['hodnost'] == 1)
{
//admin
}
else
{
//nepřihlášený uživatel
}

EDIT: naše poslední 2 komenty se minuly, vidím, že sám uvažuješ správně.
davidmyska
Profil
díky to bude ono
davidmyska
Profil
poraděte mi jěště jak to mám zapsat nějak mi to nechce fungovat místo poznámek jsem tam dal echo a pořád se tam píše přihlášený uživatel ikdyž tam je admin nebo nikdo není přihlášen
Neas
Profil
menuje se tvoje session $_SESSION['hodnost']?
je správně nastavena hodnota v databázi?
při přihlášení, přiřazuješ session správnou hodnotu?
--
jestli jsi na všechno odpověděl ano, pošli část zdrojáku, kde nastavuješ session.
davidmyska
Profil
1. $_SESSION['prava']
2. ano
3. nevím jak se to pozná
jenom mi poraďte kam mám vložit:
$_SESSION['prava'] = $fetch_array['prava'];
Neas
Profil
okopíroval jsem část tvého kódu, který jsi uvedl výše a zvýraznil změny.
Přiznám se, že já k připojení k mysql používám třídu mysqli, takže už jsem si odvykl neoběktové řešení, jako je tvoje, ale i tak by to mělo být dobře:
$result = mysql_query("SELECT prava FROM users WHERE username = '$username' AND password = sha1('$password')");
if (mysql_num_rows($result) == 1)  
        {
            $prava = mysql_result($result, 0);
            // uložíme potřebné SESSION proměnné
            $_SESSION['username'] = $username;
            $_SESSION['prava'] = $prava;
            $_SESSION['cas_prihlaseni'] = time(); // čas, kdy se uživatel přihlásil, pozor, nejedná se o čas poslední akce, nevím, jestli ho využijete, může být smazán

            // po přihlášení uživatele přesměrujeme na index.php
            header ("location:http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303);
            exit;  // aby bylo pravidlům učiněno zadost, zde stejně končí podmínka a jiná nemůže být splněna
        }

EDIT: celé toto řešení přihlašování však bude fungovat pouze pokud nebude existovat více než 1 uživatel s totožným jménem a heslem (což by neměl, ale nijak to neošetřuješ)
davidmyska
Profil
Já bych rači aby se to dívalo pouze na ty práva protože může se stát že se tam oběví dva uživatelé se stejným heslem
Neas
Profil
pokud mají stejné heslo a ne jméno, pak to script rozpozná. i pokud by měli stejné jméno a jiné heslo, script by fungoval. Ale jakmile se objeví 2 a více uživatelů se stejným jménem i heslem, nastane problém. s podmínkou
if (mysql_num_rows($result) == 1)

to nepřihlásí ani jednoho, s podmínkou
if (mysql_num_rows($result) > 1)  

to přihlásí vždy toho, který se registoval jako první (má nižší ID, tedy na něj query narazí dřív).
toto je třeba pořešit již u registace.
davidmyska
Profil
takže jestli to chápu tak u obou podmínek tam můžou být 2 a více uživatelů s jiným jménem ale se stejným heslem např:
ucet1 heslo1
ucet2 heslo1
2 a více styjných jmen se tam nemůže vyskytnout to je ošetřeno již v registraci
Neas
Profil
to je ošetřeno již v registraci
moje chyba, nepřečetl jsem si celý script pro registraci. V tom případě máš hotovo, script je v pořádku.
davidmyska
Profil
a jak mám teda rozlišit ty uživatele, mám tam dát jen toto:
if($_SESSION['prava'] == 0)
{
//přihlášený uživatel
}
elseif($_SESSION['prava'] == 1)
{
//admin
}
else
{
//nepřihlášený uživatel
}
« 1 2 »

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: