Sql & Veritabanı İle Uygulamalar İçin Veri İçe Aktarma Betiği Nasıl Yapılır?

Sql & Veritabanı İle Uygulamalar İçin Veri İçe Aktarma Betiği Nasıl Yapılır?
Sql & Veritabanı İle Uygulamalar İçin Veri İçe Aktarma Betiği Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Veri içe aktarma betiği geliştirmek için temel düzeyde SQL bilgisi ve sunucu tarafında çalışan bir programlama diline ihtiyacınız vardır. Bu rehberde PHP 8.3+ sürümü ve MySQL/MariaDB veritabanı kullanılacaktır. Çalışma ortamınızda aşağıdaki araçların kurulu olduğundan emin olun:

  • PHP 8.3 veya üzeri bir sürüm.
  • PDO eklentisi aktif edilmiş bir veritabanı sunucusu.
  • Veri kaynağı olarak kullanılacak örnek bir CSV dosyası.
  • Yazım hatalarını ayıklamak için hata raporlama seviyesinin açık olduğu bir geliştirme ortamı.

Veritabanı Bağlantısını PDO ile Yapılandırma

Veritabanı ile güvenli bir iletişim kurmanın en temel yolu PDO kullanmaktır. PDO, veritabanından bağımsız bir arayüz sunar ve hazırlanan ifadeler (prepared statements) sayesinde SQL injection saldırılarına karşı koruma sağlar.


// db_baglan.php
$host = '127.0.0.1';
$db   = 'uygulama_veritabani';
$user = 'db_kullanici';
$pass = 'guclu_sifre';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Yukarıdaki kod bloğu, veritabanı bağlantısını güvenli bir şekilde yapılandırır. PDO::ATTR_EMULATE_PREPARES => false ayarı, veritabanı sorgularının doğrudan veritabanı motoru tarafından işlenmesini sağlayarak güvenliği artırır.

CSV Dosyasını Okuma ve İşleme Adımları

Veri içe aktarma işleminde en yaygın yöntem CSV dosyalarını satır satır okumaktır. Büyük dosyaları belleğe (RAM) yüklemek yerine, fopen ve fgetcsv fonksiyonlarını kullanarak dosyayı akış (stream) şeklinde işlemek, sunucu kaynaklarını korumak için kritiktir.


// dosya_oku.php
if (($handle = fopen("veriler.csv", "r")) !== FALSE) {
    fgetcsv($handle); // Başlık satırını atla
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        // $data[0] = isim, $data[1] = email
        print_r($data);
    }
    fclose($handle);
}

Bu kod bloğu, CSV dosyasını satır satır okur ve her satırı bir diziye dönüştürür. fgetcsv fonksiyonunun ikinci parametresi olan 1000 değeri, satır uzunluğu sınırını belirtir; dosyanızdaki satır uzunluğuna göre bu değeri artırabilirsiniz.

Veri Aktarımı İçin Hazırlanmış İfadeler (Prepared Statements)

Verileri veritabanına eklerken doğrudan kullanıcı verisini sorguya eklemek büyük bir güvenlik açığıdır. Bunun yerine, soru işareti (?) veya isimlendirilmiş parametreler kullanarak veriyi güvenli bir şekilde veritabanına göndeririz.


// veri_ekle.php
$sql = "INSERT INTO kullanicilar (ad, email) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);

$veriler = [
    ['Ahmet Yılmaz', 'ahmet@example.com'],
    ['Ayşe Demir', 'ayse@example.com']
];

foreach ($veriler as $row) {
    $stmt->execute($row);
}

Bu yöntem, SQL injection saldırılarını tamamen engeller çünkü veritabanı motoru, gelen veriyi komut olarak değil, sadece veri olarak işler.

Performans İçin İşlem (Transaction) Kullanımı

Binlerce satırlık veriyi tek tek eklemek veritabanı üzerinde büyük bir yük oluşturur. İşlem (Transaction) kullanarak, tüm verilerin tek bir blok halinde işlenmesini sağlayabilir ve hem hız hem de veri bütünlüğü kazanabilirsiniz.


// transaction_kullanimi.php
try {
    $pdo->beginTransaction();
    $stmt = $pdo->prepare("INSERT INTO kullanicilar (ad, email) VALUES (?, ?)");
    
    foreach ($buyuk_veri_listesi as $row) {
        $stmt->execute($row);
    }
    
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    echo "Hata oluştu: " . $e->getMessage();
}

Transaction kullanımı, işlem sırasında bir hata oluşursa tüm değişiklikleri geri alır (rollback), böylece veritabanınızda yarım kalmış veya hatalı veri girişi olmaz.

Veri İçe Aktarma Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
Satır Satır (Loop) Bellek dostu, kolay hata yönetimi Düşük hız
Transaction ile Toplu Çok hızlı, veri bütünlüğü Büyük işlemlerde kilitlenme riski
LOAD DATA INFILE En yüksek performans Sunucu izinleri gerektirir
Kritik Güvenlik Uyarısı: Kullanıcıdan gelen hiçbir veriye güvenmeyin. İçe aktardığınız verileri veritabanına yazmadan önce mutlaka doğrulayın (validation) ve temizleyin (sanitization). Özellikle email gibi alanlar için filter_var() fonksiyonunu kullanmayı ihmal etmeyin.

Sıkça Sorulan Sorular

İçe aktarma sırasında "Maximum execution time exceeded" hatası alıyorum, ne yapmalıyım?

Bu hata, PHP'nin script çalışma süresinin dolduğunu gösterir. set_time_limit(0); komutu ile süreyi sınırsız yapabilir veya veriyi parçalar (batch) halinde işleyebilirsiniz.

