Tipy a Triky - PHP & MySQL

Hodnocení kvality
Autor: CrossXXX
Pro funkčnost celého systému budeme potřebovat dvě MySQL tabulky, první z nich - users, pro ukládání informací o uživatelích. Do id se ukládá id uživatele, které se automaticky zvětšuje, což zajistíme vlastností auto_increment. Účel ostatních položek je zřejmý - login pro přihlašovací jméno, password pro heslo zakódované v MD5, name pro jméno uživatele a email překvapivě pro jeho email. Tabulku vytvoříme tímto MySQL příkazem

CREATE TABLE users
(
id int(2) NOT NULL auto_increment,
login varchar(20) NOT NULL default '',
password varchar(32) NOT NULL default '',
name varchar(80) NOT NULL default '',
email varchar(80) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY id (id)
);

Druhá z nich - autorizace, slouží pro samotný systém autorizace. Do id se ukládá id session, do date se ukládá datum ve formátu počtu sekund od roku 1970, jak je v PHP obvyklé. Tabulku vytvoříme tímto MySQL příkazem

CREATE TABLE autorizace
(
id varchar(80) NOT NULL default '',
date int(10) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY id (id)
);

Prvním scriptem je registrace.php

<?
Header("Pragma: No-cache");
Header("Cache-Control: No-cache, Must-revalidate");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");

$MC = MySQL_Connect("server", "username", "password");
$MS = MySQL_Select_DB("db");

If (($email != "") AND ($password != "") AND ($login != "") AND ($name != "")):
$MSQ = MySQL_Query("SELECT * FROM users WHERE login LIKE '$login'");
If (MySQL_Num_Rows($MSQ) > 0):
$login = "";
$error = "<h4>Login již existuje!!!</h4>";
$f = "true";
Else:
$p = MD5($password);
$MSQ = MySQL_Query("INSERT INTO users VALUES (NULL, '$login', '$p', '$name', '$email')");
$m = "true";
$x = StrLen($password);
Endif;

Elseif (IsSet($send)):
$error = "<h4>Chybí povinné údaje!!!</h4>";
Endif;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Registrace nového uživatele</title>
</head>

<body>
<h3 align="center">Registrace nového uživatele</h3>
<?
If ((IsSet($error)) OR (!IsSet($send))):
echo $error;
?>
<form method="post" action="registrace.php">
<input type="Hidden" name="send" value="true">
<table>
<tr>
<td>Login:</td>
<td><input type="Text" name="login" size="40" maxlength="20" value="<?echo $login;?>"></td>
</tr>
<tr>
<td>Heslo:</td>
<td><input type="Password" name="password" size="40" maxlength="20" value=""></td>
</tr>
<tr>
<td>Emailová adresa:</td>
<td><input type="Text" name="email" size="40" maxlength="80" value="<?echo $email;?>"></td>
</tr>
<tr>
<td>Jméno:</td>
<td><input type="Text" name="name" size="40" maxlength="80" value="<?echo $name;?>"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="Submit" value="Zaregistrovat">
</td>
</tr>
</table>
</form>
<?Elseif (IsSet($m)):?>
Byl(a) jste úspěšně zaregistrován(a) s těmito údaji:<br><br>
<b>Přihlašovací jméno</b>: <?echo $login;?><br>
<b>Heslo</b>: <?For ($i = 1; $i <= $x; $i++): echo "*"; Endfor;?><br>
<b>Jméno</b>: <?echo $name;?><br>
<b>Emailová adresa</b>: <?echo $email;?>
<?Endif;?>
</body>
</html>
<?MySQL_Close($MC);?>

Nyní si popíšeme činnost scriptu. Uživatel se zaregistruje, při registraci uvede přihlašovací jméno, heslo (z bezpečnostních důvodů ho budeme do databáze ukládat zakódované v MD5), jméno, emailovou adresu a formulář odešle. Rozhodovací struktura hned na začátku zjistí, zda byly vyplněny všechny položky. V případě, že byly, script ověří, zda v databázi není uživatel se stejným přihlašovacím jménem, pokud je, script uloží do proměnné $error chybovou hlášku a zinicializuje proměnnou $f, která způsobí zobrazení formuláře, pokud script uživatele se stejným přihlašovacím jménem nenajde, uloží všechny údaje (heslo v zakódované podobě) do databáze, zinicializuje proměnnou $m a do proměnné $x uloží délku hesla. Místo formuláře se zobrazí zpráva o registraci, to způsobí proměnná $m. Všechny údaje se vypíší, heslo je vypsáno pomocí cyklu For, který proběhne tolikrát, kolik má heslo znaků. Vypisování hvězdiček je kosmetická záležitost, pokud budete chtít, můžete si ji samozřejmě odstranit. V případě, že všechny údaje nebyly vyplněny uloží první rozhodovací struktura do proměnné $error chybovou hlášku a zobrazí formulář.

