May 10, 2026 2 min read

Jinsi ya Kutengeneza Professional Locations Management System kwa PHP, MySQL nfull code step by step

Katika tutorial hii utajifunza jinsi ya kutengeneza Locations Management System kwa kutumia PHP, MySQL, PDO na Bootstrap 5. Mfumo huu utakuwezesha kusimamia Regions, Districts, Wards/Kata na Streets/Mitaa kwa urahisi. Unaweza kuongeza, kuhariri, kufuta, kutafuta taarifa, na kutumia pagination kwa records nyingi.

Mfumo huu ni mzuri kwa projects kama loan system, school system, borrower registration system, hospital system, customer management system, au mfumo wowote unaohitaji kuhifadhi location za watu. Code uliyoleta tayari ina mfumo wa tables, CRUD, CSRF token, search, pagination na Bootstrap UI.

Step 1: Tengeneza Database

Kwanza tengeneza database yako kwenye phpMyAdmin.

CREATE DATABASE borrower_system;
USE borrower_system;
Step 2: Tengeneza File la Connection

Tengeneza file linaitwa:

config_borrower.php

Kisha weka code hii:

<?php
$host = "localhost";
$dbname = "borrower_system";
$username = "root";
$password = "";

try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$username,
$password
);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) {
die("Database connection failed: " . $e->getMessage());
}
?>
Step 3: Tengeneza File Kuu la Mfumo

Tengeneza file:

manage_locations.php

Weka code hii:

<?php
declare(strict_types=1);
session_start();

require_once 'config_borrower.php';

ini_set('display_errors', '1');
error_reporting(E_ALL);

function e($v){
return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
}

if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

$csrf = $_SESSION['csrf_token'];

$message = $_SESSION['message'] ?? '';
$error = $_SESSION['error'] ?? '';

unset($_SESSION['message'], $_SESSION['error']);

