ç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 = []; } ?>
Henüz tur bulunamadı.