Hvordan laver man en simpel brugerregistrering og log ind?
Den første ting du bør overveje, når du laver en brugerregistreringsportal, er hvor og hvordan du vil gemme brugerkonti. Til dette formål vil vi bruge MySQL-databasen med følgende tabel:
CREATE TABLE IF NOT EXISTS `accounts` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`Hash` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`UserType` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
I denne tabel skal vi gemme brugernavnet og adgangskoden hash. Vi har også en kolonne, der fortæller os typen af konto; om det er en normal bruger eller en admin.
Databaseforbindelse
Vi skal naturligvis oprette forbindelse til databasen og starte en session. Disse emner er uden for dette svars omfang. Vi vil bruge PDO til at oprette forbindelse til vores database, som indeholder vores nye tabel.
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;charset=utf8mb4;dbname=test', 'dbuser', 'password', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false
]);
For en mere dybdegående forklaring af, hvordan PDO virker, tag et kig på denne artikel:https://phpdelusions.net/pdo
Registreringsfunktion
Vi kan nu oprette en simpel funktion, der vil registrere en bruger i databasen. Denne funktion vil acceptere 3 parametre:DB-forbindelsen, brugernavn og adgangskode.
Denne funktion vil oprette en hash af adgangskoden, og derefter kassere denne adgangskode. Det er et simpelt eksempel, men i ægte ord vil du sikkert gerne tilføje flere kontroller og gøre dette mere idiotsikkert.
function register(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare('INSERT INTO accounts(Username, Hash, UserType) VALUES(?,?,?)');
$stmt->execute([
$username,
$hash,
'user' // or admin
]);
}
Loginfunktionen
Ligesom vi gjorde med registreringsfunktionen, vil vi oprette én funktion til at logge ind. Funktionen accepterer de samme parametre, men i stedet for INSERT
det vil SELECT
fra databasen baseret på det matchende brugernavn.
Hvis der er en matchende post i databasen, og adgangskoden er verificeret mod den gemte hash, gemmer vi brugeroplysningerne i en session. Sessionen vil bevare denne information på harddisken, og den vil give brugeren en cookie, der skal bruges ved fremtidige anmodninger. Brug af denne cookie vil PHP åbne den samme session hver gang siden anmodes om.
function login(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$stmt = $db->prepare('SELECT Id, Hash, UserType FROM accounts WHERE Username=?');
$stmt->execute([ $username ]);
$user = $stmt->fetch();
if (!$user || !password_verify($password, $user['Hash'])) {
throw new Exception('Username or password incorrect!');
}
$_SESSION['loggedUserId'] = $user['Id'];
$_SESSION['UserType'] = $user['UserType'];
}
Den fulde kode
Vi kan nu forbinde alt dette sammen og tilføje nogle HTML-formularer. HTML-delen er uden for rækkevidde, men du vil gerne holde den adskilt fra din PHP-logik. Sandsynligvis i en separat fil helt.
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;charset=utf8mb4;dbname=test', 'inet', '5432', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false
]);
function register(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare('INSERT INTO accounts(Username, Hash, UserType) VALUES(?,?,?)');
$stmt->execute([
$username,
$hash,
'user' // or admin
]);
}
function login(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$stmt = $db->prepare('SELECT Id, Hash, UserType FROM accounts WHERE Username=?');
$stmt->execute([ $username ]);
$user = $stmt->fetch();
if (!$user || !password_verify($password, $user['Hash'])) {
throw new Exception('Username or password incorrect!');
}
$_SESSION['loggedUserId'] = $user['Id'];
$_SESSION['UserType'] = $user['UserType'];
}
if (isset($_POST['register'])) {
register($pdo, $_POST['username'], $_POST['password']);
}
if (isset($_POST['login'])) {
login($pdo, $_POST['username'], $_POST['password']);
}
if (!isset($_SESSION['loggedUserId'])):
?>
<!-- Register form -->
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="register" value="Register">
</form>
<!-- Login form -->
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="login" value="Log in">
</form>
<?php
else:
echo 'Here be something after login. You are a '.$_SESSION['UserType'];
endif;
Dette er et meget simpelt eksempel på, hvordan registrering og login fungerer i PHP. Jeg vil ikke anbefale at bruge det som det er på et live-websted, men til læringsformål bør det demonstrere, hvordan denne funktionalitet virker.
Du kan bygge ovenpå det og gøre noget, når brugertypen er anderledes. Vis mere indhold til mere privilegerede brugere.