2016-04-13 14 views
0

PHP/MySQL ile benden daha akıllıca birinden ilham alıyorum.dizi güncellemeleriyle nasıl çalışılır

Bir veritabanı uygulamasında, bu örnekte iki birincil tablo ve bir alt tablo vardır.

Birincil Tablo 1 - Belgeler Birincil Tablo 2 - JobDesriptions Çocuk Tablo - LnkDocuments_JobDescriptions başlıktaki anlaşılacağı gibi Belgesi ve İş Açıklaması Tablo arasında pek çok ilişki tablosuna bir tanesidir. Belgelerim Tablosunda, JobDescriptions'ın bir arayışı olan ve bir onay kutusu olarak seçenekler sunan bir alana sahibim. Bu alan, uygulamanın çalışmasından dolayı "AppliesTo" olarak adlandırılır, alan sonuçları bir dize olarak saklar, örn. "1, 2,3,4,5) Bunu bir diziye dönüştürmek için patlatma fonksiyonunu kullandım ve 1-2-birçok ilişkiyi tercih ettiğimden, her kaydı çocuk masasına yerleştirdim. Bu benim sahip olduğum kod. . çalışır

$jdarray = explode(',',$values['AppliesTo']); 

foreach($jdarray as $item) 
{ 
$sql2 = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) 
values ('".$keys["DocumentPk"]."', '$item')"; CustomQuery($sql2); 
} 

şimdi bu tablo güncellenen alırsa, ben de çocuk tablosunu güncelleştirmek için gerektiğidir var sorun, ben bu kodu denedim (ancak kısa sürede bunun yanlış olduğunu fark etti):

$jdarray = explode(',',$values['AppliesTo']); 

foreach($jdarray as $item) 
{ 
    $sql = "SELECT * FROM LnkDocuments_JobDescriptions WHERE DocumentFk='".$keys["DocumentPk"]."' AND JobDescriptionFk='$item'"; ; 
    $num_rows = mysql_num_rows(CustomQuery($sql)); 

    if ($num_rows > 0) //Delete Record 
     { 
      $sql2 = "DELETE FROM LnkDocuments_JobDescriptions WHERE DocumentFk='".$keys["DocumentPk"]."' AND JobDescriptionFk='$item'"; CustomQuery($sql2); 
      echo "JD FK : ".$item." deleted"; 
     } 
    else //Insert Record 
     { 
      $sql3 = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) 
      values ('".$keys["DocumentPk"]."', '$item')"; CustomQuery($sql3); 
      echo "JD FK : ".$item." added"; 
     } 

} 

Dizilerdeki farklılıkları karşılaştırmam gerektiði zaman oldu, ama bunu yapmam gerektiði konusunda bir ipucu var, ama ihtiyacým olan bu:

Karşılaştırmak için $ oldarray ve $ new array alabiliyorsam, örnek

Eski dizide değerler 1,2,3,4 ve $ newarray değerlerinde 1,2,3,5 değerler varsa, bir değişimin olup olmadığını belirlemek için kodun her bir değerden geçmesini istiyorum , Örneğin eski ve yeni dizide değer varsa o zaman hiçbir şey yapmayın, eğer değer eski dizide mevcutsa ancak yeni değilse silin, eğer yeni dizide değer var ise, ancak eski değil.

Ayrıca tüm ilişkili kayıtları silme ve tekrar ekleme hakkında düşündüm, ama bu kötü bir uygulama olduğunu ve yüksek numaralı birincil anahtarla sonuçlanacağını düşünüyorum, ayrıca benim örneğimde sadece 5 seçenek olduğunu belirtmekte fayda var. Sadece test için, gerçekte düzinelerce olabilir. Eksik kayıt eklenmesi ise önceden

Teşekkür

+0

Tüm kodunuza iyice bakmadım ama işe yarayacak gibi görünüyor. Sorun tam olarak nedir? – Technoh

+0

Kullandığım koddaki sorun, farklılıkları karşılaştırmaması, yeni kayıtlar ekleyeceğidir, ancak TÜM kayıtları zaten siliyorlarsa, yeni dizide çıkarılmış olup olmadıklarını dikkate almazlar. – user5641678

+0

Neyi başarmaya çalıştığını görüyorum, teşekkürler. – Technoh

cevap

0

ben sadece bu yeni sürümde olmayan o tabloda zaten mevcut değerlerini okuma ve silme emin değilim şeyleri optimize etmeye çalışıyorsanız Gitmenin en iyi yolu. Benim düşünceme göre, bir sorgudaki her şeyi silmek, daha sonra tüm kayıtları bir sorguya eklemek çok daha hızlı olacaktır.

$item_list = implode(',' , $jdarray); 
$delete_query = "DELETE FROM LnkDocuments_JobDescriptions WHERE DocumentFk='".$keys["DocumentPk"]."' AND JobDescriptionFk IN ($item_list)"; 
CustomQuery($delete_query); 

$document_key = "'" . $keys["DocumentPk"] . "'"; 
$item_list_to_insert = "($document_key, " . implode("), ($document_key, ", $jdarray) . ")"; 

$insert_query = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) VALUES " . $item_list_to_insert; 
CustomQuery($insert_query); 

Not: Böyle bir şey deneyin ben bu test etmedi, bazı ayıklama orada gerekli olabilir.

+0

Bu tabloya bağlanan ve yeni değere dayanarak tekrar ekleyerek çocuk tablosundaki her şeyi silmeyi düşündüm, ama bu kötü bir uygulama değil mi? – user5641678

+0

Hiç de değil, sonuçta ortaya çıkan sorguların daha hızlı bir şekilde yürütülebilmesi için standart bir uygulamadır, bu da çoğu veritabanı kurulumunda geçerlidir. Genellikle sorgu yuvarlak zamanı, sorgu yürütme süresinden daha fazla faktördür, böylece çalıştırdığınız sorgu sayısını en aza indirmeye çalışmalısınız. Ve bu, döngü için işlem süresini içermiyor. – Technoh

+0

tamam Bu kodu koydum ve işe yarıyor, ancak bu şekilde yapmak istediğim nedenlerden biri, daha sonra, değişikliklerin abone kullanıcılarına e-posta göndermek için kod üzerinde genişletmek istiyorum. – user5641678

İlgili konular