Jak zrobić prosty formularz rejestracji użytkownika i logowania?
Pierwszą rzeczą, którą należy wziąć pod uwagę podczas tworzenia portalu rejestracji użytkowników, jest miejsce i sposób przechowywania kont użytkowników. W tym celu użyjemy bazy danych MySQL z poniższą 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;
W tej tabeli będziemy przechowywać nazwę użytkownika i hash hasła. Mamy również kolumnę, która powie nam rodzaj konta; niezależnie od tego, czy jest to zwykły użytkownik, czy administrator.
Połączenie z bazą danych
Oczywiście musimy połączyć się z bazą danych i rozpocząć sesję. Te tematy są poza zakresem tej odpowiedzi. Użyjemy PDO, aby połączyć się z naszą bazą danych, która przechowuje naszą nową 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
]);
Aby uzyskać bardziej szczegółowe wyjaśnienie działania PDO, zapoznaj się z tym artykułem:https://phpdelusions.net/pdo
Zarejestruj funkcję
Możemy teraz stworzyć prostą funkcję, która zarejestruje użytkownika w bazie danych. Ta funkcja akceptuje 3 parametry:połączenie z bazą danych, nazwę użytkownika i hasło.
Ta funkcja utworzy skrót hasła, a następnie odrzuci to hasło. To prosty przykład, ale w prawdziwym słowie prawdopodobnie chciałbyś dodać więcej sprawdzeń i uczynić to bardziej niezawodnym.
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
]);
}
Funkcja logowania
Tak jak zrobiliśmy z funkcją rejestracji, stworzymy jedną funkcję do logowania. Funkcja przyjmie te same parametry, ale zamiast INSERT
SELECT
z bazy danych na podstawie pasującej nazwy użytkownika.
Jeśli w bazie danych znajduje się pasujący rekord, a hasło jest weryfikowane z zapisanym hashem, przechowujemy informacje o użytkowniku podczas sesji. Sesja zachowa te informacje na dysku twardym i da użytkownikowi plik cookie, który będzie używany podczas składania przyszłych żądań. Korzystając z tego pliku cookie, PHP otworzy tę samą sesję za każdym razem, gdy zostanie wyświetlona strona.
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'];
}
Pełny kod
Możemy teraz połączyć to wszystko razem i dodać kilka formularzy HTML. Część HTML jest poza zakresem, ale chciałbyś, aby była oddzielona od logiki PHP. Prawdopodobnie w osobnym pliku.
<?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;
To bardzo prosty przykład, jak działa rejestracja i logowanie w PHP. Nie zalecałbym używania go w stanie, w jakim jest na działającej stronie, ale do celów edukacyjnych powinien pokazać, jak działa ta funkcja.
Możesz na nim budować i robić coś, gdy typ użytkownika jest inny. Pokaż więcej treści bardziej uprzywilejowanym użytkownikom.