• 26-12-2023, 03:29:19
    #1
    Merhaballar,
    Xml dosyası ile gelen verileri alıp veritabanıma aktarıyorum. Veri güncelleme esnasında veritabanına daha önceden eklenmiş olan bir verinin daha sonra xml yapısında çıkarıldığında bilgi vermesini nasıl sağlayabilirim? Örnekle anlatacak olursam bir ürün listesini veritabanına ekledim. Daha sonra veri yenilendiğinde mevcutta eklenmiş olan ürün yeni xml dosyasında yoksa onun stok sayısını sıfıra çekmek veya bu ürün kaldırıldı şeklinde bir yazı yazmak istiyorum. Yardımlarınız için şimdiden teşekkürler.
  • 26-12-2023, 03:43:14
    #2
    Önce, var olan ürünleri kontrol etmen gerekiyor bunu da SQL sorgusu yaparak eksik veya güncellenmiş ürünlere bakabilirsin:
    SELECT product_id, product_name
    FROM TABLO
    WHERE product_id NOT IN (SELECT product_id FROM xml_data_table);
    Veritabanındaki ürünleri ve XML dosyasındaki ürünleri karşılaştırır. Eğer bir ürün XML dosyasında yoksa, bu ürünün bilgisi veritabanında bulunan TABLO adlı tablodan çekilir.
    Daha sonra, bu bilgileri kullanarak stok sayısını sıfıra çekmek veya bir yazı eklemek için bir güncelleme sorgusu yapabilirsin
    UPDATE TABLO
    SET stock_quantity = 0, status = 'Ürün kaldırıldı'
    WHERE product_id NOT IN (SELECT product_id FROM xml_data_table);
    Bu sorgu, XML dosyasında olmayan ürünlerin stok sayısını sıfıra çeker ve durumunu 'Ürün kaldırıldı' olarak günceller.

    Eğer ki olmazsa detaylı bilgiler verirseniz yardımcı olabilirim
  • 26-12-2023, 04:12:17
    #3
    öncelikle cevabınız için teşekkür ederim,
    Veritabanında mevcut ürünlerin listesini şu şekilde almayı denedim;
    $dbProducts = [];
    $urunListesi = $db->query("SELECT urun_kod FROM urun");
    while ($row = $urunListesi->fetch(PDO::FETCH_ASSOC)) {
        $dbProducts[] = $row['urun_kod'];
    }
    Ardından eğer ürün yoksa şu şekilde işlemle devam ettim;
    $missingProducts = array_diff($dbProducts, $allProducts);
    foreach ($missingProducts as $missing) {
        $sifirla = $db->prepare("UPDATE urun SET urun_stok = 0 WHERE urun_kod = ?");
        $sifirla->execute([$missing]);
        echo "Eksik Ürün: {$missing} kodlu ürün XML dosyasında bulunmamaktadır. Stok sıfırlandı.<br>";
    }
    Ama dosya her çalıştığında mevcut xml'deki ürünleri kontrol edip bana her seferinde stok sıfırlandı bilgisi veriyor ve stoğu sıfırlıyor. Benim buradaki isteiğim aslında stok sayısı sıfırlanmış ürünleri bir daha kontrol etmesin veya bana mesaj vermesin.
  • 26-12-2023, 04:17:58
    #4
    Eğer bir ürün zaten stok sayısı sıfırlandıysa ve tekrar kontrol ediliyorsa, bu durumu önlemen için verdiğim kodlarla güncelleme yapabilirsin

    $dbProducts = [];
    $urunListesi = $db->query("SELECT urun_kod FROM urun");
    while ($row = $urunListesi->fetch(PDO::FETCH_ASSOC)) {
        $dbProducts[] = $row['urun_kod'];
    }
    
    // XML dosyasından ürünleri al (örnek veri)
    $xml_data = [
        ["product_id" => 1, "product_name" => "Beyaz Peynir", "stock_quantity" => 0],
        // Diğer ürünler...
    ];
    
    // Veritabanında stokları sıfır olan ürünleri kontrol et
    $stokSifirUrunler = [];
    foreach ($dbProducts as $dbProduct) {
        $sorgu = $db->prepare("SELECT urun_stok FROM urun WHERE urun_kod = ?");
        $sorgu->execute([$dbProduct]);
        $stok = $sorgu->fetchColumn();
    
        if ($stok == 0) {
            $stokSifirUrunler[] = $dbProduct;
        }
    }
    
    // XML dosyasındaki ürünleri kontrol et ve gerekli işlemleri yap
    foreach ($xml_data as $xml_product) {
        $urunKod = $xml_product["product_id"];
    
        // Eğer stok sayısı sıfır olan bir ürün varsa, işlem yapma
        if (in_array($urunKod, $stokSifirUrunler)) {
            continue;
        }
    
        // Eğer ürün veritabanında varsa stok sayısını güncelle
        if (in_array($urunKod, $dbProducts)) {
            $sorgu = $db->prepare("UPDATE urun SET urun_stok = ? WHERE urun_kod = ?");
            $sorgu->execute([$xml_product["stock_quantity"], $urunKod]);
        } else {
            // Eğer ürün veritabanında yoksa, ekleyebilirsiniz
            // Örnek: $db->prepare("INSERT INTO urun (urun_kod, urun_stok) VALUES (?, ?)")->execute([$urunKod, $xml_product["stock_quantity"]]);
        }
    }
    
    echo "Ürün kontrolü tamamlandı.";
    Bu verdiğim kod, veritabanında stok sayısı sıfır olan ürünleri kontrol eder ve bunları ayrı bir diziye ekler. XML dosyasındaki ürünleri kontrol ederken, bu sıfır stoklu ürünleri kontrol etmez ve böylece mevcut bir sıfır stoklu ürünü tekrar işleme almaz. Bu şekilde, her seferinde stokları sıfırlanan ürünler için tekrar işlem yapmazsınız.
  • 26-12-2023, 17:32:25
    #5
    1- boolean/tinyint bir alan olusturun. urunVarMi olsun ornegin. guncellemeye baslamadan once tablodaki tum "urunVarMi" alanlarini 0 degeri ile guncelleyin. xml'den gelen urunleri dongu icerisine aldiginizda bu alani da 1 degeri ile guncelleyin. urunVarMi = 0 olan tum satirlar xml'den okunamayan/gelmeyen satirlar olacaktir.
    2- gecici bir tablo olusturup xml'den gelen id'leri yazdirin. daha sonra urun tablonuzdaki id'lerle karsilastirip xml'den okunamayan/gelmeyen satirlari yakalayin.