false, 'message' => 'Yetkisiz erişim']); exit; } $acente_id = $_SESSION['rol_id']; // ── Veri kaynağı: JSON body veya klasik $_POST ─────────────────────────── // Önce php://input'tan JSON dene (Content-Type kontrolüne gerek yok). // Bu yöntemde post_max_size / max_input_vars limitleri devreye girmez. $post = []; $raw = file_get_contents('php://input'); if ($raw !== false && $raw !== '') { $decoded = json_decode($raw, true); if (is_array($decoded) && !empty($decoded)) { // FormData → JSON dönüşümünde HTML name="field[]" key'leri // "field[]" olarak gelir. PHP $_POST bunu otomatik yapar ama // JSON decode yapmaz. Trailing [] sil, PHP davranışını taklit et. $normalized = []; foreach ($decoded as $k => $v) { $clean = preg_replace('/\[\]$/', '', $k); if (isset($normalized[$clean])) { // Aynı key birden fazla gelirse array yap if (!is_array($normalized[$clean])) { $normalized[$clean] = [$normalized[$clean]]; } if (is_array($v)) { $normalized[$clean] = array_merge($normalized[$clean], $v); } else { $normalized[$clean][] = $v; } } else { $normalized[$clean] = $v; } } $post = $normalized; } } // Fallback: klasik multipart/form-encoded gönderim if (empty($post) && !empty($_POST)) { $post = $_POST; } /** JSON gövdesinde tek değer gelince dizi olmayan alanları PHP dizisine çevirir. */ function nex14_post_to_list($v): array { if ($v === null || $v === '') { return []; } if (is_array($v)) { return array_values($v); } return [$v]; } $action = $post['action'] ?? 'insert'; $tur_id = isset($post['tur_id']) ? (int)$post['tur_id'] : 0; $tur_adi = nex14_tr_baslik_metin(trim((string)($post['tur_adi'] ?? ''))); $tur_tipi = trim((string)($post['tur_tipi'] ?? '')); $kategori = trim((string)($post['kategori'] ?? '')); if ($tur_adi === '' || $tur_tipi === '' || $kategori === '') { $eksik = []; if ($tur_adi === '') $eksik[] = 'tur adı'; if ($tur_tipi === '') $eksik[] = 'tur tipi'; if ($kategori === '') $eksik[] = 'kategori'; echo json_encode([ 'success' => false, 'message' => 'Şu alanlar boş geldi: ' . implode(', ', $eksik) . '.', ], JSON_UNESCAPED_UNICODE); exit; } try { $db = getDBConnection(); $db->beginTransaction(); // Slug oluştur $slug = createSlug($tur_adi); $tempSlug = $slug; $counter = 1; while (true) { $sql = "SELECT id FROM turlar WHERE slug = ?"; $params = [$tempSlug]; if ($action == 'update' && $tur_id > 0) { $sql .= " AND id != ?"; $params[] = $tur_id; } $stmt = $db->prepare($sql); $stmt->execute($params); if ($stmt->fetch()) { $tempSlug = $slug . '-' . $counter; $counter++; } else { break; } } $finalSlug = $tempSlug; $rehber_ihtiyaci = !empty($post['rehber_ihtiyaci']) ? 1 : 0; $arac_ihtiyaci = !empty($post['arac_ihtiyaci']) ? 1 : 0; $normal_fiyat = isset($post['normal_fiyat']) && $post['normal_fiyat'] !== '' ? floatval($post['normal_fiyat']) : 0; $indirimli_fiyat = isset($post['indirimli_fiyat']) && $post['indirimli_fiyat'] !== '' ? floatval($post['indirimli_fiyat']) : 0; $indirim_yuzdesi = 0; $indirim_tutari = 0; if ($normal_fiyat > 0 && $indirimli_fiyat > 0 && $indirimli_fiyat < $normal_fiyat) { $indirim_yuzdesi = (($normal_fiyat - $indirimli_fiyat) / $normal_fiyat) * 100; $indirim_tutari = $normal_fiyat - $indirimli_fiyat; } $yurt_secimi = $post['yurt_secimi'] ?? 'yurtici'; $doviz_kuru = isset($post['doviz_kuru']) && $post['doviz_kuru'] !== '' ? floatval($post['doviz_kuru']) : 1.0000; $bolge_fmt = nex14_tr_baslik_metin(trim((string)($post['bolge'] ?? ''))); $arac_det_fmt = $post['arac_detaylari'] ?? null; if (is_string($arac_det_fmt) && $arac_det_fmt !== '') { $arac_det_fmt = nex14_tr_paragraf($arac_det_fmt); } if ($action == 'update' && $tur_id > 0) { $stmt = $db->prepare(" UPDATE turlar SET tur_adi = ?, slug = ?, tur_tipi = ?, yurt_secimi = ?, kategori = ?, normal_fiyat = ?, indirimli_fiyat = ?, indirim_yuzdesi = ?, indirim_tutari = ?, para_birimi = ?, doviz_kuru = ?, bolge = ?, rehber_ihtiyaci = ?, arac_ihtiyaci = ?, arac_detaylari = ?, ulasim_araci = ?, kapak_resmi = ?, youtube_link = ?, guncellenme_tarihi = NOW() WHERE id = ? AND ekleyen_acente = ? "); $stmt->execute([ $tur_adi, $finalSlug, $tur_tipi, $yurt_secimi, $kategori, $normal_fiyat, $indirimli_fiyat, $indirim_yuzdesi, $indirim_tutari, $post['para_birimi'] ?? 'TRY', $doviz_kuru, $bolge_fmt, $rehber_ihtiyaci, $arac_ihtiyaci, $arac_det_fmt, $post['ulasim_araci'] ?? 'otobus', $post['kapak_resim_yolu'] ?? '', $post['youtube_link'] ?? '', $tur_id, $acente_id ]); $db->prepare("DELETE FROM tur_tarihleri WHERE tur_id = ?")->execute([$tur_id]); $db->prepare("DELETE FROM tur_kalkis_sehirleri WHERE tur_id = ?")->execute([$tur_id]); $db->prepare("DELETE FROM tur_varis_noktalari WHERE tur_id = ?")->execute([$tur_id]); $db->prepare("DELETE FROM tur_cocuk_kurallari WHERE tur_id = ?")->execute([$tur_id]); $db->prepare("DELETE FROM tur_hizmetler WHERE tur_id = ?")->execute([$tur_id]); $db->prepare("DELETE FROM tur_sss WHERE tur_id = ?")->execute([$tur_id]); $db->prepare("DELETE FROM tur_galeri WHERE tur_id = ?")->execute([$tur_id]); $db->prepare("DELETE FROM tur_program_detaylari WHERE tur_id = ?")->execute([$tur_id]); } else { $stmt = $db->prepare(" INSERT INTO turlar ( tur_adi, slug, tur_tipi, yurt_secimi, kategori, normal_fiyat, indirimli_fiyat, indirim_yuzdesi, indirim_tutari, para_birimi, doviz_kuru, bolge, rehber_ihtiyaci, arac_ihtiyaci, arac_detaylari, ulasim_araci, kapak_resmi, youtube_link, ekleyen_acente, durum ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'aktif') "); $stmt->execute([ $tur_adi, $finalSlug, $tur_tipi, $yurt_secimi, $kategori, $normal_fiyat, $indirimli_fiyat, $indirim_yuzdesi, $indirim_tutari, $post['para_birimi'] ?? 'TRY', $doviz_kuru, $bolge_fmt, $rehber_ihtiyaci, $arac_ihtiyaci, $arac_det_fmt, $post['ulasim_araci'] ?? 'otobus', $post['kapak_resim_yolu'] ?? '', $post['youtube_link'] ?? '', $acente_id ]); $tur_id = $db->lastInsertId(); } // Tur tarihlerini kaydet $baslangic_arr = nex14_post_to_list($post['baslangic_tarihi'] ?? null); $bas_saat_arr = nex14_post_to_list($post['baslangic_saati'] ?? null); $bitis_tar_arr = nex14_post_to_list($post['bitis_tarihi'] ?? null); $bitis_saat_arr = nex14_post_to_list($post['bitis_saati'] ?? null); if (!empty($baslangic_arr)) { $stmt = $db->prepare("INSERT INTO tur_tarihleri (tur_id, baslangic_tarihi, baslangic_saati, bitis_tarihi, bitis_saati, tur_tipi) VALUES (?, ?, ?, ?, ?, ?)"); for ($i = 0; $i < count($baslangic_arr); $i++) { if (empty($baslangic_arr[$i])) { continue; } $stmt->execute([ $tur_id, $baslangic_arr[$i], $bas_saat_arr[$i] ?? null, !empty($bitis_tar_arr[$i]) ? $bitis_tar_arr[$i] : null, !empty($bitis_saat_arr[$i]) ? $bitis_saat_arr[$i] : null, $tur_tipi, ]); } } // Kalkış şehirlerini kaydet $sehir_arr = nex14_post_to_list($post['sehir'] ?? null); $kalkis_nokta_arr = nex14_post_to_list($post['kalkis_noktasi'] ?? null); $fiyat_etkisi_arr = nex14_post_to_list($post['fiyat_etkisi'] ?? null); $fiyat_tutari_arr = nex14_post_to_list($post['fiyat_tutari'] ?? null); if (!empty($sehir_arr)) { $stmt = $db->prepare("INSERT INTO tur_kalkis_sehirleri (tur_id, sehir, kalkis_noktasi, fiyat_etkisi, fiyat_tutari, fiyat_yuzdesi) VALUES (?, ?, ?, ?, ?, ?)"); for ($i = 0; $i < count($sehir_arr); $i++) { if (empty($sehir_arr[$i])) { continue; } $ft = $fiyat_tutari_arr[$i] ?? ''; $fiyat_tutari = ($ft !== '' && $ft !== null) ? floatval($ft) : 0; $seh = nex14_tr_baslik_metin(trim((string) $sehir_arr[$i])); $nok = nex14_tr_baslik_metin(trim((string) ($kalkis_nokta_arr[$i] ?? ''))); $stmt->execute([$tur_id, $seh, $nok, $fiyat_etkisi_arr[$i] ?? 'varsayilan', $fiyat_tutari, 0]); } } // Varış noktalarını kaydet (yurtiçi + başlık/açıklama) $varis_arr = nex14_post_to_list($post['varis_sehir'] ?? null); $gun_arr = nex14_post_to_list($post['gun'] ?? null); $baslik_varis_arr = nex14_post_to_list($post['baslik'] ?? null); $aciklama_varis_arr = nex14_post_to_list($post['aciklama'] ?? null); if (!empty($varis_arr)) { $stmt = $db->prepare("INSERT INTO tur_varis_noktalari (tur_id, sehir, gun, baslik, aciklama) VALUES (?, ?, ?, ?, ?)"); for ($i = 0; $i < count($varis_arr); $i++) { if (empty($varis_arr[$i])) { continue; } $vse = nex14_tr_baslik_metin(trim((string) $varis_arr[$i])); $gunVal = isset($gun_arr[$i]) && $gun_arr[$i] !== '' ? (int) $gun_arr[$i] : 1; $bv = isset($baslik_varis_arr[$i]) ? trim((string) $baslik_varis_arr[$i]) : ''; $av = isset($aciklama_varis_arr[$i]) ? trim((string) $aciklama_varis_arr[$i]) : ''; $baslikDb = $bv !== '' ? nex14_tr_baslik_metin($bv) : null; $aciklamaDb = $av !== '' ? nex14_tr_paragraf($av) : null; $stmt->execute([$tur_id, $vse, $gunVal, $baslikDb, $aciklamaDb]); } } // Yurtdışı varış noktalarını kaydet $varis_yd_arr = nex14_post_to_list($post['varis_sehir_yurtdisi'] ?? null); if (!empty($varis_yd_arr)) { $stmt = $db->prepare("INSERT INTO tur_varis_noktalari (tur_id, sehir, gun, baslik, aciklama) VALUES (?, ?, ?, ?, ?)"); for ($i = 0; $i < count($varis_yd_arr); $i++) { if (empty($varis_yd_arr[$i])) { continue; } $city = nex14_tr_baslik_metin(str_replace('_', ' ', trim((string) $varis_yd_arr[$i]))); $gunVal = isset($gun_arr[$i]) && $gun_arr[$i] !== '' ? (int) $gun_arr[$i] : 1; $bv = isset($baslik_varis_arr[$i]) ? trim((string) $baslik_varis_arr[$i]) : ''; $av = isset($aciklama_varis_arr[$i]) ? trim((string) $aciklama_varis_arr[$i]) : ''; $baslikDb = $bv !== '' ? nex14_tr_baslik_metin($bv) : null; $aciklamaDb = $av !== '' ? nex14_tr_paragraf($av) : null; $stmt->execute([$tur_id, $city, $gunVal, $baslikDb, $aciklamaDb]); } } // Çocuk kurallarını kaydet $kural_arr = nex14_post_to_list($post['kural_tipi'] ?? null); if (!empty($kural_arr)) { $stmt = $db->prepare("INSERT INTO tur_cocuk_kurallari (tur_id, kural_tipi, min_yas, max_yas, kac_yetiskine_bir_cocuk, indirim_yuzdesi, indirim_tutari) VALUES (?, ?, ?, ?, ?, ?, ?)"); $min_yas_arr = nex14_post_to_list($post['min_yas'] ?? null); $max_yas_arr = nex14_post_to_list($post['max_yas'] ?? null); $minimum_yas_arr = nex14_post_to_list($post['minimum_yas'] ?? null); $kac_yetiskine_arr = nex14_post_to_list($post['kac_yetiskine_bir_cocuk'] ?? null); $indirim_yuzdesi_arr = nex14_post_to_list($post['indirim_yuzdesi'] ?? null); $indirim_tutari_arr = nex14_post_to_list($post['indirim_tutari'] ?? null); for ($i = 0; $i < count($kural_arr); $i++) { if (empty($kural_arr[$i])) { continue; } $tip = (string) $kural_arr[$i]; if ($tip === 'minimum_yas') { $rawMin = $minimum_yas_arr[$i] ?? ''; $min_yas = ($rawMin !== '' && $rawMin !== null) ? (int) $rawMin : null; $max_yas = null; $kac_yetiskine = 1; $ind_yuz = 0.0; $ind_tutari = 0.0; } else { $rawMin = $min_yas_arr[$i] ?? ''; $rawMax = $max_yas_arr[$i] ?? ''; $min_yas = ($rawMin !== '' && $rawMin !== null) ? (int) $rawMin : null; $max_yas = ($rawMax !== '' && $rawMax !== null) ? (int) $rawMax : null; $kac_raw = $kac_yetiskine_arr[$i] ?? ''; $kac_yetiskine = ($kac_raw !== '' && $kac_raw !== null) ? (int) $kac_raw : 1; $rawYuz = $indirim_yuzdesi_arr[$i] ?? ''; $ind_yuz = ($rawYuz !== '' && $rawYuz !== null) ? (float) $rawYuz : 0.0; $rawTut = $indirim_tutari_arr[$i] ?? ''; $ind_tutari = ($rawTut !== '' && $rawTut !== null) ? (float) $rawTut : 0.0; } $stmt->execute([$tur_id, $tip, $min_yas, $max_yas, $kac_yetiskine, $ind_yuz, $ind_tutari]); } } // Hizmetleri kaydet $dahil_arr = nex14_post_to_list($post['dahil_hizmet'] ?? null); if (!empty($dahil_arr)) { $stmt = $db->prepare("INSERT INTO tur_hizmetler (tur_id, hizmet_tipi, hizmet_adi, siralama) VALUES (?, 'dahil', ?, ?)"); foreach ($dahil_arr as $idx => $h) { if (!empty($h)) { $hn = nex14_tr_baslik_metin(trim((string) $h)); $stmt->execute([$tur_id, $hn, $idx + 1]); } } } $dahil_degil_arr = nex14_post_to_list($post['dahil_degil_hizmet'] ?? null); if (!empty($dahil_degil_arr)) { $stmt = $db->prepare("INSERT INTO tur_hizmetler (tur_id, hizmet_tipi, hizmet_adi, siralama) VALUES (?, 'dahil_degil', ?, ?)"); foreach ($dahil_degil_arr as $idx => $h) { if (!empty($h)) { $hn = nex14_tr_baslik_metin(trim((string) $h)); $stmt->execute([$tur_id, $hn, $idx + 1]); } } } // SSS'leri kaydet $sss_soru_arr = nex14_post_to_list($post['sss_soru'] ?? null); $sss_cevap_arr = nex14_post_to_list($post['sss_cevap'] ?? null); if (!empty($sss_soru_arr)) { $stmt = $db->prepare("INSERT INTO tur_sss (tur_id, soru, cevap, siralama) VALUES (?, ?, ?, ?)"); for ($i = 0; $i < count($sss_soru_arr); $i++) { if (!empty($sss_soru_arr[$i]) && !empty($sss_cevap_arr[$i])) { $soru = nex14_tr_paragraf(trim((string) $sss_soru_arr[$i])); $cevap = nex14_tr_paragraf(trim((string) ($sss_cevap_arr[$i] ?? ''))); $stmt->execute([$tur_id, $soru, $cevap, $i + 1]); } } } // Galeri resimlerini kaydet $galeri_arr = nex14_post_to_list($post['galeri_resim_yolu'] ?? null); if (!empty($galeri_arr)) { $stmt = $db->prepare("INSERT INTO tur_galeri (tur_id, resim_yolu, siralama) VALUES (?, ?, ?)"); foreach ($galeri_arr as $idx => $yol) { if (!empty($yol)) $stmt->execute([$tur_id, $yol, $idx + 1]); } } // Program detaylarını kaydet $program_gun_arr = nex14_post_to_list($post['program_gun'] ?? null); $program_saat_arr = nex14_post_to_list($post['program_saat'] ?? null); $program_baslik_arr = nex14_post_to_list($post['program_baslik'] ?? null); $program_aciklama_arr = nex14_post_to_list($post['program_aciklama'] ?? null); if (!empty($program_gun_arr)) { $stmt = $db->prepare("INSERT INTO tur_program_detaylari (tur_id, gun, saat, baslik, aciklama, siralama) VALUES (?, ?, ?, ?, ?, ?)"); for ($i = 0; $i < count($program_gun_arr); $i++) { if (empty($program_gun_arr[$i])) { continue; } $saat = !empty($program_saat_arr[$i]) ? $program_saat_arr[$i] : null; $pb = nex14_tr_baslik_metin(trim((string) ($program_baslik_arr[$i] ?? ''))); $pa = nex14_tr_paragraf(trim((string) ($program_aciklama_arr[$i] ?? ''))); $stmt->execute([$tur_id, $program_gun_arr[$i], $saat, $pb, $pa, $i + 1]); } } $db->commit(); // ── VDS API senkronizasyonu ───────────────────────────────────────── // Hostinger'deki tur VDS veritabanına da otomatik push edilir // Böylece mobil uygulama anında yeni turu görür syncTourToVDS($tur_id, $db); $msg = ($action == 'update') ? 'Tur başarıyla güncellendi!' : 'Tur başarıyla eklendi!'; echo json_encode(['success' => true, 'message' => $msg, 'tur_id' => $tur_id, 'slug' => $finalSlug]); } catch (Exception $e) { if ($db) $db->rollback(); echo json_encode(['success' => false, 'message' => 'Hata: ' . $e->getMessage()]); } /** * Turu VDS veritabanına senkronize et * Hostinger'den VDS'e doğrudan MySQL bağlantısı olmadığı için * VDS üzerindeki sync endpoint'ine HTTP POST ile veri gönderir */ function syncTourToVDS($tur_id, $db) { try { // Tur verisini çek $stmt = $db->prepare("SELECT * FROM turlar WHERE id = ?"); $stmt->execute([$tur_id]); $tur = $stmt->fetch(PDO::FETCH_ASSOC); if (!$tur) return; // İlişkili verileri çek $stmt = $db->prepare("SELECT * FROM tur_varis_noktalari WHERE tur_id = ?"); $stmt->execute([$tur_id]); $varis = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt = $db->prepare("SELECT * FROM tur_kalkis_sehirleri WHERE tur_id = ?"); $stmt->execute([$tur_id]); $kalkis = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt = $db->prepare("SELECT * FROM tur_tarihleri WHERE tur_id = ?"); $stmt->execute([$tur_id]); $tarihler = $stmt->fetchAll(PDO::FETCH_ASSOC); // Hizmetler $stmt = $db->prepare("SELECT * FROM tur_hizmetler WHERE tur_id = ?"); $stmt->execute([$tur_id]); $hizmetler = $stmt->fetchAll(PDO::FETCH_ASSOC); // SSS $stmt = $db->prepare("SELECT * FROM tur_sss WHERE tur_id = ?"); $stmt->execute([$tur_id]); $sss = $stmt->fetchAll(PDO::FETCH_ASSOC); // Çocuk kuralları $stmt = $db->prepare("SELECT * FROM tur_cocuk_kurallari WHERE tur_id = ?"); $stmt->execute([$tur_id]); $cocuk = $stmt->fetchAll(PDO::FETCH_ASSOC); // Program detayları $stmt = $db->prepare("SELECT * FROM tur_program_detaylari WHERE tur_id = ?"); $stmt->execute([$tur_id]); $program = $stmt->fetchAll(PDO::FETCH_ASSOC); $payload = json_encode([ 'key' => 'nex14sync2026', 'tur' => $tur, 'varis_noktalari' => $varis, 'kalkis_sehirleri' => $kalkis, 'tarihler' => $tarihler, 'hizmetler' => $hizmetler, 'sss' => $sss, 'cocuk_kurallari' => $cocuk, 'program_detaylari' => $program ], JSON_UNESCAPED_UNICODE); // VDS sync endpoint'ine gönder (non-blocking) $ch = curl_init('https://api.nex14.com/v1/sync_import.php'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => $payload, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, CURLOPT_CONNECTTIMEOUT => 3, ]); curl_exec($ch); curl_close($ch); } catch (Exception $e) { // Sync hatası ana işlemi etkilemesin } }