Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Memproses pengguna dari nama pengguna ke grup_pengguna

Bagaimana cara membuat formulir pendaftaran dan login pengguna sederhana?

Hal pertama yang harus Anda pertimbangkan ketika membuat portal pendaftaran pengguna adalah di mana dan bagaimana Anda akan menyimpan akun pengguna. Untuk tujuan ini kita akan menggunakan database MySQL dengan tabel berikut:

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;

Dalam tabel ini kita akan menyimpan hash username dan password. Kami juga memiliki kolom yang akan memberi tahu kami jenis akun; apakah itu pengguna biasa atau admin.

Koneksi basis data

Kami jelas perlu terhubung ke database dan memulai sesi. Topik ini berada di luar cakupan jawaban ini. Kami akan menggunakan PDO untuk terhubung ke database kami yang menyimpan tabel baru kami.

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

Untuk penjelasan lebih mendalam tentang cara kerja PDO, lihat artikel ini:https://phpdelusions.net/pdo

Fungsi daftar

Kita sekarang dapat membuat fungsi sederhana yang akan mendaftarkan pengguna dalam database. Fungsi ini akan menerima 3 parameter:koneksi DB, nama pengguna, dan kata sandi.

Fungsi ini akan membuat hash kata sandi, lalu membuang kata sandi ini. Ini adalah contoh sederhana, tetapi dalam kata nyata Anda mungkin ingin menambahkan lebih banyak tanda centang dan membuatnya lebih mudah.

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

Fungsi login

Seperti yang kita lakukan dengan fungsi registrasi, kita akan membuat satu fungsi untuk login. Fungsi tersebut akan menerima parameter yang sama, tetapi sebagai ganti INSERT itu akan SELECT dari database berdasarkan nama pengguna yang cocok.

Jika ada catatan yang cocok dalam database dan kata sandi diverifikasi terhadap hash yang disimpan, maka kami menyimpan informasi pengguna dalam satu sesi. Sesi ini akan menyimpan informasi ini di hard drive dan akan memberi pengguna cookie untuk digunakan saat membuat permintaan di masa mendatang. Menggunakan cookie itu, PHP akan membuka sesi yang sama setiap kali halaman diminta.

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

Kode lengkap

Kita sekarang dapat menghubungkan semua ini bersama-sama dan menambahkan beberapa bentuk HTML. Bagian HTML berada di luar cakupan tetapi Anda ingin memisahkannya dari logika PHP Anda. Mungkin dalam file terpisah sama sekali.

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

Ini adalah contoh yang sangat sederhana tentang cara kerja pendaftaran dan masuk di PHP. Saya tidak akan merekomendasikan untuk menggunakannya apa adanya di situs langsung, tetapi untuk tujuan pembelajaran, ini harus menunjukkan cara kerja fungsi ini.

Anda dapat membangun di atasnya dan melakukan sesuatu ketika tipe pengguna berbeda. Tampilkan lebih banyak konten kepada lebih banyak pengguna yang memiliki hak istimewa.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. django.db.utils.OperationalError:(2013, Kehilangan koneksi ke server MySQL saat 'jabat tangan:membaca paket komunikasi awal', kesalahan sistem:0)

  2. Beberapa gabungan dalam dengan beberapa tabel

  3. KESALAHAN 1356 (HY000):Lihat referensi 'mysql.user' tabel atau kolom atau fungsi yang tidak valid atau definisi/pemanggil tampilan tidak memiliki hak untuk menggunakannya

  4. Apa yang harus diketahui setiap programmer PHP?

  5. Apakah ada FIND_IN_SET berdasarkan indeks di MySQL?