Aplikace pro registraci uživatelů se hodí vždy, pokud chceme nabídnout personalizaci (vlastní nastavení vzhledu ap.), nabízíme službu pro uživatele nebo třeba pořádáme soutěž. podívejme se, jak ji připravit právě v PHP.

Naše aplikace je doplňkem k Vlastní přesměrovací službě, je ovšem jednoduché upravit strukturu tabulky, ukládací skript a formulář podle potřeby. Úkolem aplikace je založit uživatelský účet chráněný heslem a případně uložit některé další údaje nebo nastavení. Při ukládání údajů o uživateli je potřeba mít na zřeteli §178 Trestního zákona (Neoprávněné nakládání s osobními údaji). Aplikace využívá kompatibilnějšího kódování ISO-8859-2. Vyzkoušejte si ukázku.

Nejprve si vytvoříme tabulku v databázi, ve které budou přihlašovací údaje a údaje pro přesměrovací službu. Oproti tabulce v článku přesměrovací služby je zde heslo ukládáno jako otisk zašifrovaný algoritmem MD5 a je doplněna nová položka pro možnost volby, zda má přesměrovací služba vložit odkazovanou stránku do rámce nebo jen přesměrovat. Chcete-li ji použít pro původní službu, je třeba lehce upravit i skript přesměrovací služby, aby možnost volby skrytí do rámce nebo přesměrování byla funkční. Povšimněte si unikátního klíče nastaveného pro uživatelské jméno.

CREATE TABLE redirect (
  id int(11) NOT NULL auto_increment,
  user varchar(128) NOT NULL default “,
  email varchar(128) NOT NULL default “,
  password varchar(32) NOT NULL default “,
  url varchar(255) NOT NULL default “,
  title varchar(255) NOT NULL default “,
  cloak enum(‚Y‘,’N‘) NOT NULL default ‚Y‘,
  PRIMARY KEY  (id),
  UNIQUE KEY user (user),
  UNIQUE KEY id (id),
)

Nyní se podíváme na funkci ukládacího skriptu – ten převezme data z registračního formuláře, jehož popis si necháme na konec. Je v něm již využit nový způsob přístupu k parametrům předávaným do skriptu, v PHP verze nižší než je 4.1 nebude funkční (případně je nutné skript upravit). Celá aplikace využívá nastavení v souboru config.php a skript pro připojení k databázi.

config.php (nastavení aplikace)

<?php
$now = gmdate(‚D, d M Y H:i:s‘) . ‚ GMT‘;  // zamezení cachování aplikace
header(‚Expires: 0‘); // rfc2616
header(‚Last-Modified: ‚ . $now);
header(‚Cache-Control: no-store, no-cache, must-revalidate‘); // HTTP/1.1
header(‚Cache-Control: pre-check=0, post-check=0, max-age=0‘); // HTTP/1.1
header(‚Pragma: no-cache‘); // HTTP/1.0
set_magic_quotes_runtime(1); // nastavit automatické přidávání zpětných lomítek do údajů předáváných z formulářů
?>

opendb.php (připojení k databázi)

<?php
$conn = @mysql_connect("dbserver.cz", "uzivatel","heslo");
if (!@mysql_select_db("databaze", $conn))
{ // skrýt chybu a ukončit aplikaci, pokud se nepodaří připojit k databázi
  echo "<big><pre><b>Omlouváme se, probíhá údržba serveru…</b></pre></big>";
  exit;
}
?>

register.php

