• 23-06-2015, 00:58:43
    #1
    Hazır olarak paylaşılmıştır, soru değildir, geliştirmek isteyenler el atabilirler
    php betikteki require_once "sql.php"; sql.php https://github.com/joshcam/PHP-MySQLi-Database-Class bu adresteki mysqli sınıfıdır. İsteyen PDO, Mysql olarakta düzenleyebilir kendi sınıfına göre.


    Kullanılan Tablo Yapısı

    CREATE TABLE IF NOT EXISTS `kategori` (
      `ID` mediumint(6) NOT NULL,
      `SubID` mediumint(6) NOT NULL DEFAULT '0',
      `Kategori` varchar(100) CHARACTER SET utf8 NOT NULL,
      `Aciklama` varchar(200) CHARACTER SET utf8 NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
    
    --
    -- Tablo döküm verisi `kategori`
    --
    
    INSERT INTO `kategori` (`ID`, `SubID`, `Kategori`, `Aciklama`) VALUES
    (1, 0, 'Ana Kategori', 'Ana Kategori Açıklaması'),
    (2, 0, 'Ana Kategori 2 ', 'Ana Kategori 2 Açıkaması'),
    (3, 0, 'Ana Kategori 3', 'Ana Kategori 3 Açıklaması'),
    (4, 0, 'Ana Kategori 4 ', 'Ana Kategori 4 Açıkaması'),
    (5, 1, 'Alt Kategori 1-0', 'Alt Kategori Açıklaması'),
    (6, 2, 'Alt Kategori 2-0 ', 'Alt Kategori 2 Açıkaması'),
    (7, 1, 'Alt Kategori 1-1', 'Alt Kategori Açıklaması'),
    (8, 2, 'Alt Kategori 2-1 ', 'Alt Kategori 2 Açıkaması'),
    (9, 3, 'Alt Kategori 3', 'Alt Kategori Açıklaması'),
    (10, 3, 'Alt Kategori 3-1 ', 'Alt Kategori 3-1 Açıkaması'),
    (11, 7, 'Deneme En Alt Kategori', 'Deneme En Alt Kategori Açıklaması'),
    (12, 8, 'Deneme En Alt Kategori Açıklaması', 'Deneme En Alt Kategori Açıklaması'),
    (13, 11, 'Daha Dip Kategori', 'Daha Dip Kategori'),
    (14, 13, 'Yok Artık Kategorisi', 'Yok Artık Kategorisi'),
    (15, 5, 'Alt Kategori Deneme', 'Alt Kategori Deneme Açıklaması');
    PHP İşlem Kısmı

    <?php 
    require_once "sql.php";
    $DB = new Mysqlidb("localhost", "root", "", "test");
    $sub = 1;
    function AltKategoriler($id, $sub=1){
    global $alt_kategoriler;
    	if(isset($alt_kategoriler[$id])) {
    		$y = $alt_kategoriler[$id];
    		foreach($y as $yak) {
    			$ss = "=";
    			for($i=1;$i<=$sub;$i++): $ss .= "="; endfor;
    			echo "║$ss ".$yak["Baslik"]." - ".$yak["Aciklama"]."</br>";
    			AltKategoriler($yak["ID"],($sub+1));	
    		}
    	}
    }
    $kategoriler = array();
    $alt_kategoriler = array();
    $DB->orderBy("SubID","ASC");
    $liste = $DB->get("kategori");
    	foreach($liste as $kategori) {
    		if($kategori["SubID"]==0) {
    			$kategoriler[$kategori["ID"]] = array("ID"=>$kategori["ID"],"Baslik"=>$kategori["Kategori"], "Aciklama"=>$kategori["Aciklama"]);
    		} else {
    			$alt_kategoriler[$kategori["SubID"]][] = array("ID"=>$kategori["ID"],"Baslik"=>$kategori["Kategori"], "Aciklama"=>$kategori["Aciklama"],"AnaKategori"=>$kategori["SubID"]);		
    		}	
    	}
    	foreach($kategoriler as $k) {
    		echo "╔".$k["Baslik"]." - ".$k["Aciklama"]."</br>";
    		AltKategoriler($k["ID"], 1);
    	}
    ?>
    Çıktısı

    ╔Ana Kategori - Ana Kategori Açıklaması
    ║== Alt Kategori 1-0 - Alt Kategori Açıklaması
    ║=== Alt Kategori Deneme - Alt Kategori Deneme Açıklaması
    ║== Alt Kategori 1-1 - Alt Kategori Açıklaması
    ║=== Deneme En Alt Kategori - Deneme En Alt Kategori Açıklaması
    ║==== Daha Dip Kategori - Daha Dip Kategori
    ║===== Yok Artık Kategorisi - Yok Artık Kategorisi
    ╔Ana Kategori 2 - Ana Kategori 2 Açıkaması
    ║== Alt Kategori 2-1 - Alt Kategori 2 Açıkaması
    ║=== Deneme En Alt Kategori Açıklaması - Deneme En Alt Kategori Açıklaması
    ║== Alt Kategori 2-0 - Alt Kategori 2 Açıkaması
    ╔Ana Kategori 3 - Ana Kategori 3 Açıklaması
    ║== Alt Kategori 3 - Alt Kategori Açıklaması
    ║== Alt Kategori 3-1 - Alt Kategori 3-1 Açıkaması
    ╔Ana Kategori 4 - Ana Kategori 4 Açıkaması
    Kodu geliştirecek her türlü öneriye açığım
    Kaynak
  • 23-06-2015, 01:09:01
    #2
    Üyeliği durduruldu
    ben de pdo ile hazırlanmış halini paylaşayım

    CREATE TABLE IF NOT EXISTS `categories` (
      `category_id` int(11) NOT NULL AUTO_INCREMENT,
      `category_name` text CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL,
      `category_description` text CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL,
      `category_img` text CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL,
      `category_alt` int(11) NOT NULL,
      PRIMARY KEY (`category_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    
    -- 
    -- Tablo döküm verisi `categories` 
    -- 
    
    INSERT INTO `category` (`category_id`, `category_name`, `category_description`, `category_img`, `category_alt`) VALUES 
    (1, 'Hayvanlar Alemi', 'Hayvanlar kategorisi Açıklaması', 'cat-2213.jpg', '0'), 
    (2, 'İnsanlar Alemi', 'İnsanlar kategorisi Açıklaması', 'cat-2214.jpg', '0'), 
    (3, 'Ak gezenler Alemi', 'Ak gezenler kategorisi Açıklaması', 'cat-2215.jpg', '0'), 
    (4, 'Kedigiller', 'Kedigiller kategorisi Açıklaması', 'cat-2215.jpg', '1');
                <?php 
                  include_once('config.php'); // bağlantı dosyası
                  $query = $db->query("SELECT * FROM categories WHERE category_alt LIKE '0'", PDO::FETCH_ASSOC);
                  if ( $query->rowCount() ){
                    foreach( $query as $row ){
                      ?>
                      <optgroup label="- <?php echo $row['category_name']; ?>">
                        <?php 
                          $query = $db->query("SELECT * FROM categories WHERE category_alt LIKE '$row[category_id]'", PDO::FETCH_ASSOC);
                          if ( $query->rowCount() ){
                               foreach( $query as $row ){
                                    echo '<option value="'.$row['category_id'].'">- '.$row['category_name'].'</option>';
                               }
                          }
                        ?>
                      </optgroup>
                    <?php 
                  }
                }
              ?>
    tek sql sorgusu değil düzenleyeceğim
  • 23-06-2015, 08:46:35
    #3
    Şurada bir yanlış anlaşılma var sanırım. Tek SQL Sorgusu diye yazmışsınız başlıkta ama o fonksiyonda zaten sql sorgusu defalarca tekrarlıyor kendini. Ayrıca sınırsız kategorilerde hiyerarşik kategorileme mantığı kullanırsanız daha detaylı ve kullanımı rahat bir yapı da elde edebilirsiniz.

    http://www.sitepoint.com/hierarchical-data-database/
  • 24-06-2015, 03:58:40
    #4
    Üyeliği durduruldu
    elinize sağlık emek vermişsiniz.
    biraz düzenlemek lazım kodları ve çalışma yapısını, vaktim olursa bakacağım, bu hali ile kullanılabilir
  • 26-06-2015, 11:23:58
    #5
    bana göre sql sorgusunu array içerisine atıp tekrar databese sorgusu yapmak yerine array i kullanmak daha mantıklı geldi.
  • 26-06-2015, 12:15:08
    #6
    loc adlı üyeden alıntı: mesajı görüntüle
    Şurada bir yanlış anlaşılma var sanırım. Tek SQL Sorgusu diye yazmışsınız başlıkta ama o fonksiyonda zaten sql sorgusu defalarca tekrarlıyor kendini. Ayrıca sınırsız kategorilerde hiyerarşik kategorileme mantığı kullanırsanız daha detaylı ve kullanımı rahat bir yapı da elde edebilirsiniz.

    http://www.sitepoint.com/hierarchical-data-database/
    yanlışınız var hocam, arkadaşın verdiği örnekte sadece bir sql kodu çalıştırılıyor. kategoriler tablosundaki tüm veriler çekildikten sonra foreach ile kategoriler ve alt_kategoriler diye 2 farklı array değişkeninde toplanıyor.
  • 26-06-2015, 15:58:22
    #7
    sDenizhan adlı üyeden alıntı: mesajı görüntüle
    yanlışınız var hocam, arkadaşın verdiği örnekte sadece bir sql kodu çalıştırılıyor. kategoriler tablosundaki tüm veriler çekildikten sonra foreach ile kategoriler ve alt_kategoriler diye 2 farklı array değişkeninde toplanıyor.
    ilk örnek tek sorguda array a atayıp oradan çözüyor. PDO örneği veren için aynı durum geçerli değil.Döngüde sürekli sorgu çekiyor.
  • 28-06-2015, 16:47:22
    #8
    wizz adlı üyeden alıntı: mesajı görüntüle
    ilk örnek tek sorguda array a atayıp oradan çözüyor. PDO örneği veren için aynı durum geçerli değil.Döngüde sürekli sorgu çekiyor.
    ben de ilk örnek için demiştim ...
  • 20-12-2020, 15:47:35
    #9
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Eski bir konu fakat tek mysql sorgusu ve pdo kullanarak iki farklı sınırsız kategori mantığını şurada anlatmıştım işinize yarar umarım