• 01-02-2018, 17:20:53
    #1
    Merhaba arkadaÅŸlar. 2 tablom var;
    yazi=yazi_id--yazi_ad--kategori_id
    kategori=kategori_id,kategori_ad

    Yapmak istediğim şey yazıya birden çok kategori ekleyip index sayfasında da id olarak çektiğim kategorileri ad olarak yazdırmak. Örneğin Bir yazıya implode ederek 3 kategori ekliyorum. Çekerken ise explode edip çekiyorum. Aşağıda yazdığım kod sorunsuz çalışıyor ama inner join yapmadan çalıştı.

    <?php 
    ob_start();
    include 'tools/trigger.php';
    
    $yazisor=$db->prepare("SELECT * FROM yazi ORDER BY yazi_id");
    $yazisor->execute(); 
    ?>
    
    
    <form method="post" action="tools/trigger.php">
    	<table border="1" align="center">
    		<tr>s
    			<td><input type="submit" value="coklu sil" name="submit">
    			</td>
    			<td>AD</td>
    			<td>KATEGORI</td>
    		</tr>
    
    		<?php
    		while ($yazicek=$yazisor->fetch(PDO::FETCH_ASSOC)) {  ?>
    
    		<tr>
    			<td><center><input type="checkbox" value="<?php echo $yazicek['yazi_id']; ?>" name="chk[]"></center></td>
    			<td><?php echo $yazicek['yazi_ad']; ?></td>
    			<td>
    
    				<?php 
    				$a=$yazicek['kategori_id'];
    				$b=explode(",",$a);
    				foreach ($b as $kategoribas) { 
    					$kategorisor=$db->prepare("SELECT * FROM kategori where kategori_id=$kategoribas");
    					$kategorisor->execute(); 
    					$kategoricek=$kategorisor->fetch(PDO::FETCH_ASSOC);
    					?>
    					<button><?php echo $kategoricek['kategori_ad']; ?></button>
    					<?php  } ?>
    				</td>
    			</tr>
    			<?php }?>
    		</table>
    	</form>
    Sormak istediğim şey bu kod verimli mi yoksa inner join kullanmadıgım için sistemi gereksiz yorar mı? Sorgu gereksiz yere 2 kere while döngüsüne girdiği için tereddüt yaşıyorum.

    Inner join ile denedim, fakat bu defa da explode ederken sorun yaşadım. Sadece ilk kategori adını çekiyor aşağıdaki kod gibi yapınca.

    <?php 
    ob_start();
    include 'tools/trigger.php';
    
    $yazisor=$db->prepare("SELECT
    yazi.yazi_id,
    yazi.kategori_id,
    yazi.yazi_ad,
    yazi.yazi_resimyol,
    kategori.kategori_id,
    kategori.kategori_ad
    FROM
    kategori
    INNER JOIN yazi ON kategori.kategori_id = yazi.kategori_id");
    $yazisor->execute(); 
    ?>
    
    <form method="post" action="tools/trigger.php">
    	<table border="1" align="center">
    		<tr>s
    			<td><input type="submit" value="coklu sil" name="submit">
    			</td>
    			<td>AD</td>
    			<td>KATEGORI</td>
    		</tr>
    
    		<?php
    		while ($yazicek=$yazisor->fetch(PDO::FETCH_ASSOC)) {  ?>
    
    		<tr>
    			<td><center><input type="checkbox" value="<?php echo $yazicek['yazi_id']; ?>" name="chk[]"></center></td>
    			<td><?php echo $yazicek['yazi_ad']; ?></td>
    			<td>
    
    				<?php 
    				$a=$yazicek['kategori_id'];
    				$b=explode(",",$a);
    				foreach ($b as $kategoribas) { ?>
    					<button><?php echo $yazicek['kategori_ad']; ?></button>
    					<?php  } ?>
    				</td>
    			</tr>
    			<?php }?>
    		</table>
    	</form>
    İlk kod sorunsuz çalışıyor ama inner join ile daha sadece şekilde dediğimi yapabilir miyim? Umarım sorunu anlatabilmişimdir. Teşekkürler.
  • 01-02-2018, 17:37:00
    #2
    Bu veritabanı tasarımına göre bir yazıya birden çok kategori atamazsın ! Bir kategoriyi birden çok yazıya atayabilirsin. Koda bakmadım ama db tasarımda sıkıntı var zaten. Bir yazıya birden fazla kategori eklemek için 3. bir table yazman gerek. Örneğin : KategoriYazi=id,kategori_id,yazi_id.
  • 01-02-2018, 18:47:49
    #3
    Scythe2112 adlı üyeden alıntı: mesajı görüntüle
    Bu veritabanı tasarıma göre bir yazıya birden çok kategori atamazsın ! Bir kategoriyi birden çok yazıyı atayabilirsin. Koda bakmadım ama db tasarımda sıkıntı var zaten. Bir yazıya birden fazla kategori eklemek için 3. bir table yazman gerek. Örneğin : KategoriYazi=id,kategori_id,yazi_id.
    Belirttiğiniz şekilde yaparsak veri tabanı boyutu gereksiz olarak artmış olmaz mı? Bir yazıya 10 kategori eklediğimi düşünelim.KategoriYazi tablosu ile ek olarak 10 satır ve 3 sutun veri oluşacak, benimki gibi yapınca ise sadece 1 hücreye tum veri eklenmiş olacak.

    Aslında sormak istediğim yapı değilde, explode ile oluşturulan array id lerini diğer tablodaki id ile eşleştirip diğer sütündaki adı nasıl çekeceğim. Bu tabloları deneme amaçlı oluşturdum.
  • 01-02-2018, 20:55:14
    #4
    ztk
    Kimlik doğrulama veya yönetimden onay bekliyor.
    old_boy adlı üyeden alıntı: mesajı görüntüle
    Belirttiğiniz şekilde yaparsak veri tabanı boyutu gereksiz olarak artmış olmaz mı? Bir yazıya 10 kategori eklediğimi düşünelim.KategoriYazi tablosu ile ek olarak 10 satır ve 3 sutun veri oluşacak, benimki gibi yapınca ise sadece 1 hücreye tum veri eklenmiş olacak.

    Aslında sormak istediğim yapı değilde, explode ile oluşturulan array id lerini diğer tablodaki id ile eşleştirip diğer sütündaki adı nasıl çekeceğim. Bu tabloları deneme amaçlı oluşturdum.
    Bir tabloda bir hücre birden fazla veri tutuyorsa bu kötü tasarlanmış bir veritabanıdır.
    Veritabanında çok tablo olmasından yada tablolarda çok veri olmasından bu kadar korkmanıza gerek yok, veritabanının işi veri tutmak, yani en iyi yapabileceği işi yapmasına izin vermiyorsunuz yapamaz diye mi düşünüyorsunuz? Doğru tasarlanmaması çok daha kötü. Explode ile parçalayıp işi php ye yaptırınca daha performanslı çalışacağını mı düşünüyorsunuz? Kesinlikle böyle birşey yok. Bir yazıya birden fazla kategori eklemek için üstteki arkadaşın dediği gibi üçüncü bir tablo oluşturup veritabanınızı normalize etmelisiniz. Öteki türlü sisteminize yeni birşey eklerken saçınızı başınızı yolmak zorunda kalırsınız nasıl yapacağım diye. Bir yazıda ekli kategorilerden bir tanesini çıkarmak istediğinizde ne yapacaksınız mesela? Yazıyı çek, kategorileri virgülden parçala, benim istediğimi sil, yeniden birleştir, güncelle. Bunu yapana kadar 3.tablodaki bir satırı silmeniz yeterli olacak. Bunları düşünmeden hareket etmeyin.

    Bol ÅŸans.
  • 02-02-2018, 03:29:50
    #5
    Önerilerinizi dikkate alacağım. Çok teşekkürler.