$pdo->exec("
CREATE TABLE IF NOT EXISTS regions (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS districts (
id INT AUTO_INCREMENT PRIMARY KEY,
region_id INT NOT NULL,
name VARCHAR(100) NOT NULL,
UNIQUE KEY unique_district(region_id, name),
FOREIGN KEY (region_id) REFERENCES regions(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS wards (
id INT AUTO_INCREMENT PRIMARY KEY,
district_id INT NOT NULL,
name VARCHAR(100) NOT NULL,
UNIQUE KEY unique_ward(district_id, name),
FOREIGN KEY (district_id) REFERENCES districts(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS streets (
id INT AUTO_INCREMENT PRIMARY KEY,
ward_id INT NOT NULL,
name VARCHAR(100) NOT NULL,
UNIQUE KEY unique_street(ward_id, name),
FOREIGN KEY (ward_id) REFERENCES wards(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
");

function redirectBack(): void {
header("Location: " . $_SERVER['PHP_SELF'] . '?' . http_build_query($_GET));
exit;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
try {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
throw new Exception("Security token si sahihi.");
}

$action = $_POST['action'] ?? '';
$type = $_POST['type'] ?? '';
$id = (int)($_POST['id'] ?? 0);
$name = trim($_POST['name'] ?? '');

if ($action !== 'delete' && $name === '') {
throw new Exception("Jina linahitajika.");
}

if ($type === 'region') {
if ($action === 'add') {
$stmt = $pdo->prepare("INSERT INTO regions(name) VALUES(?)");
$stmt->execute([$name]);
$_SESSION['message'] = "Region imeongezwa.";
}

if ($action === 'edit') {
$stmt = $pdo->prepare("UPDATE regions SET name=? WHERE id=?");
$stmt->execute([$name, $id]);
$_SESSION['message'] = "Region imebadilishwa.";
}

if ($action === 'delete') {
$stmt = $pdo->prepare("DELETE FROM regions WHERE id=?");
$stmt->execute([$id]);
$_SESSION['message'] = "Region imefutwa.";
}
}

if ($type === 'district') {
$region_id = (int)($_POST['region_id'] ?? 0);

if ($action === 'add') {
$stmt = $pdo->prepare("INSERT INTO districts(region_id, name) VALUES(?, ?)");
$stmt->execute([$region_id, $name]);
$_SESSION['message'] = "District imeongezwa.";
}

if ($action === 'edit') {
$stmt = $pdo->prepare("UPDATE districts SET region_id=?, name=? WHERE id=?");
$stmt->execute([$region_id, $name, $id]);
$_SESSION['message'] = "District imebadilishwa.";
}

if ($action === 'delete') {
$stmt = $pdo->prepare("DELETE FROM districts WHERE id=?");
$stmt->execute([$id]);
$_SESSION['message'] = "District imefutwa.";
}
}

if ($type === 'ward') {
$district_id = (int)($_POST['district_id'] ?? 0);

if ($action === 'add') {
$stmt = $pdo->prepare("INSERT INTO wards(district_id, name) VALUES(?, ?)");
$stmt->execute([$district_id, $name]);
$_SESSION['message'] = "Ward/Kata imeongezwa.";
}

if ($action === 'edit') {
$stmt = $pdo->prepare("UPDATE wards SET district_id=?, name=? WHERE id=?");
$stmt->execute([$district_id, $name, $id]);
$_SESSION['message'] = "Ward/Kata imebadilishwa.";
}

if ($action === 'delete') {
$stmt = $pdo->prepare("DELETE FROM wards WHERE id=?");
$stmt->execute([$id]);
$_SESSION['message'] = "Ward/Kata imefutwa.";
}
}

if ($type === 'street') {
$ward_id = (int)($_POST['ward_id'] ?? 0);

if ($action === 'add') {
$stmt = $pdo->prepare("INSERT INTO streets(ward_id, name) VALUES(?, ?)");
$stmt->execute([$ward_id, $name]);
$_SESSION['message'] = "Street/Mtaa umeongezwa.";
}

if ($action === 'edit') {
$stmt = $pdo->prepare("UPDATE streets SET ward_id=?, name=? WHERE id=?");
$stmt->execute([$ward_id, $name, $id]);
$_SESSION['message'] = "Street/Mtaa umebadilishwa.";
}

if ($action === 'delete') {
$stmt = $pdo->prepare("DELETE FROM streets WHERE id=?");
$stmt->execute([$id]);
$_SESSION['message'] = "Street/Mtaa umefutwa.";
}
}

} catch (Throwable $e) {
$_SESSION['error'] = $e->getMessage();
}

redirectBack();
}

$tab = $_GET['tab'] ?? 'regions';
$allowedTabs = ['regions', 'districts', 'wards', 'streets'];

if (!in_array($tab, $allowedTabs, true)) {
$tab = 'regions';
}

$q = trim($_GET['q'] ?? '');

$regions = $pdo->query("SELECT * FROM regions ORDER BY name ASC")->fetchAll(PDO::FETCH_ASSOC);

$districts = $pdo->query("
SELECT districts.*, regions.name AS region_name
FROM districts
JOIN regions ON regions.id = districts.region_id
ORDER BY regions.name ASC, districts.name ASC
")->fetchAll(PDO::FETCH_ASSOC);

$wards = $pdo->query("
SELECT wards.*, districts.name AS district_name, regions.name AS region_name
FROM wards
JOIN districts ON districts.id = wards.district_id
JOIN regions ON regions.id = districts.region_id
ORDER BY regions.name ASC, districts.name ASC, wards.name ASC
")->fetchAll(PDO::FETCH_ASSOC);

function getData(PDO $pdo, string $tab, string $q): array {
if ($tab === 'regions') {
$sql = "SELECT * FROM regions WHERE name LIKE ? ORDER BY name ASC";
$stmt = $pdo->prepare($sql);
$stmt->execute(["%$q%"]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

if ($tab === 'districts') {
$sql = "
SELECT districts.*, regions.name AS region_name
FROM districts
JOIN regions ON regions.id = districts.region_id
WHERE districts.name LIKE ? OR regions.name LIKE ?
ORDER BY regions.name ASC, districts.name ASC
";
$stmt = $pdo->prepare($sql);
$stmt->execute(["%$q%", "%$q%"]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

if ($tab === 'wards') {
$sql = "
SELECT wards.*, districts.name AS district_name, regions.name AS region_name
FROM wards
JOIN districts ON districts.id = wards.district_id
JOIN regions ON regions.id = districts.region_id
WHERE wards.name LIKE ? OR districts.name LIKE ? OR regions.name LIKE ?
ORDER BY regions.name ASC, districts.name ASC, wards.name ASC
";
$stmt = $pdo->prepare($sql);
$stmt->execute(["%$q%", "%$q%", "%$q%"]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

$sql = "
SELECT streets.*, wards.name AS ward_name, districts.name AS district_name, regions.name AS region_name
FROM streets
JOIN wards ON wards.id = streets.ward_id
JOIN districts ON districts.id = wards.district_id
JOIN regions ON regions.id = districts.region_id
WHERE streets.name LIKE ? OR wards.name LIKE ? OR districts.name LIKE ? OR regions.name LIKE ?
ORDER BY regions.name ASC, districts.name ASC, wards.name ASC, streets.name ASC
";
$stmt = $pdo->prepare($sql);
$stmt->execute(["%$q%", "%$q%", "%$q%", "%$q%"]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

$data = getData($pdo, $tab, $q);

$totalRegions = $pdo->query("SELECT COUNT(*) FROM regions")->fetchColumn();
$totalDistricts = $pdo->query("SELECT COUNT(*) FROM districts")->fetchColumn();
$totalWards = $pdo->query("SELECT COUNT(*) FROM wards")->fetchColumn();
$totalStreets = $pdo->query("SELECT COUNT(*) FROM streets")->fetchColumn();
?>
<!DOCTYPE html>
<html lang="sw">
<head>
<meta charset="UTF-8">
<title>Professional Locations Management System</title>
<meta name="viewport" content="width=device-width, initial-scale=1">

<meta name="description" content="Professional PHP MySQL Locations Management System for Regions, Districts, Wards and Streets.">
<meta name="keywords" content="PHP, MySQL, Bootstrap, Locations Management System, Regions, Districts, Wards, Streets">

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css&quot; rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css&quot; rel="stylesheet">

<style>
body {
background: #eef2f7;
font-family: Arial, sans-serif;
}

.topbar {
background: linear-gradient(135deg, #0f172a, #1e40af);
color: white;
padding: 35px 0;
border-radius: 0 0 35px 35px;
}

.card-box {
border: 0;
border-radius: 22px;
box-shadow: 0 12px 30px rgba(15, 23, 42, 0.10);
}

.stat-card {
background: white;
border-radius: 20px;
padding: 22px;
box-shadow: 0 8px 22px rgba(0,0,0,0.07);
transition: 0.3s;
}

.stat-card:hover {
transform: translateY(-5px);
}

.stat-card h3 {
font-weight: 900;
color: #1e40af;
}

.nav-pills .nav-link {
color: #0f172a;
font-weight: bold;
border-radius: 14px;
}

.nav-pills .nav-link.active {
background: #1e40af;
}

.form-control,
.form-select {
border-radius: 14px;
}

.btn {
border-radius: 14px;
}

.table th {
background: #0f172a;
color: white;
white-space: nowrap;
}

.footer {
background: #0f172a;
color: white;
padding: 35px 0;
margin-top: 50px;
}

.faulink-btn {
display: inline-block;
background: #16a34a;
color: white;
padding: 13px 28px;
border-radius: 30px;
text-decoration: none;
font-weight: bold;
}

.faulink-btn:hover {
background: #15803d;
color: white;
}
</style>
</head>

<body>

<div class="topbar mb-4">
<div class="container">
<div class="d-flex flex-wrap justify-content-between align-items-center gap-3">
<div>
<h1 class="fw-bold">Locations Management System</h1>
<p class="mb-0">Manage Regions, Districts, Wards/Kata and Streets/Mitaa professionally.</p>
</div>

<a href="https://faulink.com&quot; target="_blank" class="faulink-btn">
https://faulink.com
</a>
</div>
</div>
</div>

<div class="container">

<?php if ($message): ?>
<div class="alert alert-success card-box">
<i class="bi bi-check-circle"></i> <?= e($message) ?>
</div>
<?php endif; ?>

<?php if ($error): ?>
<div class="alert alert-danger card-box">
<i class="bi bi-exclamation-triangle"></i> <?= e($error) ?>
</div>
<?php endif; ?>

<div class="row g-3 mb-4">
<div class="col-md-3">
<div class="stat-card">
<small>Regions</small>
<h3><?= e($totalRegions) ?></h3>
</div>
</div>

<div class="col-md-3">
<div class="stat-card">
<small>Districts</small>
<h3><?= e($totalDistricts) ?></h3>
</div>
</div>

<div class="col-md-3">
<div class="stat-card">
<small>Wards/Kata</small>
<h3><?= e($totalWards) ?></h3>
</div>
</div>

<div class="col-md-3">
<div class="stat-card">
<small>Streets/Mitaa</small>
<h3><?= e($totalStreets) ?></h3>
</div>
</div>
</div>

<div class="card card-box p-3 mb-4">
<ul class="nav nav-pills gap-2">
<?php foreach ($allowedTabs as $t): ?>
<li class="nav-item">
<a class="nav-link <?= $tab === $t ? 'active' : '' ?>" href="?tab=<?= e($t) ?>">
<?= e(ucfirst($t)) ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>

<div class="card card-box p-4 mb-4">
<h4 class="fw-bold mb-3">
<i class="bi bi-plus-circle"></i> Add New Record
</h4>

<form method="POST" class="row g-3">
<input type="hidden" name="csrf_token" value="<?= e($csrf) ?>">
<input type="hidden" name="action" value="add">

<?php if ($tab === 'regions'): ?>
<input type="hidden" name="type" value="region">
<div class="col-md-10">
<input type="text" name="name" class="form-control" placeholder="Enter region name" required>
</div>
<?php endif; ?>

<?php if ($tab === 'districts'): ?>
<input type="hidden" name="type" value="district">

<div class="col-md-5">
<select name="region_id" class="form-select" required>
<option value="">Select Region</option>
<?php foreach ($regions as $r): ?>
<option value="<?= (int)$r['id'] ?>"><?= e($r['name']) ?></option>
<?php endforeach; ?>
</select>
</div>

<div class="col-md-5">
<input type="text" name="name" class="form-control" placeholder="Enter district name" required>
</div>
<?php endif; ?>

<?php if ($tab === 'wards'): ?>
<input type="hidden" name="type" value="ward">

<div class="col-md-5">
<select name="district_id" class="form-select" required>
<option value="">Select District</option>
<?php foreach ($districts as $d): ?>
<option value="<?= (int)$d['id'] ?>">
<?= e($d['region_name'] . ' - ' . $d['name']) ?>
</option>
<?php endforeach; ?>
</select>
</div>

<div class="col-md-5">
<input type="text" name="name" class="form-control" placeholder="Enter ward/kata name" required>
</div>
<?php endif; ?>

<?php if ($tab === 'streets'): ?>
<input type="hidden" name="type" value="street">

<div class="col-md-5">
<select name="ward_id" class="form-select" required>
<option value="">Select Ward/Kata</option>
<?php foreach ($wards as $w): ?>
<option value="<?= (int)$w['id'] ?>">
<?= e($w['region_name'] . ' - ' . $w['district_name'] . ' - ' . $w['name']) ?>
</option>
<?php endforeach; ?>
</select>
</div>

<div class="col-md-5">
<input type="text" name="name" class="form-control" placeholder="Enter street/mtaa name" required>
</div>
<?php endif; ?>

<div class="col-md-2">
<button class="btn btn-primary w-100 fw-bold">
<i class="bi bi-save"></i> Save
</button>
</div>
</form>
</div>

<div class="card card-box p-4">
<div class="d-flex flex-wrap justify-content-between align-items-center gap-3 mb-3">
<h4 class="fw-bold">
<i class="bi bi-table"></i> <?= e(ucfirst($tab)) ?> List
</h4>

<form method="GET" class="d-flex gap-2">
<input type="hidden" name="tab" value="<?= e($tab) ?>">
<input type="text" name="q" value="<?= e($q) ?>" class="form-control" placeholder="Search...">
<button class="btn btn-dark">
<i class="bi bi-search"></i>
</button>
</form>
</div>

<div class="table-responsive">
<table class="table table-bordered table-hover align-middle">
<thead>
<tr>
<th>ID</th>

<?php if ($tab === 'regions'): ?>
<th>Region</th>
<?php elseif ($tab === 'districts'): ?>
<th>Region</th>
<th>District</th>
<?php elseif ($tab === 'wards'): ?>
<th>Region</th>
<th>District</th>
<th>Ward/Kata</th>
<?php else: ?>
<th>Region</th>
<th>District</th>
<th>Ward/Kata</th>
<th>Street/Mtaa</th>
<?php endif; ?>

<th>Action</th>
</tr>
</thead>

<tbody>
<?php if (!$data): ?>
<tr>
<td colspan="10" class="text-center text-muted py-4">
No records found.
</td>
</tr>
<?php endif; ?>

<?php foreach ($data as $row): ?>
<tr>
<form method="POST">
<input type="hidden" name="csrf_token" value="<?= e($csrf) ?>">
<input type="hidden" name="id" value="<?= (int)$row['id'] ?>">

<td><?= (int)$row['id'] ?></td>

<?php if ($tab === 'regions'): ?>
<input type="hidden" name="type" value="region">
<td>
<input type="text" name="name" value="<?= e($row['name']) ?>" class="form-control">
</td>
<?php endif; ?>

<?php if ($tab === 'districts'): ?>
<input type="hidden" name="type" value="district">

<td>
<select name="region_id" class="form-select">
<?php foreach ($regions as $r): ?>
<option value="<?= (int)$r['id'] ?>" <?= (int)$r['id'] === (int)$row['region_id'] ? 'selected' : '' ?>>
<?= e($r['name']) ?>
</option>
<?php endforeach; ?>
</select>
</td>

<td>
<input type="text" name="name" value="<?= e($row['name']) ?>" class="form-control">
</td>
<?php endif; ?>

<?php if ($tab === 'wards'): ?>
<input type="hidden" name="type" value="ward">

<td><?= e($row['region_name']) ?></td>

<td>
<select name="district_id" class="form-select">
<?php foreach ($districts as $d): ?>
<option value="<?= (int)$d['id'] ?>" <?= (int)$d['id'] === (int)$row['district_id'] ? 'selected' : '' ?>>
<?= e($d['region_name'] . ' - ' . $d['name']) ?>
</option>
<?php endforeach; ?>
</select>
</td>

<td>
<input type="text" name="name" value="<?= e($row['name']) ?>" class="form-control">
</td>
<?php endif; ?>

<?php if ($tab === 'streets'): ?>
<input type="hidden" name="type" value="street">

<td><?= e($row['region_name']) ?></td>
<td><?= e($row['district_name']) ?></td>

<td>
<select name="ward_id" class="form-select">
<?php foreach ($wards as $w): ?>
<option value="<?= (int)$w['id'] ?>" <?= (int)$w['id'] === (int)$row['ward_id'] ? 'selected' : '' ?>>
<?= e($w['region_name'] . ' - ' . $w['district_name'] . ' - ' . $w['name']) ?>
</option>
<?php endforeach; ?>
</select>
</td>

<td>
<input type="text" name="name" value="<?= e($row['name']) ?>" class="form-control">
</td>
<?php endif; ?>

<td>
<button name="action" value="edit" class="btn btn-success btn-sm">
<i class="bi bi-pencil-square"></i> Update
</button>

<button name="action" value="delete" class="btn btn-danger btn-sm"
onclick="return confirm('Una uhakika unataka kufuta record hii?')">
<i class="bi bi-trash"></i> Delete
</button>
</td>
</form>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>

</div>

<footer class="footer text-center">
<div class="container">
<h4 class="fw-bold">Professional PHP Locations Management System</h4>
<p>Manage regions, districts, wards and streets with security and modern design.</p>

<a href="https://faulink.com&quot; target="_blank" class="faulink-btn">
https://faulink.com
</a>
</div>
</footer>

</body>
</html>
Step 4: Fungua Mfumo Kwenye Browser

Baada ya kuweka files zako kwenye folder ya project, fungua browser na andika:

http://localhost/borrower_system/manage_locations.php
Step 5: Jinsi ya Kutumia Mfumo

Anza na kuongeza:

Region
District ndani ya Region
Ward/Kata ndani ya District
Street/Mtaa ndani ya Ward/Kata

Mfano:

Region: Mwanza
District: Ilemela
Ward/Kata: Kirumba
Street/Mtaa: Nyasaka
Step 6: Link ya Faulink

Kwenye code nimeweka link kama button nzuri lakini maandishi yake yamebaki kama ulivyotaka:

<a href="https://faulink.com&quot; target="_blank" class="faulink-btn">
https://faulink.com
</a>

Hii itaonekana professional kwenye website, si text ya kawaida.

Conclusion

Mfumo huu ni mzuri kwa developer anayetaka kujenga system professional ya kusimamia maeneo. Una security, Bootstrap design, CRUD operations, search system na database relationships. Pia link ya https://faulink.com imewekwa kama button nzuri lakini imebaki kuonekana vilevile kama link halisi.

🚀 Unahitaji mfumo au website ya biashara?

Chagua huduma hapa chini kisha mteja bofya moja kwa moja kwenda kwenye ukurasa wa huduma au kuwasiliana nasi kwa WhatsApp.

Share this post

Comments

0
No comments yet. Be the first to comment.

Continue Reading

Subscribe

Get new updates

Jiunge upokee posts mpya, tutorials, na updates za mifumo moja kwa moja kwenye email yako.

Faulink Support