No properties found in ' . htmlspecialchars($city['city_name']) . '.
';
}
} else {
echo 'City not found.
';
}
} elseif ($type === 'property' && $id > 0) {
// Property search: show details
$stmt = $pdo->prepare('
SELECT p.id, p.name, p.type, p.location, p.description, p.price_per_night,
p.free_breakfast, p.free_cancellation, p.checkin_time, p.checkout_time,
pi.image_path, pr.discount_percentage
FROM properties p
LEFT JOIN property_images pi ON p.id = pi.property_id AND pi.image_type = "main"
LEFT JOIN promotions pr ON p.id = pr.property_id
AND CURRENT_DATE BETWEEN pr.start_date AND pr.end_date
WHERE p.id = :id
');
$stmt->execute([':id' => $id]);
$property = $stmt->fetch(PDO::FETCH_ASSOC);
if ($property) {
$price = $property['price_per_night'];
$discount = $property['discount_percentage'] ?: 5; // 5% BStay Coin default
$discounted_price = $price * (1 - $discount / 100);
$image = $property['image_path'] ?: 'uploads/default.png';
echo '';
echo '
' . htmlspecialchars($property['name']) . '
';
echo '
![' . htmlspecialchars($property['name']) . '](' . htmlspecialchars($image) . ')
';
echo '
';
// Description and Policies
echo '
';
echo '
About
';
echo '
' . htmlspecialchars($property['description']) . '
';
echo '
Policies
';
echo '
';
echo '- Free Breakfast: ' . $property['free_breakfast'] . '
';
echo '- Free Cancellation: ' . $property['free_cancellation'] . '
';
echo '- Check-in: ' . substr($property['checkin_time'], 0, 5) . '
';
echo '- Check-out: ' . substr($property['checkout_time'], 0, 5) . '
';
echo '
';
echo '
';
// Facilities and Nearby Attractions
echo '
';
echo '
Main Facilities
';
$stmt = $pdo->prepare('
SELECT f.name
FROM facilities f
JOIN property_facilities pf ON f.id = pf.facility_id
WHERE pf.property_id = :property_id
');
$stmt->execute([':property_id' => $id]);
$facilities = $stmt->fetchAll(PDO::FETCH_COLUMN);
echo '
';
foreach ($facilities as $facility) {
echo '- ' . htmlspecialchars($facility) . '
';
}
echo '
';
echo '
In the Area
';
$stmt = $pdo->prepare('
SELECT name, distance, distance_unit
FROM nearby_attractions
WHERE property_id = :property_id
');
$stmt->execute([':property_id' => $id]);
$attractions = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo '
';
foreach ($attractions as $attraction) {
echo '- ' . htmlspecialchars($attraction['name']) . ': ' . $attraction['distance'] . ' ' . $attraction['distance_unit'] . '
';
}
echo '
';
echo '
';
echo '
'; // End details-grid
// Room Types
echo '
Room Types
';
$stmt = $pdo->prepare('
SELECT name, price_per_night, quantity
FROM room_types
WHERE property_id = :property_id
');
$stmt->execute([':property_id' => $id]);
$rooms = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo '
';
foreach ($rooms as $room) {
echo '- ' . htmlspecialchars($room['name']) . ': $' . number_format($room['price_per_night'], 2) . ' / night, ' . $room['quantity'] . ' rooms available
';
}
echo '
';
// Pricing and Booking
echo '
Price: $' . number_format($price, 2) . ' / night
';
echo '
' . $discount . '% off with BStay Coin: $' . number_format($discounted_price, 2) . '
';
echo '
Book Now';
echo '
'; // End property-details
} else {
echo 'Property not found.
';
}
} else {
echo 'Invalid search parameters.
';
}
} catch (PDOException $e) {
error_log("Search failed: " . $e->getMessage());
echo 'Error loading results. Please try again later.
';
}
?>