• 11-06-2010, 12:43:19
    #1
    arkadaşlar merhabalar,
    bir sorunum var yalın bir dille anlatmaya çalışayım,yardımcı olacak arkadaşlara şimdiden teşekkürler..

    sınırsız kategorileme (recursive) sistemi olan bir alışveriş sitesi üzerinde çalışıyorum, sorunum şu;

    kategori tablom;

    id | ustkat_id | kategori_adi

    şeklinde.

    ürün eklerken bir ürünü birden fazla kategoriye eklemek ve listelemek istiyorum.

    örnek veriyorum;

    ekte gönderdiğim resimden daha iyi anlayabilirsiniz..

    mesela ziyaretçi "Okul Ürünleri" başlığına tıklayınca;

    Kalemler-Silgiler kategorilerindeki ürünler listelensin..

    function Listele($kategori_id,$derinlik){ 
       # Sorgu cümlesi 
       $cumle = "select *, find_in_set(".$kategori_id.",ustkat_id) as seviye from kategoriler having seviye = 1"; 
       $sorgu = mysql_query($cumle);     
         
       # Kayitlari bas 
       while($sonuc                = mysql_fetch_array($sorgu)){     
       $kategori_adi            = $sonuc["kategori_adi"]; 
       $kategori_id                = $sonuc["id"]; 
            
       # Kategori bilgilerini bas, Alt kategorileri (varsa) bas     
       echo ' 
      <td bgcolor="#E9E9E9" class="kategoriler">'.$derinlik.'<a href="kategori.php?kategori_id='.$kategori_id.'">'.$kategori_adi.'
      </a>
      </td>  
       </tr>'; 
       Listele($kategori_id,$derinlik."  <img src='images/arrow_right.gif' >"); 
       } 
       return; 
       } 
    
    Listele(0,"");
                 
    $kategori_id = $_GET["kategori_id"];
    
    $sor    = mysql_query("select * from urunler where katid='$kategori_id' order by urun_id");
                    while($cek=mysql_fetch_array($sor)){ 
    $id         = $cek["urun_id"];
    $urunadi    = $cek["urunadi"];
    
    echo $urunadi."<br>";
    
    }
    bu kod düzeneği ile kategorileri listeliyorum fakat ana kategorilere tıkladığımda hiç bir ürün gelmiyor doğal olarak..

    nasıl bir çözüm yolu gösterebilirsiniz?

    teşekkürler.

  • 11-06-2010, 15:22:45
    #2
    $sor = mysql_query("select * from urunler where katid='$kategori_id' order by urun_id");
    while($cek=mysql_fetch_array($sor)){ bu sorguyu

    $sor = mysql_query("select * from urunler where ustkat_id='$kategori_id' order by urun_id");
    while($cek=mysql_fetch_array($sor)){
    şeklinde yaparsan gösterebilir db yapısı buna müsait anladığım kadarıyla
  • 11-06-2010, 21:55:50
    #3
    Üyeliği durduruldu
    iki adet kategori eklemek yerine veri tabanındaki tablonda 1 satır daha oluştur kategori 2 diye ikinci kategorinin idsini buraya kaydet kategorileri çektiğin sorguda her iki tabloyu sorgula örnek;

    $sql = "SELECT * FROM kategoriler WHERE kategori1='1' or kategori2='1'";
  • 11-06-2010, 22:11:36
    #4
    Sistemin biraz karışık geldi bana. Senin nasıl yaptığını pek anlayamadım, ama ben olsam ürünün kategorilerini herhangi bir sabit (virgül veya "|" işareti) ile ayırıp veritabanından olduğu gibi çektikten sonra explode ile ayırarak alırdım. Yine de daha iyi bir fikrin varsa, onu uygula.
  • 11-06-2010, 23:31:01
    #5
    Grafix, amacın bir ürüne birden fazla kategori eklemek mi? Yoksa alt kategoriye eklediğin ürünleri o kategorinin üst katgorisine tıklayınca da görmek mi?
  • 12-06-2010, 08:59:19
    #6
    amacım alt kategoriye eklediğim ürünleri o kategorinin üst katgorisine tıklayınca da görmek..
  • 12-06-2010, 10:07:33
    #7
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Arkadaşım bu şekilde bir yapı kurup find_in_set ve having=1 kullanman yanlış, sağ kulağını sol elinle göstermek gibi olur. Yani tablo yapın

    id | ustkat_id | kategori_adi
    3 1 Falanca kategori

    gibi ise. Çünkü zaten direk
    select * from kategoriler where ustkat_id=1
    diye alabilirsin. Yok eğer ustkat_id de bağlantılı kategorileri 5,2,1,-1 gibi tutuyorsan having=1 kullanman yanlış.

    Bu durumda ilk söylediğim şekilde tutuyorsan ya urunler için kategori ve ana kategori şeklinde iki alan tutup bu alanlara göre çekeceksin

    select * from urunler where kat_id=1 or ustkat_id=1
    şeklinde. Ya da sınırsız kategori ve virgül ile ayırıp having kullanıyorsan örneğin şu şekilde:


    id | ustkat_id | kategori_adi
    ---------------------------
    1 | 1,-1 | Okul ürünleri
    2 | 2,1,-1 | Kalemler
    3 | 3,1,-1 | Silgiler
    4 | 4,-1 | Toner
    5 | 5,4,-1 | Hp
    6 | 6,4,-1 | Xerox

    'select *, find_in_set('.$kategori_id.',ustkat_id) as seviye from kategoriler having seviye = 2';
    şeklinde kategoriler tablosundan o kategorinin alt kategorilerini bulup, gelen kat. idlerine göre ürünler tablosundan ürünleri çekeceksin.
  • 12-06-2010, 12:21:59
    #8
    Eposta Aktivasyonu Gerekmekte
    Gelen kategorinin üst kategorilerini inner join ile bulabilirsin


    SELECT Kat.kategori_adi as 'Alt Kategori',UstKat.kategori_adi as 'Üst Kategori' FROM kategoriler AS Kat INNER JOIN kategoriler AS UstKat ON Kat.ustkat_id=UstKat.id OR id=$KategoriID