Jednoduché přihlášení v PHP a MySQL

Kapitoly:

Nejdříve si v databázi vytvoříme pomocí phpMyAdmin (nebo Adminer) tabulku, kterou pojmenujeme uzivatele. Bude obsahovat čtyři sloupce id, login, heslo, email:

  • id
    • INT(5)
  • login
    • VARCHAR(40)
  • heslo
    • VARCHAR(32)
  • emal
    • VARCHAR(50)

Databáze

Vykonejme tedy tento SQL dotaz, který nám vytvoří vše výše popisované:

CREATE TABLE IF NOT EXISTS `uzivatele` (
 `id` int(5) NOT NULL auto_increment,
 `login` varchar(40) NOT NULL,
 `heslo` varchar(32) NOT NULL,
 `email` varchar(50) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Tím jsme si vytvořili tabulku uzivatele se sloupci id, login, heslo a email.

registrace.php

Nyní si otevřeme textový editor (např. PSPad, Notepad++, Sublime text…), vytvoříme nový PHP dokument, který pojmenujeme registrace.php a vložíme do něj velmi jednoduchý skript pro registraci:

<?php
include "connect.php";/* připojení k databázi - budeme se tomu věnovat níže... */
if(isset($_POST['submit'])) {
 $nick = mysql_real_escape_string($_POST['nick']);
 $heslo = mysql_real_escape_string($_POST['heslo']);
 $over_heslo = mysql_real_escape_string($_POST['over_heslo']);
 $md5_heslo = md5($heslo);
 $email = mysql_real_escape_string($_POST['email']);
 /* Nyní ověříme, zda byly zadané všechny potřebné údaje (registračnímu formuláři se budeme věnovat níže) */
 $user_check = mysql_query("SELECT login FROM uzivatele WHERE login='".$nick."'");
 if($nick==""){echo"Nebyl vyplněn nick!";}
 else if(mysql_num_rows($user_check)){echo"Tento nick používá již jiný uživatel.";}
 else if($heslo==""){echo"Nebylo vyplněno heslo";}
 else if($over_heslo==""){echo"Nebylo vyplněno ověřovací heslo";}
 else if($heslo!=$over_heslo){echo"Vyplněná hesla se neshodují";}
 else if($email==""){echo"Nebyl vyplněn email";}
 else{
 $sql= mysql_query("INSERT INTO uzivatele VALUES ('','$nick','$md5_heslo','$email')") or die(mysql_error());
 echo"Registrace byla úspěšně dokončena!";
 }
}
?>

 

Do téhož souboru ještě připíšeme přihlašovací formulář (na konec souboru vložte):

<form action="#" method="post"> 
<table> 
<tr> <td>Přezdívka: </td> <td><input type="text" name="nick" value="<?php if(isset($_POST["nick"])){echo $_POST["nick"];}?>" size="25" tabindex="1" /></td> </tr>
<tr> <td>Heslo: </td> <td><input type="password" name="heslo" value="" size="25" tabindex="2" /></td> </tr> 
<tr> <td>Ověření hesla: </td> <td><input type="password" name="over_heslo" value="" size="25" tabindex="3" /></td> </tr> 
<tr> <td>Email: </td> <td><input type="text" name="email" value="<?php if(isset($_POST["email"])){echo $_POST["email"];}?>" size="25" tabindex="4" /></td> </tr> 
<tr> <td colspan="2"><input type="submit" name="submit" value="Registrovat se" /></td> </tr> 
</table> 
</form>

Nyní jsme si vytvořili skript, který se nám připojí k DB (= databáze), ověří, zda byly zadané všechny správné údaje (správnost e-mailu se dozvíte v tomto článku) a následně je zapíše do DB.

connect.php

Dále si vytvoříme soubor pro připojení k databázi. Nazveme ho connect.php a vložíme do něj:

<?php
$db_server = 'server'; /* Název serveru, ke kterému se budeme připojovat */
$db_login = 'uzivatel'; /* Jméno uživatele do DB */
$db_password = 'heslo'; /* Heslo uživatele do DB */
$db_name = 'databaze'; /* Název databáze, ve které jsme si vytvořili tabulku "uzivatele" */
$spojeni = @MySQL_Connect($db_server ,$db_login, $db_password);
@MySQL_Select_DB($db_name)or die('<p style="color: red">Nastala chyba v pripojeni k databazi');
mysql_query("set names utf8");
?>

index.php

Nyní si vytvoříme soubor index.php, který bude obsahovat přihlašovací formulář a do jeho obsahu vložíme tento kód:

<form action="login.php" method="post"> 
 <table>
 <tr>
 <td>Přezdívka: </td>
 <td><input type="text" name="nick" value="" size="17" tabindex="1" /></td>
 </tr>
 <tr>
 <td>Heslo: </td>
 <td><input type="password" name="heslo" value="" size="17" tabindex="2" /></td>
 </tr>
 <tr>
 <td colspan="2"><input type="submit" name="submit" value="Přihlásit se" /></td>
 </tr>
 <tr>
 <td colspan="2" align="right">Pokud nemáte účet, <a href="/registrace.php">registrujte se</a></td>
 </tr>
 </table>
 </form>

K tomuto formuláři není moc co psát…

login.php

Dále si tedy vytvoříme soubor login.php (na který jsme odkazovali ve formuláři). Tento soubor bude sloužit k ověření správnosti dat s databází a případně vytvoří SESSION ‚login‘, kterou se budeme prokazovat jako přihlášení. Po shodě dat z MySQL, se přesměrujeme na admin.php. Do souboru login.php vložte:

<?php
include "./connect.php";/* připojení k databázi */
$login = mysql_real_escape_string($_POST["nick"]);/* nick zadaný ve formuláři pro přihlašování */
$heslo = mysql_real_escape_string($_POST["heslo"]);/* heslo zadané ve formuláři pro přihlašování */
$md5heslo = md5($heslo);/* Pomocí funkce md5() heslo zahashujeme */
/* — SQL DOTAZ PRO OVĚŘENÍ PRAVOSTI PŘIHLAŠOVACÍH DAT V DATABÁZI A UŽIVATELEM ZADANÝCH — */
$dotaz = mysql_query("select * from uzivatele where login = '$login' and heslo = '$md5heslo'");
$overeni = mysql_num_rows($dotaz);
$row = mysql_fetch_array($dotaz);
if($overeni == 1) {
 session_start();
 $_SESSION['login'] = stripslashes($login); 
/* Zde se vytváří SESSION 'login', kterou se budeme prokazovat jako přihlášení */
 $_SESSION['id'] = $row["id"];
 header("Location: admin.php"); /* V případě správného přihlášení se přesměruje na admin.php */
 die();
} else {
 echo"Zadal jsi špatný login nebo heslo!";
}
?>

admin.php

Dále si vytvoříme soubor admin.php, který bude přístupný pouze registrovaným uživatelům. To zajistíme tak, že povolíme výpis tajných dat pouze, pokud má uživatel SESSION ‚login‘, pokud nemá, zobrazíme přihlašovací formulář a hlášku, že se musí příhlásit. Do souboru admin.php vložte:

<?php
session_start(); /* Všude, kde chceme, aby probíhala autorizace, vložíme session_start */
?>
</head>
<body>
<h2>TEXT PRO VŠECHNY UŽIVATELE (přihlášené+nepřihlášené)</h2> /* Text pro všechny */
<?php
 if($_SESSION['login']!=""){
 echo'TEXT POUZE PRO PŘIHLÁŠENÉ UŽIVATELE - JSI VÍTÁN!!!<br> /* Text pro přihlášené */
 <a href="/logout.php">Odhlásit se</a>'; /* Zde je možnost, odhlásit se, povíme si, jak... */
 } else {
 echo'TEXT PRO NEPŘIHLÁŠENÉ UŽIVATELE - Tato stránka je přístupná pouze přihlášeným uživatelům. Pokud nemáš účet, <a href="/registrace.php">zaregistruj se</a>!<br> /* Text pro nepřihlášené */
 <h2>Přihlásit se:</h2>
 <form action="login.php" method="post"> 
 <table>
 <tr>
 <td>Přezdívka: </td>
 <td><input type="text" name="nick" value="" size="17" tabindex="1" /></td>
 </tr>
 <tr>
 <td>Heslo: </td>
 <td><input type="password" name="heslo" value="" size="17" tabindex="2" /></td>
 </tr>
 <tr>
 <td colspan="2"><input type="submit" name="submit" value="Přihlásit se" /></td>
 </tr>
 </table>
 </form>';
 }
?>

logout.php

Nyní nám zbývá už poslední část – odhlášení! Vytvořme si tedy soubor logout.php a napište do něj:

<?php
session_start();// Zapneme session
session_destroy();// Smažeme všechna session 'login'
header("location: index.php"); // Přesměruje na přihlašovací stránku
?>

Upozornění

V době, kdy jsem tento skript psal (prosinec 2013) byl aktuální. Z důvodu, že skript už není nejaktuálnější, chci Vás upozornit, že:

  • používat hashování pomocí MD5 je již zastaralé
  • používat rozšíření mysql_ je již zastaralé – doporučuji mysqli_
  • by bylo dobré uživatelské vstupy ošetřovat před XSS útoky (článek).

Samozřejmě není problém, tento typ přihlašování používat. Jen je dobré, abyste to věděli.

Shrnutí

Vytvořili jsme si tedy celkem šest souborů (index.php, connect.php, login.php, logout.php, admin.php, registrace.php).

Vše si můžete zdarma stáhnout a použít na svém webu: http://ukazky.mujskript.cz/jednoduche-prihlaseni-pomoci-mysql/prihlaseni.zip

Uvítám Vaše připomínky níže v diskusi 🙂

3 komentáře u „Jednoduché přihlášení v PHP a MySQL“

  1. – používat hashování pomocí MD5 je již zastaralé
    doporucuji nejnovejsi: password_hash()

    – používat rozšíření mysql_ a mysqli_ je již zastaralé a nefunguje od verze 5 v PHP
    doporucuji PDO (PHP Data Objects)

Napsat komentář: Martin Švejda Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *