sql >> Databáze >  >> RDS >> Mysql

Převedení uživatelů z uživatelského jména na uživatelskou_skupinu

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.




  1. Jak uniknout % z dotazu python mysql

  2. SQL - Vytvořte pohled z více tabulek

  3. Doctrine 2 DQL CASE WHEN in Count

  4. Vytvořte novou databázi pomocí MySQL Workbench