akbalci adlı üyeden alıntı: mesajı görüntüle
$kategoriler = $db->query("SELECT * FROM kategori")->fetchAll(PDO::FETCH_ASSOC);

foreach ($kategoriler as $kat) {
	echo $kat["kategori_isim"] . ' kategorisinin haberleri';

	$sql = $db->prepare("SELECT * FROM haberler WHERE kategori_id = ? ORDER BY  haber_id DESC LIMIT 10");
	$sql->execute(array($kat["kategori_id"]));
	$haberler = $sql->fetchAll(PDO::FETCH_ASSOC);
	
	foreach ($haberler as $hab) {
		echo ' --- Haber başlığı : ' . $hab["haber_baslik"] . '<br>';
	}

	echo '<br><br>';
}
kardeş ilgin için teşekkür ederim ama gece şöyle bir kod hazırladım sanırım hemen hemen sizinki ile aynı olmuş:

<?php
include 'ayar.php';
//kategorilerin sayısını öğreniyorum
$ks = $db->prepare("SELECT COUNT(*) FROM hkat");
$ks->execute();
$ks = $ks->fetchColumn();
$ks++;
for ($i=0; $i < $ks; $i++) {//bütün kategorilerden ayrı ayrı haber çekmek için kategori sayısı kadar döngü çalıştırıyorum 
   //iki ayrı döngü çalıştırmamın tek sebebi kategorinin adını yazdırmak ve bu kategorideki son haberi manşet yapmak
if(!$i == 0){
$tek = $db->query("SELECT * FROM haber WHERE kat = '{$i}' ORDER BY id DESC")->fetch(PDO::FETCH_ASSOC);
$kn = $db->query("SELECT * FROM hkat WHERE id = '{$i}' ORDER BY id DESC")->fetch(PDO::FETCH_ASSOC);
echo "<font color=\"red\">".$kn['baslik']." haberleri</font><br>";// kullanıcıya hangi kategoriye ait haberleri okuduğunu bilmesi için kategorinin adını çekiyorum
echo "<font color=\"blue\"> manset haber kategori: ".$tek['kat']." ".$tek['baslik']."</font><br>";//ilgili kategoriye son eklenen haberi manşet şeklinde yazdırıyorum
}
$query = $db->prepare("SELECT * FROM haber WHERE kat = ? ORDER BY id DESC LIMIT 5");//for dongüsündeki i değişkenindeki değeri haberlerin kategori id si kabul ederek 5 tane haber çekiyorum
$query -> execute(array($i));
if ($query->rowCount()){
   foreach ($query as $row) {
      
      echo "kategori id: ".$row['kat']." : ".$row['baslik']."<br>";
   }
}
}

?>
çıktısı: