sql >> Databasteknik >  >> RDS >> Mysql

Maching användare från användarnamn till user_group

Hur gör man en enkel användarregistrering och inloggningsformulär?

Det första du bör tänka på när du skapar en användarregistreringsportal är var och hur du ska lagra användarkonton. För detta ändamål kommer vi att använda MySQL-databas med följande tabell:

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 den här tabellen kommer vi att lagra användarnamnet och lösenordet hash. Vi har också en kolumn som berättar vilken typ av konto som är; oavsett om det är en normal användare eller en administratör.

Databasanslutning

Vi måste uppenbarligen ansluta till databasen och starta en session. Dessa ämnen ligger utanför omfattningen av detta svar. Vi kommer att använda PDO för att ansluta till vår databas som innehåller vår nya tabell.

<?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
]);

För en mer djupgående förklaring av hur PDO fungerar, ta en titt på den här artikeln:https://phpdelusions.net/pdo

Registreringsfunktion

Vi kan nu skapa en enkel funktion som registrerar en användare i databasen. Den här funktionen accepterar 3 parametrar:DB-anslutningen, användarnamn och lösenord.

Den här funktionen skapar en hash av lösenordet och kasserar sedan detta lösenord. Det är ett enkelt exempel, men i verkliga ord skulle du förmodligen vilja lägga till fler kontroller och göra detta mer idiotsäkert.

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
    ]);
}

Inloggningsfunktionen

Precis som vi gjorde med registreringsfunktionen kommer vi att skapa en funktion för att logga in. Funktionen accepterar samma parametrar, men istället för INSERT det kommer att SELECT från databasen baserat på det matchande användarnamnet.

Om det finns en matchande post i databasen och lösenordet verifieras mot den lagrade hashen så lagrar vi användarinformationen i en session. Sessionen kommer att bevara denna information på hårddisken och det kommer att ge användaren en cookie som ska användas vid framtida förfrågningar. Genom att använda den cookien öppnar PHP samma session varje gång sidan begärs.

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 fullständiga koden

Vi kan nu koppla ihop allt detta och lägga till några HTML-formulär. HTML-delen är utanför räckvidden men du skulle vilja hålla den åtskild från din PHP-logik. Förmodligen i en separat fil helt och hållet.

<?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;

Detta är ett väldigt enkelt exempel på hur registrering och inloggning fungerar i PHP. Jag skulle inte rekommendera att använda den som den är på en live-webbplats, men i läroändamål bör den visa hur den här funktionen fungerar.

Du kan bygga ovanpå det och göra något när användartypen är annorlunda. Visa mer innehåll för mer privilegierade användare.




  1. Lägga till ett statiskt prefix på ett ökande tal

  2. SQL för att hitta versaler från en kolumn

  3. Oracle Partitioned Sequence

  4. Ladda upp bilder i CKEditor utan att använda ett plugin