çin dönüşümü $str = str_replace('ç', 'ç', $str); $str = str_replace('ü', 'ü', $str); $str = str_replace('ö', 'ö', $str); $str = str_replace('ü', 'ü', $str); $str = str_replace('ı', 'ı', $str); $str = str_replace('ÄŸ', 'ğ', $str); $str = str_replace('ÅŸ', 'ş', $str); } // ħ -> ç dönüşümü (yeni encoding sorunu) $str = str_replace('ħ', 'ç', $str); $str = str_replace('ı', 'ı', $str); $str = str_replace('ÄŸ', 'ğ', $str); $str = str_replace('ÅŸ', 'ş', $str); $str = str_replace('ü', 'ü', $str); $str = str_replace('ö', 'ö', $str); return $str; } // SQL'deki normalize ile aynı hale getiren yardımcı function normalizeForSql($str) { $s = mb_strtolower($str, 'UTF-8'); $replacements = ['ı' => 'i', 'ğ' => 'g', 'ü' => 'u', 'ş' => 's', 'ö' => 'o', 'ç' => 'c']; return strtr($s, $replacements); } // Türkçe title case — İ/ı harflerine dikkat eder function trTitleCase($str) { if (empty($str)) return $str; $str = mb_strtolower(trim($str), 'UTF-8'); $first = mb_substr($str, 0, 1, 'UTF-8'); $rest = mb_substr($str, 1, null, 'UTF-8'); $upper = ($first === 'i') ? 'İ' : mb_strtoupper($first, 'UTF-8'); return $upper . $rest; } // Türkçe şehir formatlama function formatSehirTR($sehir) { static $sehir_map = [ 'istanbul'=>'İstanbul','izmir'=>'İzmir','ankara'=>'Ankara','antalya'=>'Antalya', 'bursa'=>'Bursa','adana'=>'Adana','gaziantep'=>'Gaziantep','konya'=>'Konya', 'kayseri'=>'Kayseri','mersin'=>'Mersin','diyarbakir'=>'Diyarbakır', 'sanliurfa'=>'Şanlıurfa','eskisehir'=>'Eskişehir','trabzon'=>'Trabzon', 'samsun'=>'Samsun','mugla'=>'Muğla','malatya'=>'Malatya','van'=>'Van', 'mardin'=>'Mardin','balikesir'=>'Balıkesir','manisa'=>'Manisa', 'nevsehir'=>'Nevşehir','bolu'=>'Bolu','artvin'=>'Artvin','rize'=>'Rize', 'edirne'=>'Edirne','canakkale'=>'Çanakkale','aydin'=>'Aydın','isparta'=>'Isparta', 'denizli'=>'Denizli','kutahya'=>'Kütahya','afyonkarahisar'=>'Afyonkarahisar', 'usak'=>'Uşak','bilecik'=>'Bilecik','burdur'=>'Burdur','karabuk'=>'Karabük', 'cankiri'=>'Çankırı','kastamonu'=>'Kastamonu','corum'=>'Çorum','amasya'=>'Amasya', 'tokat'=>'Tokat','sivas'=>'Sivas','erzurum'=>'Erzurum','erzincan'=>'Erzincan', 'kars'=>'Kars','agri'=>'Ağrı','igdir'=>'Iğdır','hakkari'=>'Hakkâri', 'sirnak'=>'Şırnak','siirt'=>'Siirt','batman'=>'Batman','bitlis'=>'Bitlis', 'mus'=>'Muş','bingol'=>'Bingöl','tunceli'=>'Tunceli','elazig'=>'Elâzığ', 'ardahan'=>'Ardahan','bayburt'=>'Bayburt','giresun'=>'Giresun', 'gumushane'=>'Gümüşhane','ordu'=>'Ordu','sinop'=>'Sinop','bartin'=>'Bartın', 'duzce'=>'Düzce','sakarya'=>'Sakarya','kocaeli'=>'Kocaeli','tekirdag'=>'Tekirdağ', 'kirklareli'=>'Kırklareli','yalova'=>'Yalova','osmaniye'=>'Osmaniye', 'kahramanmaras'=>'Kahramanmaraş','hatay'=>'Hatay','kilis'=>'Kilis', 'nigde'=>'Niğde','aksaray'=>'Aksaray','kirsehir'=>'Kırşehir', 'kirikkale'=>'Kırıkkale','karaman'=>'Karaman','yozgat'=>'Yozgat', 'paris'=>'Paris','tokyo'=>'Tokyo','roma'=>'Roma','londra'=>'Londra', 'berlin'=>'Berlin','madrid'=>'Madrid','barselona'=>'Barselona', 'amsterdam'=>'Amsterdam','munih'=>'Münih','almanya'=>'Almanya', 'fransa'=>'Fransa','italya'=>'İtalya','japonya'=>'Japonya', 'ingiltere'=>'İngiltere','ispanya'=>'İspanya','yunanistan'=>'Yunanistan', 'bulgaristan'=>'Bulgaristan','amerika'=>'Amerika', ]; $lower = mb_strtolower(trim($sehir), 'UTF-8'); return $sehir_map[$lower] ?? trTitleCase($sehir); } // Şehir listesini formatlı hale getir (virgülle ayrılmış) function formatSehirListesi($str) { if (empty($str)) return $str; $parts = explode(',', $str); return implode(', ', array_map(function($p) { return formatSehirTR(trim($p)); }, $parts)); } // Kampanyaları çek try { $db = getDBConnection(); $stmt = $db->prepare("SELECT * FROM kampanyalar WHERE durum = 'aktif' ORDER BY eklenme_tarihi DESC"); $stmt->execute(); $kampanyalar = $stmt->fetchAll(); } catch (PDOException $e) { $kampanyalar = []; } // Turları çek try { // Filtre parametrelerini al $filtreler = []; // Kalkış şehri filtresi (çoklu seçim) if (!empty($_GET['kalkis_sehri'])) { $kalkis_raw = $_GET['kalkis_sehri']; $kalkis_list = is_array($kalkis_raw) ? $kalkis_raw : explode(',', $kalkis_raw); $kalkis_list = array_values(array_filter(array_map('fixEncoding', $kalkis_list))); $filtreler['kalkis_sehri'] = $kalkis_list; } // Varış noktası filtresi (çoklu seçim) if (!empty($_GET['varis_noktasi'])) { $varis_raw = $_GET['varis_noktasi']; $varis_list = is_array($varis_raw) ? $varis_raw : explode(',', $varis_raw); $varis_list = array_values(array_filter(array_map('fixEncoding', $varis_list))); $filtreler['varis_noktasi'] = $varis_list; } // Ulaşım aracı filtresi (çoklu seçim) if (!empty($_GET['ulasim'])) { $filtreler['ulasim'] = explode(',', $_GET['ulasim']); } // Tur tipi filtresi (çoklu seçim) if (!empty($_GET['tur_tipi'])) { $filtreler['tur_tipi'] = explode(',', $_GET['tur_tipi']); } // Yurt seçimi filtresi if (!empty($_GET['yurt_secimi'])) { $filtreler['yurt_secimi'] = $_GET['yurt_secimi']; } // Arama terimi (q) filtresi $q = isset($_GET['q']) ? trim($_GET['q']) : ''; if (!empty($q)) { $q = fixEncoding($q); $normalized_q = normalizeForSql($q); } else { $normalized_q = ''; } // Fiyat aralığı filtresi $min_fiyat = !empty($_GET['min_fiyat']) ? (float)$_GET['min_fiyat'] : null; $max_fiyat = !empty($_GET['max_fiyat']) ? (float)$_GET['max_fiyat'] : null; // Kategori filtresi if (!empty($_GET['kategori'])) { $filtreler['kategori'] = $_GET['kategori']; } // Dönem filtresi if (!empty($_GET['donem'])) { $filtreler['donem'] = $_GET['donem']; } // PC Arama Çubuğundan Gelen Dönem (period) if (!empty($_GET['period'])) { $filtreler['period'] = $_GET['period']; } // SQL sorgusu oluştur // Sadece en az 1 gelecek başlangıç tarihi olan turları göster $sql = " SELECT DISTINCT t.*, r.ad, r.soyad, r.id as acente_id, (SELECT tt.baslangic_tarihi FROM tur_tarihleri tt WHERE tt.tur_id = t.id AND tt.durum = 'aktif' AND tt.baslangic_tarihi >= CURDATE() ORDER BY tt.baslangic_tarihi ASC LIMIT 1) as baslangic_tarihi, (SELECT tt.baslangic_saati FROM tur_tarihleri tt WHERE tt.tur_id = t.id AND tt.durum = 'aktif' AND tt.baslangic_tarihi >= CURDATE() ORDER BY tt.baslangic_tarihi ASC LIMIT 1) as baslangic_saati, (SELECT tt.bitis_tarihi FROM tur_tarihleri tt WHERE tt.tur_id = t.id AND tt.durum = 'aktif' AND tt.baslangic_tarihi >= CURDATE() ORDER BY tt.baslangic_tarihi ASC LIMIT 1) as bitis_tarihi, (SELECT GROUP_CONCAT(DISTINCT tks.sehir ORDER BY tks.sehir SEPARATOR ', ') FROM tur_kalkis_sehirleri tks WHERE tks.tur_id = t.id) as kalkis_sehirleri, (SELECT COUNT(*) FROM tur_tarihleri tt2 WHERE tt2.tur_id = t.id AND tt2.durum = 'aktif' AND tt2.baslangic_tarihi >= CURDATE()) as toplam_tarih FROM turlar t LEFT JOIN roller r ON t.ekleyen_acente = r.id WHERE t.durum = 'aktif' AND EXISTS ( SELECT 1 FROM tur_tarihleri tt_check WHERE tt_check.tur_id = t.id AND tt_check.durum = 'aktif' AND tt_check.baslangic_tarihi >= CURDATE() ) "; $params = []; // Metin araması (q) - Daha geniş kapsamlı (Başlık, Açıklama, Kalkış, Varış) if (!empty($q)) { $sql .= " AND ( t.tur_adi LIKE ? OR t.aciklama LIKE ? OR t.varis_noktasi LIKE ? OR EXISTS ( SELECT 1 FROM tur_kalkis_sehirleri tks_q WHERE tks_q.tur_id = t.id AND ( tks_q.sehir LIKE ? OR LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tks_q.sehir, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) LIKE ? ) ) OR EXISTS ( SELECT 1 FROM tur_varis_noktalari tvn_q WHERE tvn_q.tur_id = t.id AND ( tvn_q.sehir LIKE ? OR LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tvn_q.sehir, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) LIKE ? ) ) )"; $params[] = "%$q%"; $params[] = "%$q%"; $params[] = "%$q%"; $params[] = "%$q%"; // Kalkış ham $params[] = "%" . $normalized_q . "%"; // Kalkış normalize $params[] = "%$q%"; // Varış ham $params[] = "%" . $normalized_q . "%"; // Varış normalize } // Kalkış şehri filtresi if (!empty($filtreler['kalkis_sehri'])) { $placeholders = implode(',', array_fill(0, count($filtreler['kalkis_sehri']), '?')); $sql .= " AND EXISTS ( SELECT 1 FROM tur_kalkis_sehirleri tks2 WHERE tks2.tur_id = t.id AND LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tks2.sehir, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) IN ($placeholders) )"; $params = array_merge($params, $filtreler['kalkis_sehri']); } // Varış noktası filtresi if (!empty($filtreler['varis_noktasi'])) { $varis_raw_list = is_array($filtreler['varis_noktasi']) ? $filtreler['varis_noktasi'] : explode(',', $filtreler['varis_noktasi']); $varis_raw_list = array_values(array_filter(array_map('fixEncoding', $varis_raw_list))); // Kapsamlı ülke-şehir mapping'i $ulke_sehir_map = [ // Asya 'cin' => ['pekin', 'sangay', 'beijing', 'shanghai'], 'japonya' => ['tokyo', 'kyoto', 'osaka'], 'tayland' => ['bangkok', 'phuket', 'chiang mai'], 'hindistan' => ['mumbai', 'delhi', 'bangalore'], 'guney kore' => ['seoul', 'busan'], 'singapur' => ['singapore'], 'malezya' => ['kuala lumpur', 'penang'], 'endonezya' => ['jakarta', 'bali'], // Avrupa 'italya' => ['roma', 'milan', 'venedik', 'floransa', 'napoli'], 'fransa' => ['paris', 'nice', 'lyon', 'marseille'], 'ispanya' => ['madrid', 'barselona', 'sevilla', 'valencia'], 'almanya' => ['berlin', 'munih', 'hamburg', 'frankfurt'], 'ingiltere' => ['londra', 'manchester', 'edinburg', 'birmingham'], 'yunanistan' => ['atina', 'selanik', 'santorini'], 'bulgaristan' => ['sofya', 'plovdiv'], 'romanya' => ['bukres', 'cluj'], 'bosna hersek' => ['sarajevo', 'mostar'], 'sirbistan' => ['belgrad', 'novi sad'], 'makedonya' => ['uskup', 'ohrid'], 'hollanda' => ['amsterdam', 'rotterdam'], 'belcika' => ['bruksel', 'antwerp'], 'avusturya' => ['vienna', 'salzburg'], 'isvicre' => ['zurich', 'geneva'], 'isvec' => ['stockholm', 'gothenburg'], 'norvec' => ['oslo', 'bergen'], 'danimarka' => ['copenhagen', 'aarhus'], 'finlandiya' => ['helsinki', 'tampere'], 'izlanda' => ['reykjavik', 'akureyri'], 'irlanda' => ['dublin', 'cork'], 'portekiz' => ['lisbon', 'porto'], 'cekya' => ['prague', 'brno'], 'macaristan' => ['budapest', 'debrecen'], 'polonya' => ['warsaw', 'krakow'], 'rusya' => ['moscow', 'st petersburg'], // Amerika 'amerika' => ['new york', 'los angeles', 'chicago', 'miami'], 'kanada' => ['toronto', 'vancouver', 'montreal', 'calgary'], 'arjantin' => ['buenos aires', 'cordoba', 'mendoza'], 'brezilya' => ['rio de janeiro', 'sao paulo', 'salvador'], 'meksika' => ['mexico city', 'cancun', 'guadalajara'], // Afrika 'misir' => ['kahire', 'alexandria', 'luxor'], 'guney afrika' => ['cape town', 'johannesburg', 'durban'], 'fas' => ['casablanca', 'marrakech', 'rabat'], // Okyanusya 'avustralya' => ['sydney', 'melbourne', 'brisbane', 'perth'], 'yeni zelanda' => ['auckland', 'wellington', 'christchurch'] ]; $expanded = []; foreach ($varis_raw_list as $item) { $normalized = normalizeForSql($item); $mapped = $ulke_sehir_map[$normalized] ?? [$normalized]; $mapped_list = is_array($mapped) ? $mapped : [$mapped]; foreach ($mapped_list as $m) { $expanded[] = $m; } } $expanded = array_values(array_unique(array_filter($expanded))); $expanded = array_map('normalizeForSql', $expanded); if (!empty($expanded)) { $placeholders = rtrim(str_repeat('?,', count($expanded)), ','); // Ülke adı keyword'lerini de tur_adi'nda ara (tur_varis_noktalari kaydı olmayan turlar için) $ulke_keywords_for_search = []; foreach ($varis_raw_list as $item) { $normalized_item = normalizeForSql($item); if (isset($ulke_sehir_map[$normalized_item])) { $ulke_keywords_for_search[] = $normalized_item; } } if (!empty($ulke_keywords_for_search)) { $like_conditions = []; $like_params = []; foreach ($ulke_keywords_for_search as $kw) { $like_conditions[] = "LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(t.tur_adi, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) LIKE ?"; $like_params[] = '%' . $kw . '%'; } $sql .= " AND ( EXISTS ( SELECT 1 FROM tur_varis_noktalari tvn2 WHERE tvn2.tur_id = t.id AND LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tvn2.sehir, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) IN ($placeholders) ) OR (" . implode(' OR ', $like_conditions) . ") )"; $params = array_merge($params, $expanded, $like_params); } else { // Doğrudan şehir adı araması — tur_varis_noktalari'nda yoksa tur adından da ara $like_conditions_direct = []; $like_params_direct = []; foreach ($expanded as $exp_city) { $like_conditions_direct[] = "LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(t.tur_adi, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) LIKE ?"; $like_params_direct[] = '%' . $exp_city . '%'; } $sql .= " AND ( EXISTS ( SELECT 1 FROM tur_varis_noktalari tvn2 WHERE tvn2.tur_id = t.id AND LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tvn2.sehir, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) IN ($placeholders) ) OR (" . implode(' OR ', $like_conditions_direct) . ") )"; $params = array_merge($params, $expanded, $like_params_direct); } } } // Ulaşım aracı filtresi (çoklu seçim) if (!empty($filtreler['ulasim'])) { if (is_array($filtreler['ulasim'])) { $placeholders = str_repeat('?,', count($filtreler['ulasim']) - 1) . '?'; $sql .= " AND t.ulasim_araci IN ($placeholders)"; $params = array_merge($params, $filtreler['ulasim']); } else { $sql .= " AND t.ulasim_araci = ?"; $params[] = $filtreler['ulasim']; } } // Tur tipi filtresi (çoklu seçim) if (!empty($filtreler['tur_tipi'])) { if (is_array($filtreler['tur_tipi'])) { $placeholders = str_repeat('?,', count($filtreler['tur_tipi']) - 1) . '?'; $sql .= " AND t.tur_tipi IN ($placeholders)"; $params = array_merge($params, $filtreler['tur_tipi']); } else { $sql .= " AND t.tur_tipi = ?"; $params[] = $filtreler['tur_tipi']; } } // Yurt seçimi filtresi if (!empty($filtreler['yurt_secimi'])) { $sql .= " AND t.yurt_secimi = ?"; $params[] = $filtreler['yurt_secimi']; } // Kategori filtresi if (!empty($filtreler['kategori'])) { $sql .= " AND t.kategori = ?"; $params[] = $filtreler['kategori']; } // Dönem filtresi if (!empty($filtreler['donem'])) { // Dönem formatı: "eylul2025" -> ay=9, yil=2025 $donem = $filtreler['donem']; if (preg_match('/(\w+)(\d{4})/', $donem, $matches)) { $ay_adi = $matches[1]; $yil = $matches[2]; $ay_map = [ 'ocak' => 1, 'subat' => 2, 'mart' => 3, 'nisan' => 4, 'mayis' => 5, 'haziran' => 6, 'temmuz' => 7, 'agustos' => 8, 'eylul' => 9, 'ekim' => 10, 'kasim' => 11, 'aralik' => 12 ]; if (isset($ay_map[$ay_adi])) { $ay = $ay_map[$ay_adi]; $sql .= " AND EXISTS ( SELECT 1 FROM tur_tarihleri tt WHERE tt.tur_id = t.id AND tt.durum = 'aktif' AND MONTH(tt.baslangic_tarihi) = ? AND YEAR(tt.baslangic_tarihi) = ? )"; $params[] = $ay; $params[] = $yil; } } } // Period filtresi (AY Numarası veya YYYY-MM formatı) if (!empty($filtreler['period'])) { if (is_numeric($filtreler['period']) && $filtreler['period'] >= 1 && $filtreler['period'] <= 12) { // Sadece ay numarası geliyorsa (index.php'den) $sql .= " AND EXISTS ( SELECT 1 FROM tur_tarihleri tt3 WHERE tt3.tur_id = t.id AND tt3.durum = 'aktif' AND MONTH(tt3.baslangic_tarihi) = ? )"; $params[] = $filtreler['period']; } else { // Varsayılan YYYY-MM formatı gelirse $sql .= " AND EXISTS ( SELECT 1 FROM tur_tarihleri tt3 WHERE tt3.tur_id = t.id AND tt3.durum = 'aktif' AND DATE_FORMAT(tt3.baslangic_tarihi, '%Y-%m') = ? )"; $params[] = $filtreler['period']; } } // Fiyat aralığı filtresi if ($min_fiyat !== null || $max_fiyat !== null) { $sql .= " AND ("; $fiyat_conditions = []; if ($min_fiyat !== null) { $fiyat_conditions[] = "COALESCE(t.indirimli_fiyat, t.normal_fiyat) >= ?"; $params[] = $min_fiyat; } if ($max_fiyat !== null) { $fiyat_conditions[] = "COALESCE(t.indirimli_fiyat, t.normal_fiyat) <= ?"; $params[] = $max_fiyat; } $sql .= implode(" AND ", $fiyat_conditions) . ")"; } // Sıralama türüne göre ORDER BY ekle switch ($sort_type) { case 'tarih': $sql .= " ORDER BY baslangic_tarihi ASC"; break; case 'fiyat-artan': $sql .= " ORDER BY COALESCE(t.indirimli_fiyat, t.normal_fiyat) ASC"; break; case 'fiyat-azalan': $sql .= " ORDER BY COALESCE(t.indirimli_fiyat, t.normal_fiyat) DESC"; break; case 'alfabetik': $sql .= " ORDER BY t.tur_adi ASC"; break; case 'tum-turlar': default: $sql .= " ORDER BY t.eklenme_tarihi DESC"; break; } $stmt = $db->prepare($sql); $stmt->execute($params); $turlar = $stmt->fetchAll(); // Kullanıcıya özel indirimleri çek $kullaniciya_ozel_indirimler = []; $musteri_giris = isset($_SESSION['kullanici_tipi']) && $_SESSION['kullanici_tipi'] === 'musteri'; $musteri_id = isset($_SESSION['kullanici_id']) ? $_SESSION['kullanici_id'] : null; if ($musteri_giris && !empty($turlar)) { try { $tur_ids = array_column($turlar, 'id'); if (!empty($tur_ids)) { $placeholders = implode(',', array_fill(0, count($tur_ids), '?')); $indirim_stmt = $db->prepare(" SELECT tur_id, indirim_tipi, indirim_degeri, gecerlilik_tarihi, aciklama FROM musteri_indirimleri WHERE musteri_id = ? AND tur_id IN ($placeholders) AND durum = 'aktif' AND (gecerlilik_tarihi IS NULL OR gecerlilik_tarihi >= CURDATE()) "); $indirim_stmt->execute(array_merge([$musteri_id], $tur_ids)); $indirimler = $indirim_stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($indirimler as $indirim) { $kullaniciya_ozel_indirimler[$indirim['tur_id']] = $indirim; } } } catch (PDOException $e) { // Hata durumunda devam et } } echo ""; if (!empty($turlar)) { echo ""; echo ""; } // Toplam tur sayısını hesapla $toplam_tur_sayisi = count($turlar); // Veritabanından turlar başarıyla çekildi } catch (PDOException $e) { $turlar = []; $toplam_tur_sayisi = 0; } // Kampanya görsellerini çek try { $stmt = $db->prepare("SELECT * FROM kampanya_gorselleri ORDER BY eklenme_tarihi DESC LIMIT 6"); $stmt->execute(); $kampanya_gorselleri = $stmt->fetchAll(); } catch (PDOException $e) { $kampanya_gorselleri = []; } ?> Tur Filtreleme - NEX14
$kampanya): ?>
<?php echo htmlspecialchars($kampanya['baslik']); ?>

