Ještě než se pustíme do vytváření vlastního administračního rozhraní weblogu, musíme zajistit registraci autorů a také jejich přihlašovaní a odhlašování, které je vyřešeno prostřednictvím sessions.

Hotovou aplikaci si můžete prohlédnout a vyzkoušet.

Registrace autorů

Registraci zajišťuje soubor reg.php. Přestože je HTML formulář až na samém konci souboru, zmíním se o něm již nyní. Od autora budeme vyžadovat tyto údaje: login (uživatelské jméno), heslo (2x), skutečné jméno a email. Aby uživatel nemusel po chybném odeslání formuláře vyplňovat vše znovu, vložíme do atributů value kratičké kódy:

<h2 class=“heading“>Weblog – registrace autorů</h2>
<div class=“form“>
  <form action=“reg.php“ method=“post“>
  <input type=“hidden“ name=“sent“ value=““>
  <div class=“formrow“>
    <div class=“formdesc“>Login</div><div class=“forminput“><input type=“text“ name=“login“ size=“30″ value=“<?php if(IsSet($login)) echo $login ?>“ maxlength=“10″></div>
  </div>
  <div class=“formrow“>
    <div class=“formdesc“>Heslo</div><div class=“forminput“><input type=“password“ name=“password“ size=“30″ maxlength=“10″></div>
  </div>
  <div class=“formrow“>
    <div class=“formdesc“>Heslo znovu</div><div class=“forminput“><input type=“password“ name=“password_2″ size=“30″ maxlength=“10″></div>
  </div>
  <div class=“formrow“>
    <div class=“formdesc“>Jméno</div><div class=“forminput“><input type=“text“ name=“name“ size=“30″ value=“<?php if(IsSet($name)) echo $name ?>“ maxlength=“30″></div>
  </div>
  <div class=“formrow“>
    <div class=“formdesc“>Email</div><div class=“forminput“><input type=“text“ name=“email“ size=“30″ value=“<?php if(IsSet($email)) echo $email ?>“ maxlength=“30″></div>
  </div>
  <div class=“formrowsubmit“>
    <input type=“submit“ name=“send“ value=“Registrovat“ class=“submit“>
  </div>
</div>
</form>

Všechny chybové i jiné hlášky umístíme do souboru msg.php do dvou polí $msg_error a $msg_message. Ve všech skriptech pak stačí uvést jen číslo příslušné chyby:

// chybove a dalsi hlasky
$msg_error = Array(‚Chybně zadané údaje.‘,
         ‚Musíte vyplnit obě položky.‘,
         ‚Časový limit vypršel, přihlašte se znovu.‘,
         ‚Přihlašte se prosím.‘,
         ‚Musíte vyplnit oba údaje.‘,
         ‚Datum vydání nesmí být menší než aktuální datum.‘,
         ‚Musíte vyplnit všechny údaje.‘,
         ‚Neplatná emailová adresa.‘,
         ‚Heslo nebylo zadáno správně.‘,
         ‚Toto uživ. jméno již existuje, vyberte si prosím jiné.‘);
$msg_message = Array(‚Byl(a) jste odhlášen(a).‘,
           ‚Článek byl přidán.‘,
           ‚Článek byl smazán.‘,
           ‚Článek byl upraven.‘,
           ‚Článek nelze smazat.‘,
           ‚Článek nelze upravit.‘,
           ‚Byl(a) jste úspěšně zaregisrován(a) a přihlášen(a).‘);

Pokud byl formulář odeslán, musíme nejprve zkontrolovat, zda byly vyplněny všechny povinné údaje. Pokud ne, vložíme do pole $error číslo příslušné chyby. Obdobně se postupuje i v dalších podmínkách, kde postupně kontrolujeme platnost emailové adresy, rovnost hesel a také to, jestli náhodou zvolený login již neexistuje:

require „msg.php“; // chybove hlasky a zpravy
// byl odeslan formular ?
if(IsSet($_POST[‚sent‘])) {      
  $login = $_POST[‚login‘];
  $password = $_POST[‚password‘];
  $password_2 = $_POST[‚password_2‘];
  $name = $_POST[‚name‘];
  $email = $_POST[‚email‘];
  // byly vyplneny vsechny povinne udaje ?
  if($login==““ || $password==““ || $password_2==““ || $email==““ || $name==““) {
    $error[] = 6;
  }
  
  // pokud byl zadan email, zkontroluje jeho platnost
  if($email != „“ && (!EregI(„^[a-z0-9]+[a-z0-9\._-]*@[a-z0-9]+[a-z0-9\._-]*\.[a-z]{2,10}$“, $email) || EregI(„\.{2,}“, $email) || EregI(„_{2,}“, $email) || EregI(„-{2,}“, $email))) {
    $error[] = 7;
  }
  // rovnaji se hesla ?
  if($password!=$password_2) {
    $error[] = 8;
  }
  
  require(„../db.php“);  // pripoji k databazi
  // existuje zadany login ?
  $query = @MySQL_Query(„SELECT login FROM author WHERE login LIKE ‚$login'“) or Weblog_Error(2);
  if(MySQL_Num_Rows($query) != 0) {
    $error[] = 9;
  }

Pokud je vše v pořádku, můžeme se pustit do samotné registrace. Heslo funckí MD5() zakódujeme a společně s dalšími údaji vložíme do databáze. Následně provedeme přihlášení autora, a to pomocí sessions. Do session nazvané auth vložíme všechny potřebné informace (id autora, jméno, email a čas, po který bude session platná – v našem případě 30 minut). Na závěr pak autora přesměrujeme do administrační části.

  // vse je v poradku, muzeme provest registraci a prihlaseni
  if(!IsSet($error)) {
    $password = MD5($password);
    $query = @MySQL_Query(„INSERT INTO author VALUES (“, ‚$login‘, ‚$password‘, ‚$name‘, ‚$email‘, ‚U‘)“) or Weblog_Error(2);
    
    // prihlaseni pomoci session
    Session_Start();
    $_SESSION[‚auth‘] = Array(
    ‚id‘ => $user_id = MySQL_Insert_ID(),
    ‚user_type‘ => ‚U‘,
    ‚name‘ => $name,
    ‚email‘ => $email,
    ‚time‘ => Time()+1800
    );
    
    MySQL_Close();
    
    // presmerovani do administracni casti
    $message = 6;
    Header(‚Location: http://‘. $_SERVER[‚HTTP_HOST‘] . ‚/weblog/admin/index.php?message=‘ . $message . ‚&‘ . SID);
    exit;
  }
  MySQL_Close();
}

V případě, že byla zaznamenána nějaká chyba, musíme ji pochopitelně vypsat:

// chybove hlasky
if(IsSet($error)) for($i=0;$i<Count($error);$i++) echo ‚<p class=“error“>‘ . $msg_error[$error[$i]] . ‚</p>‘;

Přihlášení autorů

Přihlášení provedeme pomocí souboru login.php. Formulář je znovu velmi jednoduchý, od autora potřebujeme pouze jeho login a heslo.

<div class=“form“>
  <form action=“login.php“ method=“post“>
  <input type=“hidden“ name=“sent“ value=““>
  <div class=“formrow“>
    <div class=“formdesc“>Login</div><div class=“forminput“><input type=“text“ name=“login“ size=“30″ value=“<?php if(IsSet($login)) echo $login; ?>“ maxlength=“50″></div>
  </div>
  <div class=“formrow“>
    <div class=“formdesc“>Heslo</div><div class=“forminput“><input type=“password“ name=“password“ size=“30″ maxlength=“10″></div>
  </div>
  <div class=“formrowsubmit“>
    <input type=“submit“ name=“send“ value=“Přihlaš“ class=“submit“>
  </div>
</div>
</form>

Po odeslání formuláře zkontrolujeme, zda byly vyplněny obě položky. Následně zjistíme, jestli se zadaný login a heslo nachází v databázi. Pokud ano, můžeme provést přihlášení a přesměrování do administrační části.

require „msg.php“; // chybove hlasky a zpravy
// byl odeslan formular ?
if(IsSet($_POST[‚sent‘])) {
  $login = $_POST[‚login‘];
  $password = $_POST[‚password‘];
  
  // byly zadany oba udaje (login, heslo) ?
  if($login != „“ && $password !=““) {
    require „../db.php“;  // pripoji k databazi
    $password = MD5($password);
    // vybere autora
    $query = @MySQL_Query(„SELECT id, name, email, user_type FROM author WHERE (login LIKE ‚$login‘) AND (password LIKE ‚$password‘)“) or Weblog_Error(2);
    
    // prihlaseni autora pomoci session
    if($result = MySQL_Fetch_Array($query)) {
      Session_Start();
      // do session se ulozi id, typ (A nebo U), jmeno a email autora + doba, po kterou bude session platna (30 min)
      $_SESSION[‚auth‘] = Array(
      ‚id‘ => $result[‚id‘],
      ‚user_type‘ => $result[‚user_type‘],
      ‚name‘ => $result[‚name‘],
      ‚email‘ => $result[‚email‘],
      ‚time‘ => Time()+1800
      );
      MySQL_Close();
      
      // presmerovani do administracni casti
      Header(‚Location: http://‘. $_SERVER[‚HTTP_HOST‘] . ‚/weblog/admin/index.php?‘ . SID);
    } else {
      // chybne zadane udaje
      $error = 0;
      MySQL_Close();
    }
  } else {
    // nebyly zadany oba udaje
    $error = 1;  
  }
}

Pokud něco neproběhlo správně, musíme vypsat chybovou hlášku:

// chybove hlasky a zpravy
if(IsSet($_GET[‚error‘])) $error = $_GET[‚error‘];
if(IsSet($error) && IsSet($msg_error[$error])) echo  ‚<p class=“error“>‘ . $msg_error[$error] . ‚</p>‘;
if(IsSet($message) && IsSet($msg_message[$message])) echo ‚<p class=“message“>‘ . $msg_message[$message] . ‚</p>‘;

Odhlášení autorů

Přihlášení autorů není jediná funkce, kterou plní soubor login.php. Kromě přihlášení můžeme provést i odhlášení autora, a to v případě že login.php zavoláme například takto (login.php?logout=yes):

// odhlaseni autora
if(IsSet($_GET[‚logout‘])) {
  Session_Start();
  Session_Destroy();
  $message = 0;
}

Kontrola přihlášení

Do všech souborů, kde vyžadujeme přihlášení (např. index.php, update.php), musíme vložit soubor checklogin.php, který zkontroluje, zda je autor skutečně přihlášen. Pokud ne, provede se přesměrování na stránku login.php. Může však nastat ještě jeden problém, autor je sice přihlášen, ale víc jak 30 minut není aktivní, takže se musí přihlásit znovu.

Session_Start();
// pokud je autor prihlasen, vlozime do prislusnych promennych informace ze session
if (IsSet($_SESSION[‚auth‘])) {
  $user_id = $_SESSION[‚auth‘][‚id‘];
  $user_type = $_SESSION[‚auth‘][‚user_type‘];
  $name = $_SESSION[‚auth‘][‚name‘];
  $email = $_SESSION[‚auth‘][‚email‘];
  $time = $_SESSION[‚auth‘][‚time‘];
  
  // pokud je autor vice nez 30 min neaktivni, musi se prihlasit znovu; jinak se aktualizuje cas v session
  if ($time < Time()) {
    $error = 2;
    Session_Destroy();
    Header(‚Location: http://‘. $_SERVER[‚HTTP_HOST‘] . ‚/weblog/admin/login.php?error=‘ . $error);
    exit;
  } else {
    $_SESSION[‚auth‘][‚time‘] = Time()+1800;
  }
} else {
  // autor neni prihlasen
  $error = 3;
  Header(‚Location: http://‘. $_SERVER[‚HTTP_HOST‘] . ‚/weblog/admin/login.php?error=‘ . $error);
  exit;
}

Z uvedeného příkladu je vidět, že práce se sessions je poměrně snadná a rychlá. Přihlášení lze samozřejmě ještě vylepšit, například kontrolou IP adresy. Příště začneme s vlastním administračním rozhraním.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

6 Příspěvků v diskuzi

  1. Vpohode navod… netreba slov kdyz rozumis kodu
    ale je pravda ze pokud nerozumis, tak se to na tomhle navodu nenaucis..

  2. rozumím kodů a stejnak to je težký pochopit chtělo by to popsat stručně co máme vytvořit jesli php atd … alebo aspon uplouad ke stažení a už jen u sebe v kódech to změnit .. hlavička chybí … nepřehled mezi css a php když už tak jse dává script z html a né css to jsem teda nepochopil mno ale budíš ? :O

  3. v nějakých html editorů to nejede … tak spíš abyste rozdělili php,css a html aby jse to jen skopírovalo tam kam má bylo by to lepší a pro ty který tomu nerozumí by to bylo aspon o něco lehčí :)

  4. Nechapete o tuto návodu? A můžete snadno zaheslování na stránku:
    Tady to je příklady zaheslování stránek:

    Zadej heslo:

    Vítejte v Morii!
    … další tajný text

    Pokudte o něčemu nebudeš rozumět, obratte nas na zacek13@email.cz . Díky

Odpovědět