Mysql
 sql >> база данни >  >> RDS >> Mysql

Прехвърляне на потребители от потребителско име към потребителска_група

Как да направя проста форма за регистрация на потребител и влизане?

Първото нещо, което трябва да имате предвид, когато създавате портал за регистрация на потребители, е къде и как ще съхранявате потребителски акаунти. За тази цел ще използваме MySQL база данни със следната таблица:

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;

В тази таблица ще съхраняваме потребителското име и хеша на паролата. Имаме и колона, която ще ни каже вида на акаунта; независимо дали е обикновен потребител или администратор.

Връзка с база данни

Очевидно трябва да се свържем с базата данни и да започнем сесия. Тези теми са извън обхвата на този отговор. Ще използваме PDO, за да се свържем с нашата база данни, която съдържа новата ни таблица.

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

За по-задълбочено обяснение как работи PDO, вижте тази статия:https://phpdelusions.net/pdo

Функция за регистрация

Вече можем да създадем проста функция, която ще регистрира потребител в базата данни. Тази функция ще приеме 3 параметъра:DB връзка, потребителско име и парола.

Тази функция ще създаде хеш на паролата, след което ще отхвърли тази парола. Това е прост пример, но в реална дума вероятно бихте искали да добавите повече проверки и да направите това по-сигурно.

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

Функцията за влизане

Точно както направихме с функцията за регистрация, ще създадем една функция за влизане. Функцията ще приема същите параметри, но вместо INSERT ще SELECT от базата данни въз основа на съответстващото потребителско име.

Ако има съвпадащ запис в базата данни и паролата е проверена спрямо съхранения хеш, тогава ние съхраняваме потребителската информация в сесия. Сесията ще запази тази информация на твърдия диск и ще даде на потребителя бисквитка, която да се използва при бъдещи заявки. Използването на тази бисквитка PHP ще отваря една и съща сесия всеки път, когато страницата бъде поискана.

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

Пълният код

Вече можем да свържем всичко това заедно и да добавим някои HTML форми. HTML частта е извън обхвата, но бихте искали да я държите отделно от вашата PHP логика. Вероятно в отделен файл.

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

Това е много прост пример за това как функционират регистрацията и влизането в PHP. Не бих препоръчал да го използвате такъв, какъвто е на жив сайт, но за учебни цели трябва да демонстрира как работи тази функционалност.

Можете да надграждате върху него и да правите нещо, когато типът потребител е различен. Показвайте повече съдържание на по-привилегировани потребители.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. C# - MySQL срещу Microsoft SQL Server

  2. Facebook регистрация Connect

  3. MySQL, множество редове за отделни полета

  4. Zend_Db подреждане по поле Стойност

  5. PHP квадратчето за отметка е зададено за проверка въз основа на стойността на базата данни