Jak provést jednoduchou registraci uživatele a přihlašovací formulář?
První věc, kterou byste měli zvážit při vytváření portálu pro registraci uživatelů, je, kde a jak budete ukládat uživatelské účty. Pro tento účel použijeme databázi MySQL s následující tabulkou:
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;
V této tabulce uložíme uživatelské jméno a hash hesla. Máme také sloupec, který nám řekne typ účtu; zda se jedná o běžného uživatele nebo správce.
Připojení k databázi
Samozřejmě se potřebujeme připojit k databázi a zahájit relaci. Tato témata jsou mimo rozsah této odpovědi. Budeme používat PDO pro připojení k naší databázi, která obsahuje naši novou tabulku.
<?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
]);
Pro podrobnější vysvětlení toho, jak funguje PDO, se podívejte na tento článek:https://phpdelusions.net/pdo
Funkce registrace
Nyní můžeme vytvořit jednoduchou funkci, která zaregistruje uživatele do databáze. Tato funkce bude přijímat 3 parametry:DB připojení, uživatelské jméno a heslo.
Tato funkce vytvoří hash hesla a poté toto heslo zahodí. Je to jednoduchý příklad, ale ve skutečném slově byste pravděpodobně chtěli přidat více kontrol a učinit to spolehlivějším.
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
]);
}
Funkce přihlášení
Stejně jako u funkce registrace vytvoříme jednu funkci pro přihlášení. Funkce bude přijímat stejné parametry, ale místo INSERT
bude to SELECT
z databáze na základě odpovídajícího uživatelského jména.
Pokud je v databázi odpovídající záznam a heslo je ověřeno proti uloženému hash, uložíme informace o uživateli do relace. Relace uchová tyto informace na pevném disku a poskytne uživateli soubor cookie, který bude použit při vytváření budoucích požadavků. Použití tohoto cookie PHP otevře stejnou relaci pokaždé, když je stránka požadována.
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'];
}
Úplný kód
Nyní můžeme toto vše propojit a přidat nějaké HTML formuláře. Část HTML je mimo rozsah, ale chtěli byste ji ponechat odděleně od vaší logiky PHP. Pravděpodobně v samostatném souboru.
<?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;
Toto je velmi jednoduchý příklad toho, jak funguje registrace a přihlašování v PHP. Nedoporučoval bych ji používat tak, jak je na živém webu, ale pro účely učení by měla demonstrovat, jak tato funkce funguje.
Můžete na tom stavět a dělat něco, když je typ uživatele jiný. Zobrazit více obsahu pro privilegovanější uživatele.