Gereksinimler ve Ön Hazırlık
Veri ihracat işlemlerine başlamadan önce çalışma ortamınızın hazır olduğundan emin olmalısınız. Modern bir veritabanı yönetimi için aşağıdaki araçların yüklü olması gerekmektedir:
- PHP 8.3 veya üzeri: Güncel dil özellikleri ve performans iyileştirmeleri için gereklidir.
- MySQL 8.0 veya MariaDB 10.6+: Veri bütünlüğü ve gelişmiş sorgu yetenekleri için.
- PDO Sürücüsü: Veritabanı bağlantılarında SQL Injection saldırılarını önlemek için standarttır.
- Composer: Gerekli kütüphaneleri (örneğin, büyük veri setleri için
phpspreadsheet) yönetmek için.
Ön hazırlık aşamasında, veritabanı bağlantı dosyanızın (config.php) güvenli bir şekilde yapılandırıldığından emin olun. Veritabanı şifrelerinizi asla kaynak kodun içine doğrudan yazmayın; bunun yerine .env dosyaları kullanarak çevresel değişkenler tanımlayın.
Adım Adım SQL Sorgusu ile Veri Hazırlama
Veri ihracatının ilk adımı, veritabanından doğru veriyi çekmektir. İhracat işlemi yaparken tüm tabloyu çekmek yerine, sadece ihtiyacınız olan sütunları ve satırları seçmek, sistem kaynaklarını korumak adına çok önemlidir. Aşağıdaki kod örneği, PDO kullanarak güvenli bir veri çekme işlemini göstermektedir.
// Veritabanı bağlantısı ve güvenli sorgu örneği
try {
$pdo = new PDO('mysql:host=localhost;dbname=proje_db;charset=utf8mb4', 'kullanici', 'sifre');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT id, ad, email, olusturulma_tarihi FROM kullanicilar WHERE durum = :durum");
$stmt->execute(['durum' => 'aktif']);
$veriler = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("Bağlantı hatası: " . $e->getMessage());
}
Burada prepare ve execute yöntemlerini kullanarak SQL Injection riskini ortadan kaldırıyoruz. FETCH_ASSOC parametresi ile verileri anahtar-değer çiftleri şeklinde alarak işlenmesini kolaylaştırıyoruz.
CSV Formatında Veri Dışa Aktarma
CSV (Comma Separated Values), veritabanı ihracatında en yaygın kullanılan formattır. Basit yapısı sayesinde Excel veya Google Sheets gibi uygulamalarda kolayca açılabilir. PHP'nin yerleşik fputcsv fonksiyonu, bu işlemi bellek dostu bir şekilde yapmanıza olanak tanır.
// CSV dosyasını tarayıcıya indirtme örneği
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=kullanicilar.csv');
$output = fopen('php://output', 'w');
fputcsv($output, ['ID', 'Ad Soyad', 'E-posta', 'Kayıt Tarihi']);
foreach ($veriler as $row) {
fputcsv($output, $row);
}
fclose($output);
Bu kod bloğu, verileri doğrudan tarayıcıya bir dosya olarak gönderir. php://output akışı, verinin bellekte birikmeden doğrudan kullanıcıya iletilmesini sağlar, bu da büyük veri setlerinde bellek aşımını (memory limit) önler.
Büyük Veri Setleri İçin İhracat Stratejileri
Veritabanınızda milyonlarca kayıt varsa, tüm veriyi bir kerede belleğe almak sunucunuzun çökmesine neden olabilir. Bu durumda "cursor" (imleç) mantığını veya "chunking" (parçalara bölme) yöntemini kullanmalısınız. Aşağıdaki örnek, veriyi 1000'erli gruplar halinde işleyerek bellek kullanımını sabit tutar.
// Veriyi parçalar halinde işleme (Chunking)
$limit = 1000;
$offset = 0;
while (true) {
$stmt = $pdo->prepare("SELECT * FROM loglar LIMIT $limit OFFSET $offset");
$stmt->execute();
$chunk = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($chunk)) break;
foreach ($chunk as $item) {
// İhracat işlemleri burada yapılır
}
$offset += $limit;
}
Bu yöntem, özellikle raporlama sistemlerinde sunucu kaynaklarını verimli kullanmak için zorunludur. OFFSET değeri arttıkça performansın düşebileceğini unutmayın; çok büyük tablolarda id > son_id mantığını kullanmak daha hızlı sonuç verir.
Veri İhracat Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| CSV | Hızlı, hafif, evrensel | Veri tipi desteği sınırlı |
| JSON | API'ler için ideal, hiyerarşik | Büyük dosyalarda parse etmesi zor |
| Excel (XLSX) | Stil ve formül desteği | Daha fazla bellek tüketir |
JSON Formatında Veri İhracatı
Uygulamalar arası veri taşıma işlemlerinde JSON (JavaScript Object Notation) standarttır. PHP tarafında json_encode fonksiyonu ile veritabanından gelen dizileri kolayca JSON formatına dönüştürebilirsiniz.
// Veritabanı verisini JSON olarak çıktı alma
header('Content-Type: application/json');
echo json_encode(['status' => 'success', 'data' => $veriler], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
JSON_UNESCAPED_UNICODE bayrağı, Türkçe karakterlerin bozulmadan doğru şekilde görünmesini sağlar. Bu yöntem, bir mobil uygulama veya başka bir web servisi ile veri paylaşırken oldukça pratiktir.
Güvenlik Uyarıları ve En İyi Pratikler
Kritik Uyarı: Veri ihracatı sırasında kişisel verilerin korunması (KVKK) kurallarına uyun. Dışa aktarılan dosyalarda hassas verileri (şifre hashleri, kişisel kimlik numaraları vb.) maskeleyin veya tamamen hariç tutun. Ayrıca ihracat dosyasını geçici bir klasöre kaydediyorsanız, dosya ismini tahmin edilemez (hash) yapın ve işlem sonrası dosyayı mutlaka silin.
Veri güvenliği için bir diğer önemli nokta, ihracat işlemini gerçekleştiren kullanıcının yetkilerini kontrol etmektir. Sadece admin yetkisine sahip kullanıcıların toplu veri dışa aktarmasına izin verin.
Sıkça Sorulan Sorular
İhracat yaparken neden "Memory Limit Exceeded" hatası alıyorum?
Bu hata, veritabanından çektiğiniz verinin PHP'nin izin verilen bellek sınırını aşmasından kaynaklanır. Tüm veriyi bir kerede diziye almak yerine, veriyi satır satır işleyerek (stream) çıktıya yönlendirin.
CSV dosyasında Türkçe karakterler neden bozuk görünüyor?
CSV dosyaları varsayılan olarak bazen ANSI kodlaması bekleyebilir. Dosyanın başına UTF-8 BOM (Byte Order Mark) eklemek veya dosyayı oluştururken UTF-8 kodlamasını açıkça belirtmek bu sorunu çözecektir.
SQL Injection'dan korunmak için ne yapmalıyım?
Her zaman PDO veya MySQLi gibi kütüphanelerde "prepared statements" (hazırlanmış ifadeler) kullanın. Kullanıcıdan gelen hiçbir veriyi doğrudan SQL sorgusunun içine birleştirmeyin.
Çok büyük tabloları dışa aktarmanın en hızlı yolu nedir?
Eğer sunucu erişiminiz varsa, SQL komut satırı aracı olan mysqldump kullanmak en hızlı yöntemdir. Kod içerisinde yapmanız gerekiyorsa, veritabanı sorgusunu optimize edin ve veriyi parçalar halinde (chunking) okuyun.
Excel formatı için hangi kütüphaneyi önerirsiniz?
Karmaşık Excel yapıları (stil, formül) için PhpSpreadsheet kütüphanesi endüstri standardıdır. Ancak sadece veri aktarımı yapıyorsanız CSV kullanmak çok daha performanslıdır.
Veri İhracat Süreçlerinde Performans Optimizasyonu ve İleri Teknikler
Büyük ölçekli veritabanı sistemlerinde veri ihracatı, sadece bir sorgu çalıştırmaktan ibaret değildir. Sunucu kaynaklarını tüketmeden, kullanıcı deneyimini bozmadan ve veritabanı üzerindeki yükü minimize ederek bu işlemi tamamlamak profesyonel bir yaklaşım gerektirir. İşte ihracat süreçlerinizi optimize etmek için kullanabileceğiniz ileri düzey teknikler.
Cursor Tabanlı Veri Okuma (Streaming)
Standart fetchAll() yöntemi, tüm sonuç kümesini belleğe yükler. Milyonlarca satırlık veride bu durum Memory Limit Exceeded hatasına yol açar. Bunun yerine, veriyi satır satır işleyen Cursor yöntemini kullanmalısınız. Aşağıdaki örnek, PDO ile veriyi belleği yormadan nasıl akıtacağınızı gösterir:
$stmt = $pdo->prepare("SELECT * FROM siparisler", [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$stmt->execute();
$file = fopen('export.csv', 'w');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
fputcsv($file, $row);
}
fclose($file);
Veritabanı İndeksleme ve Sorgu Hızlandırma
İhracat sorgularınızın yavaş çalışması genellikle veritabanı seviyesindeki eksikliklerden kaynaklanır. Eğer ihracat işlemi belirli bir tarih aralığına veya kategoriye göre yapılıyorsa, WHERE koşulunda kullanılan sütunların mutlaka indekslenmiş olması gerekir. İhracat öncesinde EXPLAIN komutunu kullanarak sorgunuzun nasıl çalıştığını analiz edin.
-- Sorgunun performansını analiz etmek için başına EXPLAIN ekleyin
EXPLAIN SELECT * FROM kullanicilar WHERE kayit_tarihi > '2023-01-01';
İhracat İşlemlerinde Hata Ayıklama ve İzleme (Logging)
Uzun süren ihracat işlemleri sırasında bağlantı kopmaları veya veri tutarsızlıkları yaşanabilir. Bu durumları yönetmek için bir "İşlem Günlüğü" (Log) mekanizması kurmak hayati önem taşır. Hangi kullanıcının, ne zaman, ne kadar veriyi dışa aktardığını takip etmek hem güvenlik hem de performans analizi için gereklidir.
İşlem Durumu Takibi
Kullanıcıya ihracatın ne kadarının tamamlandığını göstermek için veritabanında bir export_jobs tablosu tutabilirsiniz. Bu tablo üzerinden işlemin yüzde kaçının bittiğini hesaplayarak kullanıcıya bir ilerleme çubuğu (progress bar) sunabilirsiniz.
| Alan Adı | Açıklama |
|---|---|
| job_id | Benzersiz işlem kimliği |
| status | pending, processing, completed, failed |
| progress_percent | 0-100 arası tamamlanma oranı |
Hata Yakalama ve Kurtarma
İhracat sırasında oluşabilecek hataları yakalamak için try-catch bloklarını kullanırken, dosya işaretçilerini (file pointers) mutlaka kapatmayı unutmayın. Aksi takdirde sunucuda açık dosya kilitleri (file locks) oluşabilir.
try {
$file = fopen('data.csv', 'w');
if (!$file) throw new Exception("Dosya açılamadı.");
// İşlem mantığı...
} catch (Exception $e) {
error_log("İhracat hatası: " . $e->getMessage());
// Kullanıcıya bildirim gönder veya durumu veritabanında 'failed' olarak işaretle
} finally {
if (isset($file)) fclose($file);
}
Bu yöntemler, özellikle yüksek trafikli uygulamalarda veri ihracatının sistem kararlılığını bozmadan gerçekleşmesini sağlar. Arka plan görevleri (Cron Jobs veya Queue Workers) ile birleştirildiğinde, bu süreç tamamen otomatik ve hatasız bir yapıya kavuşur.
Sonuç
SQL & veritabanı ile uygulamalar için veri ihracat işlemi, doğru teknikler kullanıldığında oldukça güvenli ve verimli bir süreçtir. Bu rehberde öğrendiğiniz PDO kullanımı, bellek yönetimi ve format dönüştürme yöntemleri, profesyonel bir yazılım projesinin temel taşlarını oluşturur. Bir sonraki adım olarak, büyük ölçekli veriler için arka plan kuyruk sistemlerini (queue systems) araştırmanızı ve ihracat işlemlerini kullanıcıyı bekletmeden, arka planda çalıştırmanızı öneririm.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce güvenlik açıklarını (SQL Injection, XSS, yetkilendirme) kendi sisteminize göre denetleyin ve gerekli tüm güvenlik önlemlerini alın.


Yorumlar (0)
Yorum Yaz