complete Login System + Database integration

🟢 Step 1: Database Setup

👉 Create Database

CREATE DATABASE composer_exam;

👉 Create Users Table

USE composer_exam;CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100) UNIQUE,
password VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

🟢 Step 2: Install DB Package (Optional but Professional)

You can use raw PDO (recommended for learning), no extra package needed.


🟢 Step 3: Create DB Connection

📁 config/db.php

<?php$host = "localhost";
$dbname = "composer_exam";
$username = "root";
$password = "";try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("DB Connection Failed: " . $e->getMessage());
}

🟡 Step 4: Register System

📁 register.php

<?php
require 'vendor/autoload.php';
require 'config/db.php';if ($_SERVER['REQUEST_METHOD'] == 'POST') { $name = $_POST['name'];
$email = $_POST['email'];
$password = password_hash($_POST['password'], PASSWORD_BCRYPT); if (!$name || !$email || !$password) {
die("All fields required!");
} $stmt = $pdo->prepare("INSERT INTO users (name, email, password) VALUES (?, ?, ?)"); try {
$stmt->execute([$name, $email, $password]);
echo "User registered successfully!";
} catch (Exception $e) {
echo "Email already exists!";
}
}

📁 register.html

<form method="POST" action="register.php">
Name: <input type="text" name="name" required><br><br>
Email: <input type="email" name="email" required><br><br>
Password: <input type="password" name="password" required><br><br>
<button type="submit">Register</button>
</form>

🟡 Step 5: Login System

📁 login.php

<?php
session_start();require 'vendor/autoload.php';
require 'config/db.php';if ($_SERVER['REQUEST_METHOD'] == 'POST') { $email = $_POST['email'];
$password = $_POST['password']; $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user && password_verify($password, $user['password'])) { $_SESSION['user'] = $user['name'];
header("Location: dashboard.php"); } else {
echo "Invalid credentials!";
}
}

📁 login.html

<form method="POST" action="login.php">
Email: <input type="email" name="email" required><br><br>
Password: <input type="password" name="password" required><br><br>
<button type="submit">Login</button>
</form>

🔴 Step 6: Dashboard (Protected Page)

📁 dashboard.php

<?php
session_start();if (!isset($_SESSION['user'])) {
header("Location: login.html");
exit;
}echo "Welcome, " . $_SESSION['user'];
echo "<br><a href='logout.php'>Logout</a>";

🔴 Step 7: Logout

📁 logout.php

<?php
session_start();
session_destroy();header("Location: login.html");

🟠 Step 8: Logging Login Activity (Using Monolog)

👉 Add this inside login.php after successful login:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;$log = new Logger('auth');
$log->pushHandler(new StreamHandler('logs/app.log', Logger::INFO));$log->info("User logged in: " . $email);

🟠 Step 9: Folder Structure (Final)

composer-exam/

├── config/
│ └── db.php
├── src/
├── logs/
├── vendor/

├── register.php
├── register.html
├── login.php
├── login.html
├── dashboard.php
├── logout.php

🔐 Security Best Practices (Important)

  • ✅ Use password_hash() (already done)
  • ✅ Use password_verify()
  • ✅ Use prepared statements (PDO ✔)
  • ✅ Never store plain passwords
  • ✅ Add input validation (can improve)

🚀 Bonus Upgrades (Industry Level)

If you want to go pro level, add:

  • 🔹 CSRF protection
  • 🔹 Email verification
  • 🔹 Forgot password system
  • 🔹 .env (hide DB credentials)
  • 🔹 MVC structure