PHP'de PDO kullanarak veritabanından bir kaydı silerken, o kayda bağlı olan fiziksel dosyayı (resim, PDF vb.) sunucudan temizlemek, sunucunun depolama alanını gereksiz doluluktan korumak için kritik bir adımdır.
Bu makalede, hem veritabanı kaydını hem de sunucudaki fiziksel dosyayı koordineli bir şekilde silmeyi öğreneceğiz.
Sadece DELETE sorgusu çalıştırmak dosyayı sunucudan kaldırmaz. Doğru işlem sırası şu şekildedir:
Veritabanından dosyanın yolunu (path) sorgula.
PHP unlink() fonksiyonu ile dosyayı sunucudan sil.
Dosya silindikten sonra veritabanı kaydını sil.
Aşağıdaki kod, belirli bir ID'ye sahip görseli hem klasörden hem de veritabanından siler:
PHP
<?php
require_once 'db_config.php';
$id = 5; // Silinecek kaydın ID'si
try {
// 1. Önce dosya yolunu veritabanından çekiyoruz
$sorgu = $pdo->prepare("SELECT dosya_yolu FROM gorseller WHERE id = :id");
$sorgu->execute(['id' => $id]);
$kayit = $sorgu->fetch(PDO::FETCH_ASSOC);
if ($kayit) {
$dosyaYolu = $kayit['dosya_yolu'];
// 2. Fiziksel dosyayı sunucudan silme
if (file_exists($dosyaYolu)) { // Dosya gerçekten var mı kontrol et
if (unlink($dosyaYolu)) {
// 3. Dosya silindiyse veritabanı kaydını sil
$sil = $pdo->prepare("DELETE FROM gorseller WHERE id = :id");
$sil->execute(['id' => $id]);
echo "Dosya ve veritabanı kaydı başarıyla silindi.";
} else {
echo "Dosya sunucudan silinirken bir hata oluştu.";
}
} else {
// Dosya fiziksel olarak yoksa bile kaydı silebiliriz
$sil = $pdo->prepare("DELETE FROM gorseller WHERE id = :id");
$sil->execute(['id' => $id]);
echo "Fiziksel dosya bulunamadı, ancak veritabanı kaydı temizlendi.";
}
} else {
echo "Kayıt bulunamadı.";
}
} catch (PDOException $e) {
die("Hata: " . $e->getMessage());
}
?>
unlink() FonksiyonuPHP'nin unlink() fonksiyonu, parametre olarak verilen dosya yolundaki dosyayı kalıcı olarak siler. Eğer dosya yolu hatalıysa veya izin problemleri varsa hata döndürür.
file_exists() KontrolüDosyayı silmeye çalışmadan önce file_exists() ile dosyanın yerinde olup olmadığını kontrol etmek, kodun hata vermesini önleyen profesyonel bir yaklaşımdır.
Eğer bir dosya birden fazla kayıt tarafından kullanılıyorsa (örneğin bir varsayılan profil resmi), unlink() yapmadan önce o dosyayı kullanan başka kayıt olup olmadığını kontrol etmeniz gerekebilir:
PHP
// Bu dosyayı kullanan başka biri var mı?
$kontrol = $pdo->prepare("SELECT COUNT(*) FROM gorseller WHERE dosya_yolu = :yol");
$kontrol->execute(['yol' => $dosyaYolu]);
if ($kontrol->fetchColumn() == 1) {
unlink($dosyaYolu); // Sadece 1 kişi kullanıyorsa sil
}