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();
?>
= e($totalRegions) ?>
= e($totalDistricts) ?>
= e($totalWards) ?>
= 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. | |||||||||||
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.comHii 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.