Uko ndani ya app. Fungua kwenye browser kwa muonekano na downloads bora.
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:

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:

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

Professional Locations Management System

Locations Management System

Manage Regions, Districts, Wards/Kata and Streets/Mitaa professionally.

https://faulink.com
= e($message) ?>
= e($error) ?>
Regions

= e($totalRegions) ?>

Districts

= e($totalDistricts) ?>

Wards/Kata

= e($totalWards) ?>

Streets/Mitaa

= e($totalStreets) ?>

Add New Record

= e(ucfirst($tab)) ?> List

ID Region Region District Region District Ward/Kata Region District Ward/Kata Street/Mtaa Action
No records found.
= (int)$row['id'] ?> = e($row['region_name']) ?> = e($row['region_name']) ?> = e($row['district_name']) ?>

Professional PHP Locations Management System

Manage regions, districts, wards and streets with security and modern design.

https://faulink.com

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:

https://faulink.com

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.

Quick Actions