22. Administrační zóna

Administrační zónu můžeme vytvořit mnoha způsoby. Zde uvedený způsob je čerpán ze stránek - https://www.allphptricks.com/simple-user-registration-login-script-in-php-and-mysqli/

Byly však upraveny některé části souborů pro naše účely. Nicméně skript není připraven pro ostrý provoz, má bezpečnostní mezery a chybí např. ochrana proti SPAMu.

V první části vytvoříme v databázi tabulku, do které se budou registrovaní uživatelé ukládat. Tady je SQL skript:

CREATE TABLE IF NOT EXISTS uzivatele (
 id int(11) NOT NULL AUTO_INCREMENT,
 uzivatel varchar(50) NOT NULL,
 email varchar(50) NOT NULL,
 heslo varchar(50) NOT NULL,
 datum_reg datetime NOT NULL,
 PRIMARY KEY (id)
 );

Dále bude potřeba mít ve stejném adresáři soubor s přístupovými údaji do databáze - db.php (viz předcházející kapitoly)

Nyní si vytvoříme registrační formulář pro neregistrované (soubor registrace.php):

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Registrace</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<?php
// na začátku si načteme připojení k databázi, které musí existovat
require('db.php');
// Pokud je ve formuláři vloženo jméno uživatele, zašle jej do databáze.
if (isset($_REQUEST['uzivatel'])){
        // příkaz stripslashes odstraní případné zpětné lomítko ve jménu
	$username = stripslashes($_REQUEST['uzivatel']);
        // následující příkaz odstraní případné speciální znaky
	$username = mysqli_real_escape_string($spojeni,$username); 
	$email = stripslashes($_REQUEST['email']);
	$email = mysqli_real_escape_string($spojeni,$email);
	$password = stripslashes($_REQUEST['heslo']);
	$password = mysqli_real_escape_string($spojeni,$password);
	$datum_reg = date("Y-m-d H:i:s");
        $query = "INSERT into uzivatele (uzivatel, heslo, email, datum_reg)
VALUES ('$username', '".md5($password)."', '$email', '$datum_reg')";
        $result = mysqli_query($spojeni,$query);
        if($result){
            echo "<div class='form'>
<h3>Vaše registrace byla úspěšně dokončena.</h3>
<br/><a href='login.php'>Přihlášení</a></div>";
        }
    }
else{
?>
<div class="form">
<h1>Registrace</h1>
<form name="registrace" action="" method="post">
<input type="text" name="uzivatel" placeholder="Uživatelské jméno" required />
<input type="email" name="email" placeholder="Email" required />
<input type="password" name="heslo" placeholder="Heslo" required />
<input type="submit" name="submit" value="Registrovat" />
</form>
</div>
<?php } ?>
</body>
</html>

Dále to bude soubor pro přihlašování - login.php:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Přihlášení</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<?php
require('db.php');
session_start();
// Pokud je ve formuláři něco zadáno, zapíše se to do databáze.
if (isset($_POST['uzivatel'])){
	// příkaz stripslashes odstraní případné zpětné lomítko ve jménu
	$username = stripslashes($_REQUEST['uzivatel']);
        // následující příkaz odstraní případné speciální znaky
        $username = mysqli_real_escape_string($spojeni,$username);
	$password = stripslashes($_REQUEST['heslo']);
	$password = mysqli_real_escape_string($spojeni,$password);
	// následně se kontroluje, zda je zadán jak uživatel i heslo
        $query = "SELECT * FROM uzivatele WHERE uzivatel='$username'
and heslo='".md5($password)."'";
	$result = mysqli_query($spojeni,$query) or die(mysql_error());
	$rows = mysqli_num_rows($result);
        if($rows==1){
	    $_SESSION['uzivatel'] = $username;
            // přesměrování na index.php
	    header("Location: index.php");
         }else{
	echo "<div class='form'>
<h3>Uživatelské jméno nebo heslo je neplatné.</h3>
<br/><a href='login.php'>Přihlášení</a></div>";
	}
    }else{
?>
<div class="form">
<h1>Přihlášení</h1>
<form action="" method="post" name="login">
<input type="text" name="uzivatel" placeholder="Uživatelské jméno" required />
<input type="password" name="heslo" placeholder="Heslo" required />
<input name="submit" type="submit" value="Přihlásit" />
</form>
<p>Nejste zaregistrováni? <a href='registrace.php'>Registrujte se zde</a></p>
</div>
<?php } ?>
</body>
</html>

Dále je potřeba zajistit autentizaci přihlášeného uživatele přes session - soubor auth.php:

<?php
session_start();
if(!isset($_SESSION["uzivatel"])){
header("Location: login.php");
exit(); }
?>

Nyní si vytvoříme startovací stránku k přihlášení do administrace - index.php:

<?php
include("auth.php");
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vítejte</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="form">
<p>Je přihlášen uživatel - <?php echo $_SESSION['uzivatel']; ?>!</p>
<p>Toto je zabezpečená část webu.</p>
<p><a href="administrace.php">Administrace</a></p>
<a href="logout.php">Odhlásit</a>
</div>
</body>
</html>

Následuje stránka určená pro administraci webu - administrace.php:

<?php
require('db.php');
include("auth.php");
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Administrační zóna</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="form">
<p>Toto je administrační část webu.</p>
<p><a href="index.php">Titulní strana</a></p>
<a href="logout.php">Odhlášení</a>
</div>
</body>
</html>

Dále potřebujeme stránku pro odhlášení - logout.php:

<?php
session_start();
// vymazání celé session
if(session_destroy())
{
// přesměrování na stránku s přihlášením
header("Location: login.php");
}
?>

Tady je ještě kaskádový styl - soubor style.css:

body {
     font-family:Arial, Sans-Serif;
}
.clearfix:before, .clearfix:after{
     content: "";
     display: table;
}
.clearfix:after{
     clear: both;
}
a{
     color:#0067ab;
     text-decoration:none;
}
a:hover{
     text-decoration:underline;
}
.form{
     width: 300px;
     margin: 0 auto;
}
input[type='text'], input[type='email'],
input[type='password'] {
     width: 200px;
     border-radius: 2px;
     border: 1px solid #CCC;
     padding: 10px;
     color: #333;
     font-size: 14px;
     margin-top: 10px;
}
input[type='submit']{
     padding: 10px 25px 8px;
     color: #fff;
     background-color: #0067ab;
     text-shadow: rgba(0,0,0,0.24) 0 1px 0;
     font-size: 16px;
     box-shadow: rgba(255,255,255,0.24) 0 2px 0 0 inset,#fff 0 1px 0 0;
     border: 1px solid #0164a5;
     border-radius: 2px;
     margin-top: 10px;
     cursor:pointer;
}
input[type='submit']:hover {
     background-color: #024978;
}

Zde najdete demo