Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

Php Unlink

Merhabalar.

Bir projemde resim dosyası upload bölümü var ancak her dosya db ye kaydedilmiyor. Önizleme olarak kullanıcıya sayfada gösteriliyor(yani sunucuya alınıyor) ancak kullanıcı kaydet derse db ye kaydediliyor.
Benim sorunum da tam bu noktada. Gelen resim klasöründe binlerce dosya birikiyor bunların hemen hemen yarısı db ye kayıtlı değil. Db den sorgulayarak bir dizi halinde kayıtlı dosya isimlerini tutuyorum, ismi dizide olmayan dosyaları ise silmek istiyorum. Bu işlemi periyodik olarak çalışacak bir cronjob olarak düşünün. Dosyaları silmek için unlink komutunu kullanıyorum ama tutarsız bir silme işlemi gerçekleşiyor. kodlarım aşağıdaki gibidir :


$myDirectory = opendir("../incoming/");


while($entryName = readdir($myDirectory)) {
	$dirArray[] = $entryName;
}


closedir($myDirectory);

include "../include/connect.php";

$sor = mysql_query("SELECT resimler FROM resimler");

while($al=mysql_fetch_object($sor))
{
	$kr[]=$al->resimler;	
}




$sayac=0;
for($i=0;$i<=count($kr)-1;$i++)
{
	$varmi=0;
	for($j=0;$j<=count($dirArray);$j++)
	{
		if ($kr[$i]==$dirArray[$j]) {$varmi=1;}	
	}
	if (!$varmi) {$dosya="../incoming/".$kr[$i];unlink($dosya);$sayac++;}
}

echo "$sayac dosya silindi.";


bu kodlardan sonra db de olmayan bir sürü dosya sistemde kalıyor...
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Doğru Cevap

  • efe4ka adlı üyenin fotoğrafı
    12 yıl önce yazılmış
    28 cevap - 1 soru
    $myDirectory = opendir("../incoming/");
    
    while($entryName = readdir($myDirectory)) {
    
        $dirArray[] = $entryName;
    }
    $sor - mysql_query("SELECT resimler FROM resimler");
    while ($al = mysql_fetch_object($sor)){
    $kr[] = $al->resimler;
    }
    
    foreach ($dirArray as $dosya):
    
    if (!in_array($dosya, $kr)) {
        unlink('serveryolu/'.$dosya);
    
    
    }
    endforeach;


    boyle silebilirsin ama serveryolu relative olmamali absolute olmali
    • teacher0610 adlı üyenin fotoğrafı teacher0610
      Teşekkürler...
      12 yıl önce yazılmış

Cevaplar

  • 1
    Vedia adlı üyenin fotoğrafı
    12 yıl önce yazılmış
    66 cevap - 21 soru
    Ben olsam db'den getirip tek tek kontrol edip silmek yerine "create tarihi 3 saat ve öncesi olanları sil" derdim.

    Ayrıca, dizide aramayı da for döngüsü ile değil php'deki "in_array()" komutuyla yapardım.
    • teacher0610 adlı üyenin fotoğrafı teacher0610
      İyi de o 3 saat içinde oluşturulan dosyalar db ye kayıt edildiyse silinmemesi gerekiyor.
      12 yıl önce yazılmış
  • necmettin adlı üyenin fotoğrafı
    12 yıl önce yazılmış
    80 cevap - 0 soru
    İlk olarak, unlink'i kullandığın yerde $dosya değişkenini echo ile yazdırınca ne görüyorsun?

    Bir iki düzeltme:
    Öncelikle, $varmi yerine, sana bir array verecek olan şu fonksiyonu kullanabilirsin:
    $kayitli_olmayanlar = array_diff($dirArray, $kr);


    İkincisi, $al->resimler dediğine göre birden varsa resim olduğunu varsayıyorum. Dolayısıyla $kr resimlerin listesi (array) değil, resim listelerinin listesi (array of arrays) oluyor. Bu durumda yapman gereken $kr[] ile eklemek değil,
    $kr = array_merge($kr, $al->resimler);

    kullanmaktır. elbette $al->resimler veritabanında TEXT olarak saklanıyorsa $al->resimler'i explode ile örneğin "\n"lerden bölüp o şekilde işlemek gerekecektir.
    • curlyhair adlı üyenin fotoğrafı curlyhair
      Ben olsam kayıt esnasında bir alan daha oluştururum. Resim kayıt edildiyse bu alanı update ile 1 yaparım edilmediyese 0 yaparım silerkende
      0 olanları sil derim daha en başta bu işlemi yapmalısın önizleme esnasında update 1 ya da 0 olmalı.
      12 yıl önce yazılmış
  • siyahbeyaz adlı üyenin fotoğrafı
    12 yıl önce yazılmış
    472 cevap - 20 soru
    iş php olunca bir sorunun 100 tane cevap bile cıkabılıor. :D ben normalde bu tür sorunları söyle cözüyorum.. db dekı tum dosyaları baska bı klasore cekıorm.. kalanları manuel sılıorum