exec(" CREATE TABLE IF NOT EXISTS countries ( id INT AUTO_INCREMENT PRIMARY KEY, name_en VARCHAR(255) NOT NULL, name_ar VARCHAR(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; "); db()->exec(" CREATE TABLE IF NOT EXISTS cities ( id INT AUTO_INCREMENT PRIMARY KEY, country_id INT NOT NULL, name_en VARCHAR(255) NOT NULL, name_ar VARCHAR(255) DEFAULT NULL, UNIQUE KEY uniq_city_country (country_id, name_en), CONSTRAINT fk_cities_country FOREIGN KEY (country_id) REFERENCES countries(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; "); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['add_city'])) { $countryId = (int)($_POST['country_id'] ?? 0); $cityNameEn = trim($_POST['city_name_en'] ?? ''); $cityNameAr = trim($_POST['city_name_ar'] ?? ''); if ($countryId <= 0 || $cityNameEn === '') { $errors[] = 'Please select a country and provide city name (English).'; } else { try { $stmt = db()->prepare("INSERT INTO cities (country_id, name_en, name_ar) VALUES (?, ?, ?)"); $stmt->execute([$countryId, $cityNameEn, $cityNameAr !== '' ? $cityNameAr : null]); $flash = 'City added.'; } catch (Throwable $e) { $errors[] = 'City already exists or could not be saved.'; } } } elseif (isset($_POST['update_city'])) { $cityId = (int)($_POST['city_id'] ?? 0); $countryId = (int)($_POST['country_id'] ?? 0); $cityNameEn = trim($_POST['city_name_en'] ?? ''); $cityNameAr = trim($_POST['city_name_ar'] ?? ''); if ($cityId <= 0 || $countryId <= 0 || $cityNameEn === '') { $errors[] = 'City ID, country and English city name are required.'; } else { try { $stmt = db()->prepare("UPDATE cities SET country_id = ?, name_en = ?, name_ar = ? WHERE id = ?"); $stmt->execute([$countryId, $cityNameEn, $cityNameAr !== '' ? $cityNameAr : null, $cityId]); $flash = 'City updated.'; $editCityId = 0; } catch (Throwable $e) { $errors[] = 'City could not be updated.'; } } } elseif (isset($_POST['delete_city'])) { $cityId = (int)($_POST['city_id'] ?? 0); if ($cityId <= 0) { $errors[] = 'Invalid city selected.'; } else { $stmt = db()->prepare("DELETE FROM cities WHERE id = ?"); $stmt->execute([$cityId]); $flash = 'City deleted.'; $editCityId = 0; } } } $countryNameExpr = $lang === 'ar' ? "COALESCE(NULLIF(co.name_ar, ''), co.name_en)" : "COALESCE(NULLIF(co.name_en, ''), co.name_ar)"; $countryNameExprNoAlias = $lang === 'ar' ? "COALESCE(NULLIF(name_ar, ''), name_en)" : "COALESCE(NULLIF(name_en, ''), name_ar)"; $cityNameExpr = $lang === 'ar' ? "COALESCE(NULLIF(c.name_ar, ''), c.name_en)" : "COALESCE(NULLIF(c.name_en, ''), c.name_ar)"; $countries = db()->query("SELECT id, name_en, name_ar, {$countryNameExprNoAlias} AS display_name FROM countries ORDER BY display_name ASC")->fetchAll(); $cities = db()->query( "SELECT c.id, c.country_id, c.name_en, c.name_ar, {$countryNameExpr} AS country_name, {$cityNameExpr} AS city_name FROM cities c JOIN countries co ON co.id = c.country_id ORDER BY country_name ASC, city_name ASC LIMIT 200" )->fetchAll(); $editingCity = null; if ($editCityId > 0) { foreach ($cities as $city) { if ((int)$city['id'] === $editCityId) { $editingCity = $city; break; } } } render_header('Manage Cities', 'admin', true); ?>
Manage cities and map each city to its country.
No cities added yet.
| ID | Country | City (EN) | City (AR) | Action |
|---|---|---|---|---|
| = e((string)$city['id']) ?> | = e($city['country_name']) ?> | = e($city['name_en']) ?> | = e((string)($city['name_ar'] ?? '-')) ?> | Edit |