Registracija uporabnika omogoča ustvarjanje novega računa v aplikaciji. Uporabnik vnese svoje podatke, aplikacija jih preveri, nato pa novega uporabnika shrani v podatkovno zbirko.
Registracija novega uporabnika
Pri registraciji običajno uporabnik izpolni obrazec z osnovnimi podatki, kot so ime, priimek, uporabniško ime, e-poštni naslov in geslo. Aplikacija nato preveri pravilnost vnesenih podatkov in ustvari nov uporabniški račun.
Osnovna sintaksa za vnos novega uporabnika v tabelo je:
INSERT INTO users (ime, priimek, username, mail, password)
VALUES (vrednost1, vrednost2, vrednost3, vrednost4, vrednost5);
Pri registraciji gesla ne shranjujemo v navadnem besedilu.
Pred shranjevanjem ga pretvorimo v varen hash, ki ga kasneje
pri prijavi preverjamo s funkcijo password_verify().
Osnovni primer z mysqli
Spodnji zgled prikaže osnovno registracijo uporabnika z uporabo
mysqli, validacije polj in varnega shranjevanja gesla.
<?php
session_start();
define('DB_SERVER', 'localhost');
define('DB_USER', 'uporabnik');
define('DB_PASS', 'skritoGeslo');
define('DB_NAME', 'knjiznica');
$connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
if (!$connection) {
die(
'Povezava s podatkovno zbirko ni vzpostavljena: ' .
mysqli_connect_error() .
' (' . mysqli_connect_errno() . ')'
);
}
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$ime = trim($_POST['ime'] ?? '');
$priimek = trim($_POST['priimek'] ?? '');
$username = trim($_POST['uid'] ?? '');
$email = trim($_POST['mail'] ?? '');
$password = $_POST['pwd'] ?? '';
$rePassword = $_POST['re-pwd'] ?? '';
if ($ime === '' || $priimek === '' || $username === '' || $email === '' || $password === '' || $rePassword === '') {
$error = 'Vsa polja morajo biti izpolnjena.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$error = 'E-poštni naslov ni veljaven.';
} elseif ($password !== $rePassword) {
$error = 'Gesli morata biti enaki.';
} elseif (mb_strlen($password) < 8) {
$error = 'Geslo mora imeti vsaj 8 znakov.';
} else {
$stmtCheck = mysqli_prepare(
$connection,
"SELECT id FROM users WHERE username = ? OR mail = ?"
);
mysqli_stmt_bind_param($stmtCheck, 'ss', $username, $email);
mysqli_stmt_execute($stmtCheck);
$resultCheck = mysqli_stmt_get_result($stmtCheck);
if (mysqli_fetch_assoc($resultCheck)) {
$error = 'Uporabniško ime ali e-pošta je že uporabljena.';
} else {
$passwordHash = password_hash($password, PASSWORD_BCRYPT);
$stmtInsert = mysqli_prepare(
$connection,
"INSERT INTO users (ime, priimek, username, mail, password)
VALUES (?, ?, ?, ?, ?)"
);
mysqli_stmt_bind_param($stmtInsert, 'sssss', $ime, $priimek, $username, $email, $passwordHash);
if (mysqli_stmt_execute($stmtInsert)) {
$_SESSION['regIme'] = $ime;
$_SESSION['regPriimek'] = $priimek;
header('Location: 15_register_OK.php');
exit();
} else {
$error = 'Registracija trenutno ni mogoča.';
}
mysqli_stmt_close($stmtInsert);
}
mysqli_stmt_close($stmtCheck);
}
}
mysqli_close($connection);
?>
Osnovni primer s PDO
Tudi z vmesnikom PDO registracijo izvedemo s
pripravljeno poizvedbo, preverjanjem enkratnosti uporabnika
in shranjevanjem hashiranega gesla.
<?php
session_start();
$streznik = 'localhost';
$baza = 'knjiznica';
$uporabnik = 'uporabnik';
$geslo = 'skritoGeslo';
try {
$pdo = new PDO("mysql:host=$streznik;dbname=$baza;charset=utf8mb4", $uporabnik, $geslo);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$ime = trim($_POST['ime'] ?? '');
$priimek = trim($_POST['priimek'] ?? '');
$username = trim($_POST['uid'] ?? '');
$email = trim($_POST['mail'] ?? '');
$password = $_POST['pwd'] ?? '';
$rePassword = $_POST['re-pwd'] ?? '';
if ($ime === '' || $priimek === '' || $username === '' || $email === '' || $password === '' || $rePassword === '') {
$error = 'Vsa polja morajo biti izpolnjena.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$error = 'E-poštni naslov ni veljaven.';
} elseif ($password !== $rePassword) {
$error = 'Gesli morata biti enaki.';
} elseif (mb_strlen($password) < 8) {
$error = 'Geslo mora imeti vsaj 8 znakov.';
} else {
$stmt = $pdo->prepare(
"SELECT id FROM users WHERE username = :username OR mail = :mail"
);
$stmt->bindValue(':username', $username, PDO::PARAM_STR);
$stmt->bindValue(':mail', $email, PDO::PARAM_STR);
$stmt->execute();
if ($stmt->fetch(PDO::FETCH_ASSOC)) {
$error = 'Uporabniško ime ali e-pošta je že uporabljena.';
} else {
$passwordHash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 12));
$query = $pdo->prepare(
"INSERT INTO users (ime, priimek, username, mail, password)
VALUES (:ime, :priimek, :username, :mail, :password)"
);
$query->execute(array(
':ime' => $ime,
':priimek' => $priimek,
':username' => $username,
':mail' => $email,
':password' => $passwordHash
));
$_SESSION['regIme'] = $ime;
$_SESSION['regPriimek'] = $priimek;
header('Location: 15_register_OK.php');
exit();
}
}
}
}
catch (PDOException $e) {
$error = 'Registracija trenutno ni mogoča.';
}
?>
Preverjanje podatkov pri registraciji
Pri registraciji moramo skrbno preveriti vse podatke, saj le tako preprečimo napačne vnose in podvojene uporabniške račune.
- vsa polja morajo biti izpolnjena,
- e-poštni naslov mora biti veljaven,
- uporabniško ime mora biti ustrezne oblike,
- obe gesli se morata ujemati,
- geslo mora biti dovolj dolgo in varno,
- uporabniško ime in e-pošta morata biti unikatna.
Varnost pri registraciji uporabnika
- geslo pred shranjevanjem pretvorimo v hash,
- za hashiranje uporabimo funkcijo password_hash(),
- pri vnosu v bazo uporabimo pripravljene SQL stavke,
- ob napaki uporabniku pokažemo prijazno sporočilo,
- po uspešni registraciji uporabnika pogosto preusmerimo na potrditveno ali prijavno stran.
📘Aplikacija Knjige
V priloženi aplikaciji je registracija izvedena v datoteki 15_register.php. Ob oddaji obrazca aplikacija prebere ime, priimek, uporabniško ime, e-pošto in obe gesli, nato pa preveri pravilnost vseh polj. Posebej preveri veljavnost e-pošte, dovoljene znake v imenu, priimku in uporabniškem imenu, enakost obeh gesel ter minimalno dolžino gesla.
Nato s pripravljeno PDO poizvedbo preveri, ali uporabniško ime
ali e-poštni naslov že obstajata v tabeli users.
Če uporabnik še ne obstaja, aplikacija geslo pretvori v varen
hash z password_hash() in novega uporabnika shrani v bazo.
Po uspešni registraciji aplikacija v sejo shrani ime in priimek, nato pa uporabnika preusmeri na stran 15_register_OK.php, kjer se izpiše potrditveno sporočilo in povezava na prijavo.
Navodila za izdelavo registracije
- Najprej pripravimo obrazec za vnos podatkov novega uporabnika.
- Ob oddaji obrazca preberemo vsa polja.
- Preverimo, ali so polja pravilno izpolnjena.
- V bazi preverimo, ali uporabniško ime ali e-pošta že obstajata.
- Geslo pretvorimo v hash s funkcijo password_hash().
- Novega uporabnika shranimo v tabelo
users. - Po uspešni registraciji uporabnika preusmerimo na potrditveno ali prijavno stran.
Pri učenju je smiselno poznati oba pristopa:
- mysqli za klasično registracijo s pripravljenimi stavki,
- PDO za sodobnejši pristop pri delu z bazo,
- aplikacijski pristop, kjer registracija vključuje validacijo, zaščito gesla in potrditveno stran.