<?php
$_POST[‚user‘] = htmlspecialchars(StrToLower($_POST[‚user‘])); // překonvertovat registrační údaje na malé znaky a převést speciální HTML znaky
$_POST[‚email‘] = htmlspecialchars(StrToLower($_POST[‚email‘]));
$_POST[‚url‘] = htmlspecialchars(StrToLower($_POST[‚url‘]));
$_POST[‚title‘] = htmlspecialchars(StrToLower($_POST[‚title‘]));
if (!empty($_POST[‚yes‘]) && !empty($_POST[‚user‘]) && !empty($_POST[‚email‘]) && !empty($_POST[‚url‘]) && !empty($_POST[‚title‘]) && !empty($_POST[‚passw1‘]) && !empty($_POST[‚passw2‘]))
{ // ověření vyplnění údajů
  $_POST[‚passw1‘]=htmlspecialchars($_POST[‚passw1‘]); // převést speciální znaky v hesle na entity
  $_POST[‚passw2‘]=htmlspecialchars($_POST[‚passw2‘]);
  if ($_POST[‚passw1‘]!=$_POST[‚passw2‘])
  { // otestovat, zda je heslo zadáno správně
    echo "<b>Zadaná hesla si neodpovídají!</b><br />"; // při chybě vypsat hlášení a znovu registrační formulář
    include("handle/regform.php");
}
else
{ // zapsat do databáze
  if (StrToUpper($_POST[‚cloak‘]) == ‚N‘) // nastavit službě příznak přesměrování/skrytí do rámce
    $cloak_stat= ‚N‘;
  else
    $cloak_stat= ‚Y‘;
  // vložit do tabulky, heslo se kóduje pomocí MD5
  $register=mysql_query("INSERT INTO redirect (user, email, password, url, title, cloak)
VALUES (‚".$_POST[‚user‘]."‘, ‚".$_POST[‚email‘]."‘, ‚".md5($_POST[‚passw1′])."‘, ‚".$_POST[‚url‘]."‘, ‚".$_POST[‚title‘]."‘, ‚$cloak_stat‘)");
  if ($register)
  { // registrace proběhla v pořádku
    echo "<b>Registrace uživatele ".$_POST[‚user‘]." provedena.</b><br />";
    echo "<b><a href=\"regedit.php\">Přihlásit</a></b><br />"; // odkaz na přihlášení nově registrovaného uživatele do aplikace
  }
  else // došlo k chybě
    if (mysql_errno() == 1062) // duplicitní jméno uživatele
    {
      echo "<b>Uživatel ".$_POST[‚user‘]." je již registrovaný, zvolte jiné jméno</b><br />";
      include("handle/regform.php"); // znovu registrační formulář
    }
   else // došlo k jiné chybě při ukládání údajů
     echo "<b>Chyba při ukládání údajů!</b><br />";
  }
}
else // ukončení ověření, zda je vše zadáno
{
  echo "<b>Chybí některý údaj!</b><br />";
  include("handle/regform.php"); // znovu registrační formulář
}
?>

Registrační skript převezme parametry z formuláře (ty jsou díky direktivě v config.php ošetřeny na nebezpečné znaky přidáním zpětných lomítek), převede je na malé znaky a speciální HTML znaky převede na entity (jinak by mohl kdokoli aplikaci bortit vkládáním kódu do registračního formuláře). Ověří se, zda jsou zadány všechny potřebné údaje (včetně souhlasu s registračními podmínkami) a zda se shodují obě zadávaná hesla. Pokud ne, vypíše se hlášení a registrační formulář pro opravu. Hesla se na malé znaky nepřevádějí, aby heslo bylo tzv. case-sensitive. Je-li vše vpořádku, předají se údaje do SQL dotazu, heslo je zde zakódováno funkcí MD5.

Po provedení dotazu se vyhodnotí jeho provedení. Pokud došlo k chybě, ověří se, zda návratový kód není 1062, což znamená, že došlo k pokusu o vložení jména uživatele, které již je registrováno – vypíše se upozornění a znovu registrační formulář pro opravu. Pokud jde o jinou chybu, vypíše se jen hlášení.

Pokud chybí některý z potřebných zadávaných údajů, skript dále nepokračuje, vypíše se chybové hlášení a zobrazí se registrační formulář pro opravu.

Nyní se podíváme na samotný registrační formulář. Vstup do registračního formuláře je přes stránku s podmínkami, s kterými musí uživatel potvrdit souhlas.

regform.php

<script language="JavaScript" type="text/javascript" src="handle/formcheck.js"></script> // skript pro ověření zadaných údajů
<?php
if ($_POST[‚yes‘] == 1) // ověření souhlasu s podmínkami
{
?>
<fieldset>
<legend> registrovat vlastní doménu <br /></legend>
<form name="regform" action="index.php?app=register" method="POST" onSubmit="return zkontroluj_formular(this);">
<table border="0" cellspacing="5" cellpadding="0">
<tr>
  <td align="right"><input type="hidden" name="yes" value="<?php echo $_POST[‚yes‘] ?>" />titulek stránek:</td>
  <td><input type="text" class="sform" name="title" value="<?php echo StripSlashes($_POST[‚title‘]) ?>" size="30" autocomplete="off" /></td>
</tr>
<tr>
  <td align="right">URL:</td>
  <td><input type="text" class="sform" name="url" value="<?php echo (empty($_POST[‚url‘])) ? "http://" : StripSlashes($_POST[‚url‘]) ?>" size="30" autocomplete="off" /></td>
</tr>
<tr>
  <td align="right">e-mail:</td>
  <td><input type="text" class="sform" value="<?php echo (empty($_POST[‚email‘])) ? "@" : StripSlashes($_POST[‚email‘]) ?>" name="email" size="30" /></td>
</tr>
<tr>
  <td align="right">&nbsp;</td>
  <td><input type="checkbox" class="sform" value="N" name="cloak" <?php echo ($_POST[‚cloak‘] == "N") ? "checked" : "" ?> />neskrývat skutečnou adresu</td>
</tr>
</table>
<br />
<table border="0" cellspacing="5" cellpadding="0">
<tr>
  <td align="right">uživatelské jméno {doména*):</td>
  <td><input type="text" class="sform" name="user" value="<?php echo StripSlashes($_POST[‚user‘]) ?>" size="20" autocomplete="off" /></td>
</tr>
<tr>
  <td align="right">heslo:</td>
  <td><input type="password" class="sform" name="passw1" size="20" autocomplete="off" /></td>
</tr>
<tr>
  <td align="right">ověření hesla:</td>
  <td><input type="password" class="sform" name="passw2" size="20" autocomplete="off" /></td>
</tr>
<tr>
  <td colspan="2" align="right"><input type="submit" value="Registrovat" class="tlac" /></td>
</tr>
</table>
</form>
&nbsp;* pouze alfanumerické znaky bez diakritiky, bez mezer, podržítek a speciálních znaků
</fieldset>
<?php
}
else
echo "Bohužel jste nepotvrdil(a) souhlas s <a href=\"index.php\">podmínkami</a>.";
?>

Ve formuláři je kontrola potvrzení souhlasu s podmínkami, kontrola zadaných údajů JavaScriptem, kontrola správně zadané e-mailové adresy a u choulostivých polí je deaktivovaná funkce autocomplete – popis těchto skriptů naleznete také zde na Intervalu. Pokud je formulář zobrazen z registračního skriptu v důsledku chyby, hodnoty polí formuláře jsou vypsány pro snadnou možnost opravy. U některých polí je tento výpis podmíněný, pokud hodnota není dostupná (tj. i při prvním zobrazení formuláře), je zobrazena nápověda nebo např. znak @ v poli pro e-mail. Tyto údaje jsou před vypsáním zbaveny případných přidaných zpětných lomítek pomocí funkce StripSlahes. Hesla se při chybě nezobrazují, uživatel je musí zadat vždy znovu.

Ve vstupní stránce je navíc přidaná část pro zobrazení počtu registrovaných uživatelů:

<?php
$num_users = mysql_fetch_row(mysql_query("SELECT COUNT(id) FROM redirect"));
echo $num_users[0];
?>

V pokračování si ukážeme jednochou možnost přihlašování uživatele s možností editace zadaných údajů. Skripty celé aplikace, včetně hlavního index.php, do kterého se jednotlivé skripty bezpečným způsobem vkládají, si můžete stáhnout.

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

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

4 Příspěvků v diskuzi

  1. u me to funguje bezproblemu, jen query pro vytvoreni DB jsem musel upravit:

    CREATE TABLE `redirect` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `user` VARCHAR(40) COLLATE cp1250_czech_cs NOT NULL DEFAULT “,
    `email` VARCHAR(20) COLLATE cp1250_czech_cs NOT NULL DEFAULT “,
    `password` VARCHAR(30) COLLATE cp1250_czech_cs NOT NULL DEFAULT “,
    `url` VARCHAR(30) COLLATE cp1250_czech_cs NOT NULL DEFAULT “,
    `title` VARCHAR(50) COLLATE cp1250_czech_cs NOT NULL DEFAULT “,
    `cloak` ENUM (‚Y‘, ‚N‘) NOT NULL DEFAULT ‚Y‘,

    PRIMARY KEY (`id`),
    UNIQUE KEY `USER` (`USER`),
    UNIQUE KEY `id` (`id`)
    )

Odpovědět