$kampanya): ?>
Kış Fırsatları

Kış Fırsatlarını Kaçırmayın! %30'a Varan İndirimler

Erken Rezervasyon

Erken Rezervasyon Avantajları İle Yerinizi Ayırtın

'Kültür & Tarih', 'doga_trekking' => 'Doğa & Trekking', 'macera_aktivite' => 'Macera & Aktivite', 'gastronomi_lezzet' => 'Gastronomi & Lezzet', 'tekne_deniz' => 'Tekne & Deniz', 'inanc_hacilik' => 'İnanç & Hacılık', 'saglik_termal' => 'Sağlık & Termal', 'fotografcilik' => 'Fotoğrafçılık', 'eko_turizm' => 'Eko Turizm', 'luks_vip' => 'Lüks & VIP', 'aile_cocuk' => 'Aile & Çocuk', 'genclik_backpacker' => 'Gençlik & Backpacker', 'romantik_balayi' => 'Romantik & Balayı', 'gunluk_kisa' => 'Günlük / Kısa', 'uzun_sureli' => 'Uzun Süreli', 'kulturel_etkinlik' => 'Kültürel Etkinlik', 'spor_aktif' => 'Spor & Aktif', 'egitim_workshop' => 'Eğitim & Workshop', 'endustriyel_is' => 'Endüstriyel & İş', 'tema_park' => 'Tema Park', 'alisveris_outlet' => 'Alışveriş & Outlet', 'kirsal_agro' => 'Kırsal & Agro', 'tarihi_miras' => 'Tarihi Miras', 'ozel_tematik' => 'Özel Tematik' ]; $kategori_gorselleri = [ 'kultur_tarih' => 'kultur.png', 'doga_trekking' => 'doga.png', 'macera_aktivite' => 'macera.png', 'gastronomi_lezzet' => 'gastronomi.png', 'tekne_deniz' => 'tekne.png', 'inanc_hacilik' => 'inanc.png', 'saglik_termal' => 'termal.png', 'fotografcilik' => 'fotograf.png', 'eko_turizm' => 'eko.png', 'luks_vip' => 'VIP.png', 'aile_cocuk' => 'aile.png', 'genclik_backpacker' => 'genc.png', 'romantik_balayi' => 'romantik.png', 'gunluk_kisa' => 'gunluk.png', 'uzun_sureli' => 'uzun.png', 'kulturel_etkinlik' => 'festival.png', 'spor_aktif' => 'spor.png', 'egitim_workshop' => 'egitim.png', 'endustriyel_is' => 'isgezisi.png', 'tema_park' => 'temapark.png', 'alisveris_outlet' => 'alisveris.png', 'kirsal_agro' => 'kirsal.png', 'tarihi_miras' => 'tarih.png', 'ozel_tematik' => 'ozel.png' ]; ?>
Filtrele