Dalším scriptem je autorizace.php

<?
Header("Pragma: No-cache");
Header("Cache-Control: No-cache, Must-revalidate");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");

$MC = MySQL_Connect("server", "username", "password");
$MS = MySQL_Select_DB("db");

If ((IsSet($login)) AND (IsSet($password))):
$p = MD5($password);
$MSQ = MySQL_Query("SELECT * FROM users WHERE (login LIKE '$login') AND (password LIKE '$p')");

If (MySQL_Num_Rows($MSQ) <> 1):
echo "Neautorizovaný přístup";
Exit;

Else:
$SN = "autorizace";
Session_name("$SN");
Session_start();
$sid = Session_id();
$time = Date("U");
$at = Date("U") - 1800;

$MSQ = MySQL_Query("INSERT INTO autorizace VALUES ('$sid', $time)");
$MSQ = MySQL_Query("DELETE FROM autorizace WHERE time < $at");
Endif;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Autorizace</title>
</head>

<body>
Samotný obsah stránky, který se zobrazí při úspěšném přihlášení
<?
Elseif (IsSet($lo)):

$SN = "autorizace";
Session_name("$SN");
Session_start();
$sid = Session_id();

$MSQ = MySQL_Query("DELETE FROM autorizace WHERE id = '$sid'");
echo "Byl(a) jste odhlášen(a)!";
Else:
?>
<form action="autorizace.php" method="post">
<input type="Text" name="login">
<br>
<input type="Password" name="password">
<br>
<input type="Submit" value="Přihlaš">
</form>
<?Endif;?>
</body>
</html>
<?MySQL_Close($MC);?>

Script napřed zobrazí formulář pro zadání přihlašovacích údajů, protože předchozí podmínky nebyly splněny. Po zadání údajů a odeslání formuláře se ověří v db, jestli uživatel zadal oba údaje správně a pokud ano, je pomocí Session_name nastaveno jméno session na autorizace, pomocí Session_start je session spuštěna a pomocí Session_id je její id uloženo do proměnné $sid. Tato proměnná je následovně spolu s počtem sekund od roku 1970 uložena do db. Poslední MySQL příkaz zajistí vymazání starých údajů z db. Pokud budete chtít umožnit uživatelům odhlášení ze systému, vložte někam na stránky odkaz <a href="autorizace.php?lo=true">Odhlásit se</a>. V případě, že uživatel spustí script autorizace.php se zinicializovanou proměnnou $lo, vymažeme pomocí několika řádku za podmínkou Elseif (IsSet($lo)) záznam o session z databáze a zobrazíme zprávu o odhlášení.

Třetím a posledním scriptem je at.php

<?
$MC = MySQL_Connect("server", "username", "password");
$MS = MySQL_Select_DB("db");

$SN = "autorizace";
Session_name("$SN");
Session_start();
$sid = Session_id();
$date = Date("U");
$ad = Date("U") - 300;

$MSQ = MySQL_Query("SELECT * FROM autorizace WHERE (id = '$sid') AND (date >= $ad)");

If (MySQL_Num_Rows($MSQ) <> 1):
echo "Neautorizovaný přístup";
Exit;
Else:
$MSQ = MySQL_Query("UPDATE autorizace SET date = $date WHERE id = '$sid'");
Endif;
MySQL_Close($MC);
?>

Tento script se bude includovat do každé stránky a proto neobsahuje standardní HTML tagy <html></html>, <head></head>, <title></title> a <body></body>. Funguje tak, že nastaví pomocí Session_name jméno session na autorizace, poté je session spuštěna pomocí Session_start a do $sid je pomocí Session_id uloženo její id. Potom zjistíme, jestli je její id uloženo v db - pokud ne, vypíšeme chybovou hlášku a ukončíme script příkazem Exit, pokud ano, zaktualizujeme čas poslední akce v db.

  « Zpět na předchozí stránku
« Copyright © 2002 - 2017  Honza Petr | Reklama - Kontakt | Připojeno přes Kraja.cz | [ochrana osobních údajů] | RSS | Mapa webu »
Partneři: | Parabola | Povinné ručení | půjčky bez potvrzení příjmu Domény a webhosting půjčky bez registru inzeráty zdarma | hosting