Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Łączenie użytkowników z nazwy użytkownika na grupę_użytkowników

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VARCHAR jako klucz obcy/klucz podstawowy w bazie danych dobry czy zły?

  2. Jaki jest odpowiednik MySQL funkcji STUFF() w SQL Server?

  3. Jak zaimportować plik CSV do tabeli MySQL

  4. Importowanie większych plików SQL do MySQL

  5. Facebook nie może zeskrobać metadanych po przeniesieniu Wordpressa na nowy serwer