'Kültür & Tarih', 'doga_trekking' => 'Doğa & Trekking', 'macera_aktivite' => 'Macera & Aktivite', 'gastronomi_lezzet' => 'Gastronomi & Lezzet', 'tekne_deniz' => 'Tekne & Deniz', 'inanc_hacilik' => 'İnanç & Hacılık', 'saglik_termal' => 'Sağlık & Termal', 'fotografcilik' => 'Fotoğrafçılık', 'eko_turizm' => 'Eko-turizm', 'luks_vip' => 'Lüks & VIP', 'aile_cocuk' => 'Aile & Çocuk', 'genclik_backpacker' => 'Gençlik & Backpacker', 'romantik_balayi' => 'Romantik & Balayı', 'gunluk_kisa' => 'Günlük / Kısa', 'uzun_sureli' => 'Uzun Süreli', 'kulturel_etkinlik' => 'Kültürel Etkinlik', 'spor_aktif' => 'Spor & Aktif', 'egitim_workshop' => 'Eğitim & Workshop', 'endustriyel_is' => 'Endüstriyel & İş', 'tema_park' => 'Tema Park', 'alisveris_outlet' => 'Alışveriş & Outlet', 'kirsal_agro' => 'Kırsal & Agro', 'tarihi_miras' => 'Tarihi Miras', 'ozel_tematik' => 'Özel Tematik' ]; $kategori_adi = $kategori_isimleri[$_GET['kategori']] ?? ucfirst(str_replace('_', ' ', $_GET['kategori'])); echo $kategori_adi . ' Turları - Sonuçları Filtrele'; } else { echo 'Sonuçları Filtrele'; } ?>

