1. 📦 Project Structure
pgsqlCopyEditprogrammer-portfolio/
├── index.php
├── add_project.php
├── db.php
├── project.php
├── assets/
│ └── css/
│ └── styles.css
2. 🧰 Set Up Local Environment
- Install XAMPP: https://www.apachefriends.org/
- Start Apache & MySQL via XAMPP
- Put project files in
htdocs/
folder
3. 🗄 Create the Database
Step 1: Open phpMyAdmin
Navigate to: http://localhost/phpmyadmin
Step 2: Run SQL
sqlCopyEditCREATE DATABASE portfolio_db;
USE portfolio_db;
CREATE TABLE projects (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
description TEXT,
tech_stack VARCHAR(255),
image_url VARCHAR(255),
project_link VARCHAR(255)
);
4. 🔌 Connect to MySQL (db.php)
phpCopyEdit<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'portfolio_db';
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
?>
5. 🖥 Main Portfolio Page (index.php)
phpCopyEdit<?php include 'db.php'; ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Programmer Portfolio</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container my-5">
<h1 class="text-center mb-4">👨💻 My Projects</h1>
<a href="add_project.php" class="btn btn-success mb-4">Add New Project</a>
<div class="row">
<?php
$result = $conn->query("SELECT * FROM projects");
while ($row = $result->fetch_assoc()):
?>
<div class="col-md-4 mb-4">
<div class="card h-100">
<img src="<?= $row['image_url'] ?>" class="card-img-top" alt="<?= $row['title'] ?>">
<div class="card-body">
<h5 class="card-title"><?= $row['title'] ?></h5>
<p class="card-text"><?= substr($row['description'], 0, 100) ?>...</p>
<p><strong>Tech:</strong> <?= $row['tech_stack'] ?></p>
<a href="project.php?id=<?= $row['id'] ?>" class="btn btn-primary">View</a>
</div>
</div>
</div>
<?php endwhile; ?>
</div>
</div>
</body>
</html>
6. ➕ Add New Project (add_project.php)
phpCopyEdit<?php include 'db.php'; ?>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$title = $_POST['title'];
$desc = $_POST['description'];
$tech = $_POST['tech_stack'];
$image = $_POST['image_url'];
$link = $_POST['project_link'];
$stmt = $conn->prepare("INSERT INTO projects (title, description, tech_stack, image_url, project_link) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param("sssss", $title, $desc, $tech, $image, $link);
$stmt->execute();
header("Location: index.php");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Add Project</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container my-5">
<h2>Add a New Project</h2>
<form method="POST">
<div class="mb-3">
<label for="title" class="form-label">Project Title</label>
<input type="text" name="title" class="form-control" required>
</div>
<div class="mb-3">
<label for="description" class="form-label">Description</label>
<textarea name="description" class="form-control" rows="4" required></textarea>
</div>
<div class="mb-3">
<label for="tech_stack" class="form-label">Tech Stack</label>
<input type="text" name="tech_stack" class="form-control" required>
</div>
<div class="mb-3">
<label for="image_url" class="form-label">Image URL</label>
<input type="text" name="image_url" class="form-control" required>
</div>
<div class="mb-3">
<label for="project_link" class="form-label">Project Link</label>
<input type="text" name="project_link" class="form-control" required>
</div>
<button type="submit" class="btn btn-success">Add Project</button>
<a href="index.php" class="btn btn-secondary">Back</a>
</form>
</div>
</body>
</html>
7. 🔍 Single Project View (project.php)
phpCopyEdit<?php include 'db.php'; ?>
<?php
$id = $_GET['id'];
$stmt = $conn->prepare("SELECT * FROM projects WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
$project = $result->fetch_assoc();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><?= $project['title'] ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container my-5">
<a href="index.php" class="btn btn-secondary mb-4">Back</a>
<h2><?= $project['title'] ?></h2>
<img src="<?= $project['image_url'] ?>" class="img-fluid mb-3" alt="<?= $project['title'] ?>">
<p><strong>Description:</strong> <?= nl2br($project['description']) ?></p>
<p><strong>Tech Stack:</strong> <?= $project['tech_stack'] ?></p>
<a href="<?= $project['project_link'] ?>" class="btn btn-primary" target="_blank">Visit Project</a>
</div>
</body>
</html>
🧠 Optional Improvements
- Add skills, about section, contact form
- Add user login
- Add admin dashboard
- Use image upload instead of URL
- Style using custom CSS or Bootstrap themes
🚀 How to Run
- Copy folder to
htdocs/
- Start Apache & MySQL in XAMPP
- Visit:
http://localhost/programmer-portfolio