Büyük dosyaları nasıl daha verimli işlerim?

Dosyayı tamamen belleğe yüklemek yerine SplFileObject sınıfını kullanarak satır satır okumak, bellek kullanımını minimuma indirir.

SQL Injection nedir ve neden bu kadar önemli?

SQL Injection, saldırganın veritabanı sorgularına müdahale ederek verileri çalması veya silmesidir. Hazırlanmış ifadeler (prepared statements) kullanarak bu riski %100 oranında azaltabilirsiniz.

Veri aktarımı sırasında karakter kodlama hatalarını nasıl önlerim?

Veritabanı bağlantı ayarlarında charset=utf8mb4 kullandığınızdan ve CSV dosyanızın UTF-8 formatında kaydedildiğinden emin olun.

Transaction neden hata durumunda geri alma yapar?

Transaction, veritabanı işlemlerini bir paket olarak görür. Eğer paketin bir parçası başarısız olursa, veritabanı tutarlılığını korumak için tüm paketi iptal eder.

Veri İçe Aktarma Süreçlerinde Hata Ayıklama ve Loglama Stratejileri

Büyük ölçekli veri aktarımı sırasında karşılaşılan en büyük zorluklardan biri, işlemin nerede ve neden kesintiye uğradığını tespit etmektir. Sadece hata mesajlarına güvenmek yerine, her satırın durumunu kaydeden bir loglama mekanizması kurmak, veri bütünlüğünü korumanızı sağlar.

Özelleştirilmiş Hata Yakalama Mekanizması

Veri aktarımı sırasında oluşabilecek "Integrity Constraint Violation" (Bütünlük Kısıtlaması İhlali) gibi hataları yakalamak için try-catch bloklarını döngü içerisinde aktif kullanmalısınız. Aşağıdaki örnek, hatalı satırları bir log dosyasına yazarak işlemin geri kalanının devam etmesine olanak tanır:


$logFile = 'import_errors.log';

foreach ($csvData as $row) {
    try {
        $stmt->execute($row);
    } catch (PDOException $e) {
        $errorMessage = "[" . date('Y-m-d H:i:s') . "] Hata: " . $e->getMessage() . " - Veri: " . json_encode($row) . PHP_EOL;
        file_put_contents($logFile, $errorMessage, FILE_APPEND);
        continue; // Hatalı satırı atla ve işleme devam et
    }
}

Veri Doğrulama ve Temizleme (Data Sanitization)

Dış kaynaklardan gelen CSV dosyaları nadiren "temiz" veriler içerir. Veritabanına eklemeden önce veriyi doğrulamak, uygulamanızın uzun vadeli sağlığı için kritiktir. Özellikle tarih formatları, sayısal değerler ve boş alanlar (null) en çok sorun çıkaran alanlardır.

Veri Doğrulama Fonksiyonu Kullanımı

Veriyi veritabanına göndermeden önce bir doğrulama katmanından geçirmek, hatalı verilerin veritabanı şemanızı bozmasını engeller. Aşağıdaki örnek, bir e-posta adresinin geçerliliğini ve zorunlu alanların doluluğunu kontrol eder:


function validateRow($row) {
    if (empty($row['email']) || !filter_var($row['email'], FILTER_VALIDATE_EMAIL)) {
        throw new Exception("Geçersiz e-posta formatı: " . $row['email']);
    }
    if (!is_numeric($row['price'])) {
        throw new Exception("Fiyat alanı sayısal olmalıdır.");
    }
    return true;
}

// Kullanımı
foreach ($csvData as $row) {
    try {
        validateRow($row);
        $stmt->execute($row);
    } catch (Exception $e) {
        error_log("Doğrulama hatası: " . $e->getMessage());
    }
}

İleri İpucu: Veri Dönüşümü

Bazen CSV dosyasındaki veriler veritabanı yapınızla birebir örtüşmez. Örneğin, CSV'de "Evet/Hayır" şeklinde tutulan bir veriyi veritabanında "1/0" olarak saklamanız gerekebilir. Bu tür dönüşümleri execute() metodunu çağırmadan hemen önce bir dizi manipülasyonu ile yapmanız, veritabanı katmanınızın temiz kalmasını sağlar.

Senaryo Önerilen Yaklaşım
Büyük dosya boyutu Generator kullanarak satır satır okuma yapın.
Yavaş veritabanı yazımı Transaction bloklarını 1000'li gruplar halinde kullanın.
Karakter kodlama sorunu Dosyayı okumadan önce mb_convert_encoding ile UTF-8'e çevirin.

Sonuç

SQL & Veritabanı ile uygulamalar için veri içe aktarma betiği hazırlamak, doğru araçları ve güvenlik prensiplerini bildiğinizde oldukça verimli bir süreçtir. PDO ile güvenli bağlantı kurmak, transaction ile performans sağlamak ve veriyi satır satır işleyerek bellek yönetimi yapmak, profesyonel bir yazılım geliştiricinin temel becerileridir. Bir sonraki adım olarak, bu verileri arka planda işlemek için "Cron Job" veya "Message Queue" (Mesaj Kuyruğu) yapılarını araştırmanızı öneririm.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce, veritabanı yetkilendirmelerini kısıtlayın, hata loglarını dışarıya açık etmeyin ve veritabanı yedeklerinizi düzenli olarak alın.
Bu yazıya tepkinizi paylaşın:
Mert Demir

Teknik konuları sadeleştirerek geniş kitlelere ulaştırma konusunda tutkuluyum. Ev işleri, bakım ve organizasyon temalı rehberlerimde kaliteyi ön planda tutuyorum.

Yorumlar (0)

Yorum Yaz