sql >> Database >  >> RDS >> Mysql

Gebruikers aanpassen van gebruikersnaam naar gebruikersgroep

Hoe maak je een eenvoudige gebruikersregistratie en inlogformulier?

Het eerste waar u rekening mee moet houden bij het maken van een gebruikersregistratieportaal, is waar en hoe u gebruikersaccounts gaat opslaan. Voor dit doel gaan we de MySQL-database gebruiken met de volgende 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;

In deze tabel gaan we de gebruikersnaam en de wachtwoordhash opslaan. We hebben ook een kolom die ons het type account vertelt; of het nu een normale gebruiker of een beheerder is.

Databaseverbinding

We moeten natuurlijk verbinding maken met de database en een sessie starten. Deze onderwerpen vallen buiten het bestek van dit antwoord. We gaan PDO gebruiken om verbinding te maken met onze database die onze nieuwe tabel bevat.

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

Voor een meer diepgaande uitleg van hoe PDO werkt, bekijk dit artikel:https://phpdelusions.net/pdo

Registreer functie

We kunnen nu een eenvoudige functie maken die een gebruiker in de database registreert. Deze functie accepteert 3 parameters:de DB-verbinding, gebruikersnaam en wachtwoord.

Deze functie maakt een hash van het wachtwoord en gooi dit wachtwoord vervolgens weg. Het is een eenvoudig voorbeeld, maar in de praktijk zou je waarschijnlijk meer controles willen toevoegen en dit meer onfeilbaar maken.

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

De inlogfunctie

Net zoals we deden met de registratiefunctie, zullen we één functie maken om in te loggen. De functie accepteert dezelfde parameters, maar in plaats van INSERT het zal SELECT uit de database op basis van de overeenkomende gebruikersnaam.

Als er een overeenkomend record in de database is en het wachtwoord wordt geverifieerd met de opgeslagen hash, dan slaan we de gebruikersinformatie op in een sessie. De sessie bewaart deze informatie op de harde schijf en geeft de gebruiker een cookie die kan worden gebruikt bij toekomstige verzoeken. Met behulp van die cookie zal PHP elke keer dat de pagina wordt opgevraagd dezelfde sessie openen.

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

De volledige code

We kunnen dit nu allemaal met elkaar verbinden en enkele HTML-formulieren toevoegen. Het HTML-gedeelte valt buiten het bereik, maar u wilt het gescheiden houden van uw PHP-logica. Waarschijnlijk in een apart bestand.

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

Dit is een heel eenvoudig voorbeeld van hoe registratie en inloggen in PHP werkt. Ik zou het niet aanraden om het te gebruiken zoals het is op een live site, maar voor leerdoeleinden moet het laten zien hoe deze functionaliteit werkt.

Je kunt er bovenop bouwen en iets doen als het gebruikerstype anders is. Toon meer inhoud aan meer bevoorrechte gebruikers.




  1. MySQL Math - Is het mogelijk om een ​​correlatie in een query te berekenen?

  2. 4 Handige Commandline-tools om MySQL-prestaties in Linux te bewaken

  3. MySQL MAAK TABEL ALS NIET BESTAAT -> Fout 1050

  4. Effectieve monitoring van MySQL met SCUMM-dashboards:deel één