Kalkış Şehirleri

'Japonya', 'kyoto' => 'Japonya', 'osaka' => 'Japonya', 'roma' => 'İtalya', 'milan' => 'İtalya', 'venedik' => 'İtalya', 'floransa' => 'İtalya', 'paris' => 'Fransa', 'nice' => 'Fransa', 'lyon' => 'Fransa', 'madrid' => 'İspanya', 'barselona' => 'İspanya', 'sevilla' => 'İspanya', 'berlin' => 'Almanya', 'münih' => 'Almanya', 'hamburg' => 'Almanya', 'londra' => 'İngiltere', 'manchester' => 'İngiltere', 'edinburg' => 'İngiltere', 'atina' => 'Yunanistan', 'selanik' => 'Yunanistan', 'sofya' => 'Bulgaristan', 'bükreş' => 'Romanya', 'sarajevo' => 'Bosna Hersek', 'belgrad' => 'Sırbistan', 'üsküp' => 'Makedonya', 'buenos_aires' => 'Arjantin', 'rio_de_janeiro' => 'Brezilya', 'sao_paulo' => 'Brezilya', 'pekin' => 'Çin', 'şangay' => 'Çin', 'bangkok' => 'Tayland', 'phuket' => 'Tayland', 'mumbai' => 'Hindistan', 'delhi' => 'Hindistan', 'kahire' => 'Mısır', 'cape_town' => 'Güney Afrika', 'new_york' => 'Amerika', 'los_angeles' => 'Amerika', 'toronto' => 'Kanada', 'vancouver' => 'Kanada', 'sydney' => 'Avustralya', 'melbourne' => 'Avustralya' ]; if ($tur_tipi == 'yurt_disi') { // Yurtdışı turları için sadece yurtdışı kalkış şehirleri // Yozgat'ı Türkiye şehirleri listesinden çıkar (yurtdışı turu var) $turkiye_sehirleri_yurtdisi = array_diff($turkiye_sehirleri, ['yozgat']); $stmt = $db->prepare(" SELECT DISTINCT tks.sehir, COUNT(t.id) as tur_sayisi FROM tur_kalkis_sehirleri tks INNER JOIN turlar t ON tks.tur_id = t.id AND t.durum = 'aktif' AND t.tur_tipi = 'yurt_disi' WHERE tks.sehir IS NOT NULL AND tks.sehir != '' AND LOWER(tks.sehir) NOT IN ('" . implode("','", $turkiye_sehirleri_yurtdisi) . "') GROUP BY tks.sehir ORDER BY tks.sehir "); } else { // Diğer tur tipleri için sadece o tur tipinin kalkış şehirleri $stmt = $db->prepare(" SELECT DISTINCT tks.sehir, COUNT(t.id) as tur_sayisi FROM tur_kalkis_sehirleri tks INNER JOIN turlar t ON tks.tur_id = t.id AND t.durum = 'aktif' AND t.tur_tipi = ? WHERE tks.sehir IS NOT NULL AND tks.sehir != '' GROUP BY tks.sehir ORDER BY tks.sehir "); $stmt->execute([$tur_tipi]); } } else { // Normal durumda tüm kalkış şehirlerini göster $sql_kalkis = " SELECT DISTINCT tks.sehir, COUNT(t.id) as tur_sayisi FROM tur_kalkis_sehirleri tks LEFT JOIN turlar t ON tks.tur_id = t.id AND t.durum = 'aktif' WHERE tks.sehir IS NOT NULL AND tks.sehir != '' "; $params_kalkis = []; // Kategori filtresi varsa ekle if (!empty($_GET['kategori'])) { $sql_kalkis .= " AND t.kategori = ?"; $params_kalkis[] = $_GET['kategori']; } // Yurt seçimi filtresi varsa ekle if (!empty($_GET['yurt_secimi'])) { $sql_kalkis .= " AND t.yurt_secimi = ?"; $params_kalkis[] = $_GET['yurt_secimi']; } // Varış noktası seçiliyse, sadece o varışa giden turların kalkış şehirlerini göster if (!empty($_GET['varis_noktasi'])) { $varis_raw = $_GET['varis_noktasi']; $varis_norm = normalizeForSql(fixEncoding($varis_raw)); $ulke_sehir_map_for_departure = [ 'cin' => ['pekin', 'sangay'], 'japonya' => ['tokyo', 'kyoto', 'osaka'], 'almanya' => ['berlin', 'munih', 'hamburg'], 'fransa' => ['paris', 'lyon', 'marseille'], 'italya' => ['roma', 'milan', 'venedik'], 'ispanya' => ['madrid', 'barcelona', 'sevilla'], 'ingiltere' => ['londra', 'manchester', 'birmingham'], 'amerika' => ['new york', 'los angeles', 'chicago'], ]; $secilen_sehirler = $ulke_sehir_map_for_departure[$varis_norm] ?? [$varis_norm]; if (count($secilen_sehirler) > 1) { $conditions = []; foreach ($secilen_sehirler as $city) { $conditions[] = "LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tvn.sehir, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) = LOWER(?)"; $params_kalkis[] = $city; } $sql_kalkis .= " AND EXISTS (SELECT 1 FROM tur_varis_noktalari tvn WHERE tvn.tur_id = t.id AND (" . implode(' OR ', $conditions) . "))"; } else { $sql_kalkis .= " AND EXISTS (SELECT 1 FROM tur_varis_noktalari tvn WHERE tvn.tur_id = t.id AND LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tvn.sehir, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) = LOWER(?))"; $params_kalkis[] = $secilen_sehirler[0]; } } $sql_kalkis .= " GROUP BY tks.sehir ORDER BY tks.sehir"; $stmt = $db->prepare($sql_kalkis); $stmt->execute($params_kalkis); } $stmt->execute(); $kalkis_sehirleri = $stmt->fetchAll(); if (empty($kalkis_sehirleri) && isset($_GET['tur_tipi']) && !empty($_GET['tur_tipi'])) { $tur_tipi_adi = [ 'gunubirlik' => 'Günübirlik', 'konaklamali' => 'Konaklamalı', 'yurt_disi' => 'Yurtdışı', 'bolgesel' => 'Bölgesel' ]; $tip_adi = $tur_tipi_adi[$_GET['tur_tipi']] ?? $_GET['tur_tipi']; echo '

Henüz ' . $tip_adi . ' kalkış şehri bulunmuyor.

'; } else { foreach ($kalkis_sehirleri as $sehir) { $sehir_adi = htmlspecialchars(formatSehirTR($sehir['sehir'])); // Türkçe formatlı $tur_sayisi = $sehir['tur_sayisi']; $sehir_value = strtolower(str_replace(['ı', 'ğ', 'ü', 'ş', 'ö', 'ç'], ['i', 'g', 'u', 's', 'o', 'c'], $sehir_adi)); $selected_kalkis = []; if (isset($_GET['kalkis_sehri'])) { $selected_kalkis = is_array($_GET['kalkis_sehri']) ? $_GET['kalkis_sehri'] : explode(',', $_GET['kalkis_sehri']); } $checked = (in_array($sehir_value, $selected_kalkis) || (!empty($normalized_q) && $sehir_value == $normalized_q)) ? 'checked' : ''; // Yurtdışı turları için ülke bilgisi ekle $display_text = $sehir_adi . ' (' . $tur_sayisi . ')'; if (isset($_GET['tur_tipi']) && $_GET['tur_tipi'] == 'yurt_disi' && isset($kalkis_ulke_sehir_map[$sehir_value])) { $display_text = $sehir_adi . ' (' . $kalkis_ulke_sehir_map[$sehir_value] . ') (' . $tur_sayisi . ')'; } echo '
'; echo ''; echo '
'; } } } catch (PDOException $e) { echo '

Şehir bilgileri yüklenemedi.

'; } ?>

Varış Noktaları

prepare($sql_varis); $stmt_varis->execute(); } elseif ($yurt_secimi === 'yurtdisi') { // yurt_secimi=yurtdisi: konaklamalı/günübirlik vb. + yurt dışı — tur_tipi değil, yurt_secimi ile filtrele $sql_varis = " SELECT DISTINCT tvn.sehir, COUNT(t.id) as tur_sayisi FROM tur_varis_noktalari tvn INNER JOIN turlar t ON tvn.tur_id = t.id AND t.durum = 'aktif' AND t.yurt_secimi = 'yurtdisi' WHERE tvn.sehir IS NOT NULL AND tvn.sehir != '' AND {$tvn_norm} NOT IN ('{$turkiye_sql_list}') GROUP BY tvn.sehir ORDER BY tvn.sehir "; $stmt_varis = $db->prepare($sql_varis); $stmt_varis->execute(); } elseif ($yurt_secimi == 'yurtici') { // Yurt içi turları için sadece Türkiye şehirleri $sql_varis = " SELECT DISTINCT tvn.sehir, COUNT(t.id) as tur_sayisi FROM tur_varis_noktalari tvn INNER JOIN turlar t ON tvn.tur_id = t.id AND t.durum = 'aktif' AND t.yurt_secimi = 'yurtici' WHERE tvn.sehir IS NOT NULL AND tvn.sehir != '' AND LOWER(tvn.sehir) IN ('" . implode("','", $turkiye_sehirleri) . "') "; $params_varis = []; // Kategori filtresi varsa ekle if (!empty($_GET['kategori'])) { $sql_varis .= " AND t.kategori = ?"; $params_varis[] = $_GET['kategori']; } $sql_varis .= " GROUP BY tvn.sehir ORDER BY tvn.sehir"; $stmt_varis = $db->prepare($sql_varis); $stmt_varis->execute($params_varis); } else { // Diğer tur tipleri için sadece o tur tipinin varış noktaları $sql_varis = " SELECT DISTINCT tvn.sehir, COUNT(t.id) as tur_sayisi FROM tur_varis_noktalari tvn INNER JOIN turlar t ON tvn.tur_id = t.id AND t.durum = 'aktif' AND t.tur_tipi = ? WHERE tvn.sehir IS NOT NULL AND tvn.sehir != '' "; $params_varis = [$tur_tipi]; // Kategori filtresi varsa ekle if (!empty($_GET['kategori'])) { $sql_varis .= " AND t.kategori = ?"; $params_varis[] = $_GET['kategori']; } $sql_varis .= " GROUP BY tvn.sehir ORDER BY tvn.sehir"; $stmt_varis = $db->prepare($sql_varis); $stmt_varis->execute($params_varis); } } else { // Normal durumda tüm varış noktalarını göster $sql_varis = " SELECT DISTINCT tvn.sehir, COUNT(t.id) as tur_sayisi FROM tur_varis_noktalari tvn INNER JOIN turlar t ON tvn.tur_id = t.id AND t.durum = 'aktif' WHERE tvn.sehir IS NOT NULL AND tvn.sehir != '' "; $params_varis = []; // Kategori filtresi varsa ekle if (!empty($_GET['kategori'])) { $sql_varis .= " AND t.kategori = ?"; $params_varis[] = $_GET['kategori']; } // Yurt seçimi filtresi varsa ekle if (!empty($_GET['yurt_secimi'])) { $sql_varis .= " AND t.yurt_secimi = ?"; $params_varis[] = $_GET['yurt_secimi']; } // Varış noktası filtresi varsa ekle (sadece o şehri göster) if (!empty($_GET['varis_noktasi'])) { $sql_varis .= " AND LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tvn.sehir, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c')) = LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(?, 'ı', 'i'), 'ğ', 'g'), 'ü', 'u'), 'ş', 's'), 'ö', 'o'), 'ç', 'c'))"; $params_varis[] = $_GET['varis_noktasi']; } $sql_varis .= " GROUP BY tvn.sehir ORDER BY tvn.sehir"; $stmt_varis = $db->prepare($sql_varis); $stmt_varis->execute($params_varis); } // Varış noktaları sonuçlarını çek if (isset($stmt_varis)) { $varis_noktalari = $stmt_varis->fetchAll(); } else { $varis_noktalari = []; } // Fallback: yurt_disi seçiliyken boş ise basit sorgu ile çek if (empty($varis_noktalari) && isset($_GET['yurt_secimi']) && $_GET['yurt_secimi'] === 'yurtdisi') { $sql_fallback = " SELECT DISTINCT tvn.sehir, COUNT(t.id) as tur_sayisi FROM tur_varis_noktalari tvn INNER JOIN turlar t ON tvn.tur_id = t.id AND t.durum = 'aktif' AND t.yurt_secimi = 'yurtdisi' WHERE tvn.sehir IS NOT NULL AND tvn.sehir != '' GROUP BY tvn.sehir ORDER BY tvn.sehir "; $stmt_fb = $db->prepare($sql_fallback); $stmt_fb->execute(); $varis_noktalari = $stmt_fb->fetchAll(); } // Fallback 2: tur_varis_noktalari'nda kaydı olmayan yurtdışı turları // tur adından ülke çıkararak filtre'ye ekle (save_tour [] bug'ı nedeniyle eksik kalan turlar) if (isset($_GET['yurt_secimi']) && $_GET['yurt_secimi'] === 'yurtdisi') { $ulke_keywords = [ 'almanya' => 'Almanya', 'germany' => 'Almanya', 'fransa' => 'Fransa', 'france' => 'Fransa', 'italya' => 'İtalya', 'italy' => 'İtalya', 'ispanya' => 'İspanya', 'spain' => 'İspanya', 'ingiltere' => 'İngiltere', 'england' => 'İngiltere', 'japonya' => 'Japonya', 'japan' => 'Japonya', 'yunanistan' => 'Yunanistan', 'greece' => 'Yunanistan', 'bulgaristan' => 'Bulgaristan', 'misir' => 'Mısır', 'amerika' => 'Amerika', 'abd' => 'Amerika', 'cin' => 'Çin', 'china' => 'Çin', 'tayland' => 'Tayland', 'hindistan' => 'Hindistan', 'avustralya' => 'Avustralya', 'kanada' => 'Kanada', 'romanya' => 'Romanya', 'sirbistan' => 'Sırbistan', 'bosna' => 'Bosna Hersek', 'makedonya' => 'Makedonya', 'brezilya' => 'Brezilya', 'arjantin' => 'Arjantin', 'guney afrika' => 'Güney Afrika', ]; // tur_varis_noktalari'nda kaydı olmayan yurtdışı turları bul $sql_orphan = " SELECT t.id, t.tur_adi FROM turlar t WHERE t.durum = 'aktif' AND t.yurt_secimi = 'yurtdisi' AND t.id NOT IN (SELECT DISTINCT tur_id FROM tur_varis_noktalari) "; $stmt_orphan = $db->prepare($sql_orphan); $stmt_orphan->execute(); $orphan_turlar = $stmt_orphan->fetchAll(); // Mevcut varış noktalarını sehir bazlı indexle $existing_cities = []; foreach ($varis_noktalari as $vn) { $existing_cities[mb_strtolower($vn['sehir'], 'UTF-8')] = true; } foreach ($orphan_turlar as $ot) { $tur_adi_lower = mb_strtolower($ot['tur_adi'], 'UTF-8'); foreach ($ulke_keywords as $keyword => $ulke_adi) { if (mb_strpos($tur_adi_lower, $keyword) !== false) { $ulke_lower = mb_strtolower($ulke_adi, 'UTF-8'); if (!isset($existing_cities[$ulke_lower]) && !isset($existing_cities[$keyword])) { $varis_noktalari[] = ['sehir' => $ulke_adi, 'tur_sayisi' => 1]; $existing_cities[$ulke_lower] = true; } else { // Mevcut kayıttaki tur sayısını artır foreach ($varis_noktalari as &$vn) { if (mb_strtolower($vn['sehir'], 'UTF-8') === $ulke_lower || mb_strtolower($vn['sehir'], 'UTF-8') === $keyword) { $vn['tur_sayisi']++; break; } } unset($vn); } break; } } } } // Fallback 3: tur_varis_noktalari'nda kaydı olmayan TÜM turları // tur adından şehir/ülke çıkararak filtre'ye ekle if (true) { $sehir_keywords_all = array_merge( $turkiye_sehirleri, ['almanya','fransa','italya','ispanya','ingiltere','japonya','yunanistan', 'bulgaristan','amerika','cin','tayland','hindistan','avustralya','kanada', 'romanya','sirbistan','bosna','makedonya','brezilya','arjantin','misir', 'berlin','paris','roma','tokyo','londra','madrid','barselona','amsterdam', 'munih','hamburg','frankfurt','milano','venedik','floransa','nice','lyon'] ); $yurt_secimi_filter = $_GET['yurt_secimi'] ?? ''; $orphan_sql = "SELECT t.id, t.tur_adi FROM turlar t WHERE t.durum = 'aktif' AND t.id NOT IN (SELECT DISTINCT tur_id FROM tur_varis_noktalari)"; $orphan_params = []; if ($yurt_secimi_filter) { $orphan_sql .= " AND t.yurt_secimi = ?"; $orphan_params[] = $yurt_secimi_filter; } $stmt_orph = $db->prepare($orphan_sql); $stmt_orph->execute($orphan_params); $orphan_all = $stmt_orph->fetchAll(); $existing_check = []; foreach ($varis_noktalari as $vn) { $existing_check[mb_strtolower($vn['sehir'], 'UTF-8')] = true; } foreach ($orphan_all as $ot) { $adi_lower = mb_strtolower($ot['tur_adi'], 'UTF-8'); // Türkçe karakter normalize $adi_norm = str_replace(['ı','ğ','ü','ş','ö','ç'], ['i','g','u','s','o','c'], $adi_lower); foreach ($sehir_keywords_all as $kw) { if (mb_strpos($adi_norm, $kw) !== false) { // Şehir adını title case yap $sehir_display = formatSehirTR($kw); $kw_lower = mb_strtolower($kw, 'UTF-8'); if (!isset($existing_check[$kw_lower])) { $varis_noktalari[] = ['sehir' => $sehir_display, 'tur_sayisi' => 1]; $existing_check[$kw_lower] = true; } else { foreach ($varis_noktalari as &$vnr) { if (mb_strtolower($vnr['sehir'], 'UTF-8') === $kw_lower) { $vnr['tur_sayisi']++; break; } } unset($vnr); } break; // İlk eşleşen şehirle yetinle } } } } if (empty($varis_noktalari) && ((isset($_GET['tur_tipi']) && !empty($_GET['tur_tipi'])) || (isset($_GET['yurt_secimi']) && !empty($_GET['yurt_secimi'])))) { $tur_tipi_adi = [ 'gunubirlik' => 'Günübirlik', 'konaklamali' => 'Konaklamalı', 'yurt_disi' => 'Yurtdışı', 'bolgesel' => 'Bölgesel' ]; $yurt_secimi_adi = [ 'yurtici' => 'Yurt İçi', 'yurtdisi' => 'Yurt Dışı', 'yurtici_yurtdisi' => 'Yurt İçi ve Yurt Dışı' ]; if (isset($_GET['yurt_secimi']) && !empty($_GET['yurt_secimi'])) { $tip_adi = $yurt_secimi_adi[$_GET['yurt_secimi']] ?? $_GET['yurt_secimi']; } else { $tip_adi = $tur_tipi_adi[$_GET['tur_tipi']] ?? $_GET['tur_tipi']; } echo '

Henüz ' . $tip_adi . ' varış noktası bulunmuyor.

'; } else { // Şehirleri ülkelere grupla (yurtdışı için) $ulke_gruplari = []; $sehir_ulke_map = [ 'pekin' => 'Çin', 'şangay' => 'Çin', 'sangay' => 'Çin', 'tokyo' => 'Japonya', 'kyoto' => 'Japonya', 'osaka' => 'Japonya', 'roma' => 'İtalya', 'milan' => 'İtalya', 'venedik' => 'İtalya', 'floransa' => 'İtalya', 'paris' => 'Fransa', 'lyon' => 'Fransa', 'nice' => 'Fransa', 'madrid' => 'İspanya', 'barselona' => 'İspanya', 'barcelona' => 'İspanya', 'sevilla' => 'İspanya', 'londra' => 'İngiltere', 'manchester' => 'İngiltere', 'edinburg' => 'İngiltere', 'berlin' => 'Almanya', 'münih' => 'Almanya', 'munich' => 'Almanya', 'munchen' => 'Almanya', 'hamburg' => 'Almanya', 'frankfurt' => 'Almanya', 'stuttgart' => 'Almanya', 'köln' => 'Almanya', 'koln' => 'Almanya', 'düsseldorf' => 'Almanya', 'dusseldorf' => 'Almanya', 'hannover' => 'Almanya', 'nürnberg' => 'Almanya', 'nuremberg' => 'Almanya', 'almanya' => 'Almanya', 'germany' => 'Almanya', 'new york' => 'Amerika', 'los angeles' => 'Amerika' ]; foreach ($varis_noktalari as $nokta) { $sehir_raw = trim((string) ($nokta['sehir'] ?? '')); $sehir_title = formatSehirTR($sehir_raw); $sehir_adi = htmlspecialchars($sehir_title); $tur_sayisi = $nokta['tur_sayisi']; $sehir_lower = mb_strtolower($sehir_raw, 'UTF-8'); // Yurtdışı turları için ülke gruplaması yap if (isset($_GET['yurt_secimi']) && $_GET['yurt_secimi'] == 'yurtdisi') { $ulke = $sehir_ulke_map[$sehir_lower] ?? $sehir_ulke_map[str_replace('̇', '', $sehir_lower)] ?? $sehir_adi; if (!isset($ulke_gruplari[$ulke])) { $ulke_gruplari[$ulke] = ['tur_sayisi' => 0, 'sehirler' => []]; } $ulke_gruplari[$ulke]['tur_sayisi'] += $tur_sayisi; $ulke_gruplari[$ulke]['sehirler'][] = $sehir_adi; } else { // Yurtiçi turları için normal gösterim $sehir_value = strtolower(str_replace(['ı', 'ğ', 'ü', 'ş', 'ö', 'ç'], ['i', 'g', 'u', 's', 'o', 'c'], $sehir_adi)); $selected_varis = (isset($_GET['varis_noktasi']) && (is_array($_GET['varis_noktasi']) ? in_array($sehir_value, $_GET['varis_noktasi']) : in_array($sehir_value, explode(',', $_GET['varis_noktasi'])))) || (!empty($normalized_q) && $sehir_value == $normalized_q); $checked = $selected_varis ? 'checked' : ''; echo '
'; echo ''; echo '
'; } } // Yurtdışı turları için ülke gruplarını göster if (isset($_GET['yurt_secimi']) && $_GET['yurt_secimi'] == 'yurtdisi' && !empty($ulke_gruplari)) { foreach ($ulke_gruplari as $ulke => $bilgi) { $ulke_value = strtolower(str_replace(['ı', 'ğ', 'ü', 'ş', 'ö', 'ç'], ['i', 'g', 'u', 's', 'o', 'c'], $ulke)); $selected_varis = []; if (isset($_GET['varis_noktasi'])) { $selected_varis = is_array($_GET['varis_noktasi']) ? $_GET['varis_noktasi'] : explode(',', $_GET['varis_noktasi']); } $checked = in_array($ulke_value, $selected_varis) ? 'checked' : ''; echo '
'; echo ''; echo '
'; } } } } catch (PDOException $e) { echo '

Varış noktası bilgileri yüklenemedi.

'; } ?>

Ulaşım Tipi

prepare($sql_ulasim); $stmt->execute($params_ulasim); $ulasim_araclari = $stmt->fetchAll(); // Ulaşım aracı isimleri $ulasim_isimleri = [ 'otobus' => 'Otobüslü', 'tren' => 'Trenli', 'ucak' => 'Uçaklı', 'karisik' => 'Karışık' ]; foreach ($ulasim_araclari as $arac) { $arac_kodu = $arac['ulasim_araci']; $arac_adi = $ulasim_isimleri[$arac_kodu] ?? ucfirst($arac_kodu); $tur_sayisi = $arac['tur_sayisi']; $checked = ''; if (isset($_GET['ulasim'])) { $selected_ulasim = explode(',', $_GET['ulasim']); $checked = in_array($arac_kodu, $selected_ulasim) ? 'checked' : ''; } echo '
'; echo ''; echo '
'; } } catch (PDOException $e) { echo '

Ulaşım araçları bilgileri yüklenemedi.

'; } ?>

Tur Süresi

prepare($sql_tur_suresi); $stmt->execute($params_tur_suresi); $tur_tipleri = $stmt->fetchAll(); // Yurt seçimi bilgilerini de aynı filtreyle çek $sql_yurt_secimi = " SELECT yurt_secimi, COUNT(*) as tur_sayisi FROM turlar WHERE durum = 'aktif' AND yurt_secimi IS NOT NULL "; $params_yurt_secimi = []; // Kategori filtresi varsa ekle if (!empty($_GET['kategori'])) { $sql_yurt_secimi .= " AND kategori = ?"; $params_yurt_secimi[] = $_GET['kategori']; } // Yurt seçimi filtresi varsa ekle if (!empty($_GET['yurt_secimi'])) { $sql_yurt_secimi .= " AND yurt_secimi = ?"; $params_yurt_secimi[] = $_GET['yurt_secimi']; } // Varış noktası filtresini bu listeden hariç tut (tüm seçenekler görünsün) $sql_yurt_secimi .= " GROUP BY yurt_secimi ORDER BY yurt_secimi"; $stmt_yurt = $db->prepare($sql_yurt_secimi); $stmt_yurt->execute($params_yurt_secimi); $yurt_secimleri = $stmt_yurt->fetchAll(); // Tur tipi isimleri $tur_tipi_isimleri = [ 'gunubirlik' => 'Günübirlik', 'konaklamali' => 'Konaklamalı', 'yurt_disi' => 'Yurt Dışı', 'bolgesel' => 'Bölgesel' ]; // Yurt seçimi isimleri $yurt_secimi_isimleri = [ 'yurtici' => 'Yurt İçi', 'yurtdisi' => 'Yurt Dışı', 'yurtici_yurtdisi' => 'Yurt İçi ve Yurt Dışı' ]; // Önce tur tiplerini göster foreach ($tur_tipleri as $tip) { $tip_kodu = $tip['tur_tipi']; $tip_adi = $tur_tipi_isimleri[$tip_kodu] ?? ucfirst($tip_kodu); $tur_sayisi = $tip['tur_sayisi']; $checked = ''; if (isset($_GET['tur_tipi'])) { $selected_tur_tipi = explode(',', $_GET['tur_tipi']); $checked = in_array($tip_kodu, $selected_tur_tipi) ? 'checked' : ''; } echo ''; } } catch (PDOException $e) { echo '

Tur tipi bilgileri yüklenemedi.

'; } ?>

Dönem

prepare($sql_donem); $stmt->execute($params_donem); $donemler = $stmt->fetchAll(); // Ay isimleri $ay_isimleri = [ 1 => 'Ocak', 2 => 'Şubat', 3 => 'Mart', 4 => 'Nisan', 5 => 'Mayıs', 6 => 'Haziran', 7 => 'Temmuz', 8 => 'Ağustos', 9 => 'Eylül', 10 => 'Ekim', 11 => 'Kasım', 12 => 'Aralık' ]; foreach ($donemler as $donem) { $ay = $donem['ay']; $yil = $donem['yil']; $tur_sayisi = $donem['tur_sayisi']; $ay_adi = $ay_isimleri[$ay] ?? 'Bilinmeyen'; $donem_adi = $ay_adi . ' ' . $yil; $donem_value = strtolower($ay_adi) . $yil; $checked = (isset($_GET['donem']) && $_GET['donem'] == $donem_value) ? 'checked' : ''; echo '
'; echo ''; echo '
'; } } catch (PDOException $e) { echo '

Dönem bilgileri yüklenemedi.

'; } ?>

Fiyat Aralığı

prepare($sql_fiyat); $stmt->execute($params_fiyat); $fiyat_araligi = $stmt->fetch(); $min_fiyat = $fiyat_araligi['min_fiyat'] ?? 0; $max_fiyat = $fiyat_araligi['max_fiyat'] ?? 10000; // Fiyat aralığını yuvarla $min_fiyat = floor($min_fiyat / 100) * 100; // Aşağı yuvarla $max_fiyat = ceil($max_fiyat / 100) * 100; // Yukarı yuvarla } catch (PDOException $e) { $min_fiyat = 0; $max_fiyat = 10000; } ?>

tur bulundu
Tüm Turlar
En Yakın Tarih
Fiyata Göre Artan
Fiyata Göre Azalan
A'dan Z'ye
'Kültür & Tarih', 'doga_trekking' => 'Doğa & Trekking', 'macera_aktivite' => 'Macera & Aktivite', 'gastronomi_lezzet' => 'Gastronomi & Lezzet', 'tekne_deniz' => 'Tekne & Deniz', 'inanc_hacilik' => 'İnanç & Hacılık', 'saglik_termal' => 'Sağlık & Termal', 'fotografcilik' => 'Fotoğrafçılık', 'eko_turizm' => 'Eko Turizm', 'luks_vip' => 'Lüks & VIP', 'aile_cocuk' => 'Aile & Çocuk', 'genclik_backpacker' => 'Gençlik & Backpacker', 'romantik_balayi' => 'Romantik & Balayı', 'gunluk_kisa' => 'Günlük / Kısa', 'uzun_sureli' => 'Uzun Süreli', 'kulturel_etkinlik' => 'Kültürel Etkinlik', 'spor_aktif' => 'Spor & Aktif', 'egitim_workshop' => 'Eğitim & Workshop', 'endustriyel_is' => 'Endüstriyel & İş', 'tema_park' => 'Tema Park', 'alisveris_outlet' => 'Alışveriş & Outlet', 'kirsal_agro' => 'Kırsal & Agro', 'tarihi_miras' => 'Tarihi Miras', 'ozel_tematik' => 'Özel Tematik' ]; $kategori_adi = $kategori_isimleri[$tur['kategori']] ?? 'Tur'; ?> '₺', 'TL' => '₺', '₺' => '₺', 'USD' => '$', 'EUR' => '€' ]; $para_birimi = $para_birimi_map[$para_birimi_raw] ?? $para_birimi_raw; $kullaniciya_ozel_indirim = $kullaniciya_ozel_indirimler[$tur['id']] ?? null; $gosterilecek_fiyat = $tur['normal_fiyat'] ?? 0; $eski_fiyat = null; $indirim_mesaji = ''; $size_ozel = false; if ($kullaniciya_ozel_indirim && $tur['normal_fiyat'] > 0) { $base_price = $tur['normal_fiyat']; if ($kullaniciya_ozel_indirim['indirim_tipi'] === 'yuzde') { $indirim_tutari = $base_price * ($kullaniciya_ozel_indirim['indirim_degeri'] / 100); $gosterilecek_fiyat = max(0, $base_price - $indirim_tutari); } else { $gosterilecek_fiyat = max(0, $base_price - $kullaniciya_ozel_indirim['indirim_degeri']); } $eski_fiyat = $base_price; $size_ozel = true; if ($kullaniciya_ozel_indirim['gecerlilik_tarihi']) { $gecerlilik_tarihi_formatted = date('d.m.Y', strtotime($kullaniciya_ozel_indirim['gecerlilik_tarihi'])); $indirim_mesaji = "{$gecerlilik_tarihi_formatted} tarihine kadar geçerli"; } } elseif (!empty($tur['indirimli_fiyat']) && $tur['indirimli_fiyat'] < $tur['normal_fiyat']) { $gosterilecek_fiyat = $tur['indirimli_fiyat']; $eski_fiyat = $tur['normal_fiyat']; } $price_badge_text = number_format($gosterilecek_fiyat, 0, ',', '.') . ' ' . $para_birimi; $duration_text = 'Tur'; if (!empty($tur['baslangic_tarihi'])) { $baslangic_ts = strtotime($tur['baslangic_tarihi']); $bitis_ts = !empty($tur['bitis_tarihi']) ? strtotime($tur['bitis_tarihi']) : $baslangic_ts; $gun_sayisi = max(1, (int)floor(($bitis_ts - $baslangic_ts) / 86400) + 1); if ($gun_sayisi > 1) { $gece_sayisi = $gun_sayisi - 1; $duration_text = $gece_sayisi . ' Gece ' . $gun_sayisi . ' Gün'; } else { $duration_text = '1 Gün'; } } ?> 0 && $gosterilecek_fiyat < $eski_fiyat) { $indirim_orani = round((($eski_fiyat - $gosterilecek_fiyat) / $eski_fiyat) * 100); } ?> 0): ?>
% İNDİRİM
<?php echo htmlspecialchars($tur['tur_adi']); ?> <?php echo htmlspecialchars($tur['tur_adi']); ?>

