| Current Path : /home/h/a/p/happyrenas/myreco.online/includes/ |
Linux webd005.cluster105.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 |
| Current File : /home/h/a/p/happyrenas/myreco.online/includes/fonctions_hebergements.php |
<?
/************************************************
* đ RECHERCHER HEBERGEMENTS PROCHES D'UNE VILLE
************************************************/
function rechercherHebergementsProches($ville_input, $db, $rayon_km = 10) {
global $types_hebergement;
if (empty($ville_input)) {
return ['erreur' => "â Veuillez sĂ©lectionner une ville."];
}
// †Extraction ville / pays
$parts = explode(',', $ville_input);
$ville = trim($parts[0]);
$pays = strtoupper(trim($parts[1] ?? ''));
if (!$ville || !$pays) {
return ['erreur' => "â Format ville invalide. Utilisez : Ville, FR"];
}
// †Point de référence
$ville_ref = $db->get_row("
SELECT latitude, longitude
FROM heb
WHERE city = '" . $db->escape($ville) . "'
AND country_code = '" . $db->escape($pays) . "'
AND latitude IS NOT NULL AND longitude IS NOT NULL
LIMIT 1
");
if (!$ville_ref) {
return ['erreur' => "â Ville non trouvĂ©e ou sans coordonnĂ©es."];
}
$lat_ref = (float) str_replace(",", ".", $ville_ref->latitude);
$lon_ref = (float) str_replace(",", ".", $ville_ref->longitude);
$delta = $rayon_km / 111;
// †Ătape 1 : hĂ©bergements dans la ville
$hebs_ville = $db->get_results("
SELECT * FROM heb
WHERE city = '" . $db->escape($ville) . "'
AND country_code = '" . $db->escape($pays) . "'
AND latitude IS NOT NULL AND longitude IS NOT NULL
");
$hebergements = [];
$ids_deja = [];
foreach ($hebs_ville as $h) {
$h->origine = 'ville';
$hebergements[] = $h;
$ids_deja[] = (int)$h->id;
}
// †Ătape 2 : si moins de 5 â Ă©largir gĂ©ographiquement
if (count($hebergements) < 5) {
$exclusion = $ids_deja ? "AND id NOT IN (" . implode(",", array_map('intval', $ids_deja)) . ")" : "";
$hebs_rect = $db->get_results("
SELECT * FROM heb
WHERE latitude BETWEEN " . ($lat_ref - $delta) . " AND " . ($lat_ref + $delta) . "
AND longitude BETWEEN " . ($lon_ref - $delta) . " AND " . ($lon_ref + $delta) . "
AND latitude IS NOT NULL AND longitude IS NOT NULL
AND country_code = '" . $db->escape($pays) . "'
$exclusion
");
foreach ($hebs_rect as $h) {
$h->origine = 'rectangle';
$hebergements[] = $h;
}
}
// †Calcul distances et préparation résultats
// †Calcul distances et préparation résultats
$resultats = [];
foreach ($hebergements as $heb) {
$lat = (float) str_replace(",", ".", $heb->latitude);
$lon = (float) str_replace(",", ".", $heb->longitude);
$distance = round(calculerlaDistance($lat_ref, $lon_ref, $lat, $lon), 1);
if ($distance > $rayon_km) continue;
$type_hebergement = $heb->type_hebergement ? $types_hebergement[$heb->type_hebergement] : '';
$resultats[] = [
'id' => $heb->id,
'token' => htmlspecialchars($heb->token),
'name' => htmlspecialchars($heb->name),
'postal_code' => htmlspecialchars($heb->postal_code),
'ville' => htmlspecialchars($heb->city),
'country_code' => strtoupper($heb->country_code),
'distance' => $distance,
'photo' => $heb->photo,
'photo_locale' => $heb->photo_locale,
'parking' => $heb->parking ? ucfirst(str_replace('_', ' ', $heb->parking)) : '',
'type_hebergement' => $type_hebergement,
'donnees' => json_decode($heb->donnees_specifiques ?? '[]', true),
'equipements' => json_decode($heb->equipements_json ?? '[]', true),
'activites' => json_decode($heb->activites_json ?? '[]', true),
'tarif_nuit' => $heb->tarif_nuit,
'category' => $heb->category,
'latitude' => $lat,
'longitude' => $lon,
'origine' => $heb->origine ?? 'inconnue'
];
}
// †Tri par distance
usort($resultats, fn($a, $b) => $a['distance'] <=> $b['distance']);
// †Garde les 10 plus proches uniquement
$resultats = array_slice($resultats, 0, 10);
return $resultats;
}
/***********************************
* đ CALCULER DISTANCE HEBERGEMENTS
***********************************/
function calculerlaDistance($lat1, $lon1, $lat2, $lon2) {
$R = 6371;
$lat1 = deg2rad($lat1);
$lon1 = deg2rad($lon1);
$lat2 = deg2rad($lat2);
$lon2 = deg2rad($lon2);
$dLat = $lat2 - $lat1;
$dLon = $lon2 - $lon1;
$a = sin($dLat / 2) ** 2 +
cos($lat1) * cos($lat2) * sin($dLon / 2) ** 2;
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
return $R * $c;
}
/***********************************
* đ METTRE A JOUR VILLES DISTINCT
***********************************/
function miseaJourHeb_villes() {
$db->query("
INSERT IGNORE INTO heb_villes (city, country_code)
SELECT DISTINCT city, country_code FROM heb
WHERE city IS NOT NULL AND city <> ''
");
}
?>