'Konaklamalı', 'gunubirlik' => 'Günübirlik', 'yurt_disi' => 'Yurt Dışı', 'bolgesel' => 'Bölgesel' ]; $tur_tipi_adi = $tur_tipi_isimleri[$tur['tur_tipi']] ?? 'Tur'; $konaklama_label = ($tur['tur_tipi'] ?? '') === 'gunubirlik' ? 'Günübirlik' : 'Konaklama'; ?>

'Otobüs', 'tren' => 'Tren', 'ucak' => 'Uçak', 'karisik' => 'Karışık' ]; $ulasim_icon_map = [ 'otobus' => 'fas fa-bus', 'tren' => 'fas fa-train', 'ucak' => 'fas fa-plane', 'karisik' => 'fas fa-route' ]; $ulasim_key = $tur['ulasim_araci'] ?? ''; $ulasim_label = $ulasim_map[$ulasim_key] ?? 'Ulaşım'; $ulasim_icon = $ulasim_icon_map[$ulasim_key] ?? 'fas fa-plane'; ?> 'Ocak', 2 => 'Şubat', 3 => 'Mart', 4 => 'Nisan', 5 => 'Mayıs', 6 => 'Haziran', 7 => 'Temmuz', 8 => 'Ağustos', 9 => 'Eylül', 10 => 'Ekim', 11 => 'Kasım', 12 => 'Aralık' ]; $baslangic = strtotime($tur['baslangic_tarihi']); $baslangic_text = date('d', $baslangic) . ' ' . $aylar[(int)date('n', $baslangic)]; $bitis_text = ''; if (!empty($tur['bitis_tarihi'])) { $bitis = strtotime($tur['bitis_tarihi']); $bitis_text = date('d', $bitis) . ' ' . $aylar[(int)date('n', $bitis)]; } $tarih_text = trim($baslangic_text . ($bitis_text ? ' - ' . $bitis_text : '')); } $kalkis = $tur['kalkis_sehirleri'] ?? 'İstanbul'; $sehirler = explode(', ', $kalkis); $kalkis_text = ''; if (count($sehirler) > 2) { $kalkis_text = formatSehirListesi(implode(', ', array_slice($sehirler, 0, 2))) . '...'; } else { $kalkis_text = formatSehirListesi($kalkis); } ?>
📅 'Ocak', 2 => 'Şubat', 3 => 'Mart', 4 => 'Nisan', 5 => 'Mayıs', 6 => 'Haziran', 7 => 'Temmuz', 8 => 'Ağustos', 9 => 'Eylül', 10 => 'Ekim', 11 => 'Kasım', 12 => 'Aralık' ]; $baslangic_tarih = strtotime($tur['baslangic_tarihi']); $baslangic_gun = date('d', $baslangic_tarih); $baslangic_ay = $aylar[(int)date('n', $baslangic_tarih)]; $baslangic = $baslangic_gun . ' ' . $baslangic_ay; if (!empty($tur['bitis_tarihi'])) { $bitis_tarih = strtotime($tur['bitis_tarihi']); $bitis_gun = date('d', $bitis_tarih); $bitis_ay = $aylar[(int)date('n', $bitis_tarih)]; $bitis = $bitis_gun . ' ' . $bitis_ay; } else { $bitis = $baslangic; } // Tarih ve saat göster if (!empty($tur['baslangic_saati'])) { $saat = date('H:i', strtotime($tur['baslangic_saati'])); $tarihSaat = $baslangic . ' ' . $saat; } else { $tarihSaat = $baslangic; } // Tüm turlar için bitiş tarihi de göster (eğer varsa) if (!empty($tur['bitis_tarihi'])) { $bitis_tarih = strtotime($tur['bitis_tarihi']); $bitis_gun = date('d', $bitis_tarih); $bitis_ay = $aylar[(int)date('n', $bitis_tarih)]; $bitis = $bitis_gun . ' ' . $bitis_ay; if (!empty($tur['bitis_saati'])) { $bitis_saat = date('H:i', strtotime($tur['bitis_saati'])); $bitisSaat = $bitis . ' ' . $bitis_saat; } else { $bitisSaat = $bitis; } echo $tarihSaat . ' - ' . $bitisSaat; } else { echo $tarihSaat; } } else { echo 'Tarih belirtilmemiş'; } ?>
👤 Yükleyen Acente: İncele
'Kültür & Tarih', 'doga_trekking' => 'Doğa & Trekking', 'macera_aktivite' => 'Macera & Aktivite', 'gastronomi_lezzet' => 'Gastronomi & Lezzet', 'tekne_deniz' => 'Tekne Deniz', 'inanc_hacilik' => 'İnanç Hacılık', 'saglik_termal' => 'Sağlık Termal', 'fotografcilik' => 'Fotoğrafçılık', 'eko_turizm' => 'Eko Turizm', 'luks_vip' => 'Lüks VIP', 'aile_cocuk' => 'Aile Çocuk', 'genclik_backpacker' => 'Gençlik Backpacker', 'romantik_balayi' => 'Romantik Balayı', 'gunluk_kisa' => 'Günlük Kısa', 'uzun_sureli' => 'Uzun Süreli', 'kulturel_etkinlik' => 'Kültürel Etkinlik', 'spor_aktif' => 'Spor Aktif', 'egitim_workshop' => 'Eğitim Workshop', 'endustriyel_is' => 'Endüstriyel İş', 'tema_park' => 'Tema Park', 'alisveris_outlet' => 'Alışveriş Outlet', 'kirsal_agro' => 'Kırsal Agro', 'tarihi_miras' => 'Tarihi Miras', 'ozel_tematik' => 'Özel Tematik' ]; $kategori_adi = $kategori_isimleri[$tur['kategori']] ?? ucfirst(str_replace('_', ' ', $tur['kategori'])); echo $kategori_adi . ' Turu'; ?>
Size Özel İndirim
NEX14 Özel
Kişi Başı Fiyat 'den başlayan fiyatlar
'🚌', 'tren' => '🚂', 'ucak' => '✈️', 'karisik' => '🚌✈️' ]; echo $ulasim_ikonlari[$tur['ulasim_araci']] ?? '🚌'; ?> 'Otobüsle', 'tren' => 'Trenle', 'ucak' => 'Uçakla', 'karisik' => 'Otobüs + Uçak' ]; echo 'Gidiş-Dönüş: ' . ($ulasim_isimleri[$tur['ulasim_araci']] ?? 'Otobüsle'); ?>
🌙 'Konaklamalı', 'gunubirlik' => 'Günübirlik', 'yurt_disi' => 'Yurt Dışı', 'bolgesel' => 'Bölgesel' ]; $tur_tipi_adi = $tur_tipi_isimleri[$tur['tur_tipi']] ?? ucfirst($tur['tur_tipi']); echo $tur_tipi_adi; ?>
📅 'Pazar', 1 => 'Pazartesi', 2 => 'Salı', 3 => 'Çarşamba', 4 => 'Perşembe', 5 => 'Cuma', 6 => 'Cumartesi' ]; $gun = $gun_isimleri[date('w', $tarih)]; echo $gun; } else { echo "Pazartesi"; } ?>
📅 1) { echo "Diğer tur tarihleri (" . ($tarih_sayisi - 1) . ")"; } else { echo "Diğer tur tarihleri (0)"; } ?>

Henüz tur bulunamadı.