sql :
-- 
-- Tablo yapısı: `s_kategoriler` 
-- 
CREATE TABLE `s_kategoriler` ( 
  `kategori_id` int(11) NOT NULL auto_increment, 
  `kategori_adi` varchar(255) default NULL, 
  `altkategori_id` int(11) default NULL, 
  PRIMARY KEY  (`kategori_id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=latin5 AUTO_INCREMENT=110 ; 
-- 
-- Tablo döküm verisi `s_kategoriler` 
-- 
INSERT INTO `s_kategoriler` VALUES (109, 'BB1', 108); 
INSERT INTO `s_kategoriler` VALUES (102, 'A', 0); 
INSERT INTO `s_kategoriler` VALUES (103, 'B', 0); 
INSERT INTO `s_kategoriler` VALUES (104, 'C', 0); 
INSERT INTO `s_kategoriler` VALUES (105, 'D', 0); 
INSERT INTO `s_kategoriler` VALUES (106, 'A1', 102); 
INSERT INTO `s_kategoriler` VALUES (107, 'AA1', 106); 
INSERT INTO `s_kategoriler` VALUES (108, 'B1', 103);
kategoriler.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
   <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr"> 
   <head> 
   <title>www.ugurturan.com</title> 
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9" /> 
   <script language="JavaScript" type="text/javascript"> 
   //Ürünleri Silme işlemi 
   var checkflag = "false"; 
   function sec(field) 
   { 
   if (checkflag == "false") 
   { 
   for (i = 0; i < field.length; i++) 
   { 
   field[i].checked = true; 
   } 
   checkflag = "true"; 
   return "Seçimi Kaldır"; 
   } else { 
   for (i = 0; i < field.length; i++) 
   { 
   field[i].checked = false; 
   } 
   checkflag = "false"; 
   return "Tümünü Seç"; 
   } 
   } 
   <!--SİLMEK İSTEDİGİNİZDE SİZİ UYARAN KODLAR--> 
   function islemler(mesaj) 
   { 
   var total = 0; 
   var max   = 0; 
   max       = formbilgi.onaykutusu.length; 
   for (var idx = 0; idx < max; idx++) 
   { 
   if (eval("document.formbilgi.onaykutusu[" + idx + "].checked") == true) 
   { 
     total += 1; 
   } 
   } 
   if (total == 0) 
   { 
   alert("Hiç Seçim Yapmadınız"); 
   return false; 
   } else { 
   return confirm('Seçtiğiniz ' + total + ' Veriyi Silmek İstiyormusunuz? Veri Tamamen Silinecek'); 
   } 
   } 
   <!-- SİLME İŞLEMLERİ BİTİŞİ --> 
   </script> 
   </head> 
   <body> 
   <?php 
   // www.ugurturan.com 
   // Uğur TURAN 
   // info@ugurturan.com 
   // ugurturan@msn.com 
   // Bismillah diyerek işe başlıyoruz. Çünkü her helal işin başı bismillahtır. 
   // Öncelikle nreden veri alacaksak o veri tabanını tanıtıyoruz. 
   // Ben örnek olsun diye benim veritabanını girdim. Sizde kendinize ait olanı giriniz. 
   @mysql_connect('localhost','root','123456'); 
   @mysql_select_db('zedatriko'); 
   //Sınırsız Kategori Listeleme Fonksiyonudur. 
   function kategorilerilistele($altkategori_id,$level) //completely expand category tree 
   {     
   $q = mysql_query("SELECT kategori_id, kategori_adi, altkategori_id FROM s_kategoriler WHERE kategori_id<>0 and altkategori_id=$altkategori_id ORDER BY kategori_adi") or die (mysql_error()); 
   $a = array(); //altkategori_id'ler 
   while ($row = mysql_fetch_row($q)) 
   { 
   $row[5] = $level; 
   $a[] = $row; 
   //Altkategori işlemleri 
   $b = kategorilerilistele($row[0],$level+1); 
   //Ekle $b[] Sonuna $a[] 
   for ($j=0; $j<count($b); $j++) 
   { 
   $a[] = $b[$j]; 
   } 
   } 
   return $a; 
   } //kategorilerilistele 
   //kategorileri Düzenli şekilde Silmek 
   function kategorivealtkategorilerisil($altkategori_id) //Kategorinin Tüm Alt Kategorilerini Siler kategori_id=$altkategori_id 
   { 
      //Alt Kategoriler 
      $q = mysql_query("SELECT kategori_id FROM s_kategoriler WHERE altkategori_id=$altkategori_id and kategori_id<>0") or die (mysql_error()); 
      while ($row = mysql_fetch_row($q)) 
      { 
         kategorivealtkategorilerisil($row[0]); //tekrarlı döngü 
      } 
      $q = mysql_query("DELETE FROM s_kategoriler WHERE altkategori_id=$altkategori_id and kategori_id<>0") or die (mysql_error()); 
      //Root Kategori ile birlikte Ürünlerdeki kategorileri de düzenler 
      $q = mysql_query("UPDATE urunler SET kategori_id=0 WHERE kategori_id=$altkategori_id") or die (mysql_error()); 
   } 
   @ $s_kategorilerislem      = strip_tags(trim($_GET['s_kategorilerislem'])); 
   if (!$s_kategorilerislem) 
   { 
   @ $ekle                  = intval($_GET['ekle']); 
   if (empty($ekle)) 
   {     
   @ $kategori_id            = intval($_GET['kategori_id']); 
   $altkategori_id            = ''; 
   if (empty($kategori_id)) { 
   $bbaslik               = "ÜRÜN KATEGORİSİ EKLE"; 
   $buton                  = "KAYDET"; 
   } else { 
   $bbaslik               = "ÜRÜN KATEGORİSİNİ DÜZENLE"; 
   $buton                  = "DEGİŞTİR"; 
   //kategoriler DUZENLE 
   $kategoriler_duzenleme_sql  = "SELECT * FROM s_kategoriler WHERE kategori_id='$kategori_id'"; 
   $kategoriler_duzenleme_sonuc= mysql_query($kategoriler_duzenleme_sql) or die ("Hata: kategoriler Görülemedi"); 
   $kategoriler_duzen_izin      = mysql_num_rows($kategoriler_duzenleme_sonuc); 
   $kategoriler_ayrinti      = mysql_fetch_array($kategoriler_duzenleme_sonuc); 
   $kategori_id            = $kategoriler_ayrinti["kategori_id"]; 
   $kategori_adi            = $kategoriler_ayrinti["kategori_adi"]; 
   $altkategori_id            = $kategoriler_ayrinti["altkategori_id"]; 
   if (!get_magic_quotes_gpc()) 
   { 
   $kategori_adi               = stripslashes($kategori_adi); 
   } 
   mysql_free_result($kategoriler_duzenleme_sonuc); 
   } 
   ?> 
   <table id=AutoNumber1 style="border-collapse: collapse" bordercolor="#111111" cellspacing="0" cellpadding="0" width="50%" border="0" align="center">     
   <tr> 
   <td width="100%" align="center"> 
   <fieldset> 
   <legend>&nbsp;<b>Kategori Ekleyin, Düzenleyin ve Silin</b>&nbsp;</legend> 
   <table width="100%" align="center">     
   <form action="?sayfa=kategoriekle&ekle=1" method="post"> 
  <input type="hidden" name="kategori_id" value="<?php echo trim($kategori_id);?>" /> 
   <td width="50%" bgcolor=#f0f8ff align="center" class="baslik">Root Ana kategoridir. Diğer kategorilere alt kategoriler eklemek için Root altındaki kategorilerden birisini seçip veri girişinden kategori yazıp kaydet demeniz yeterlidir.</td> 
   </tr> 
   <tr> 
   <td width="50%" bgcolor=#f0f8ff align="center" class="altkategori">Kategori Listesi : 
   <select name="altkategori_id"> 
   <option value="0">Root</option> 
   <?php 
   //kategorileri listele combobox 
   $tmp = isset($_GET["w"]) ? $_GET["w"] : $_POST["altkategori_id"]; 
   $cats = kategorilerilistele(0,0); 
   for ($i=0; $i<count($cats); $i++) 
   { 
   echo "<option value=\"".$cats[$i][0]."\""; 
   if ($tmp == $cats[$i][0]) //select kategori 
   echo " selected"; 
   echo ">"; 
   for ($j=0;$j<$cats[$i][5];$j++) echo "&nbsp;&nbsp;"; 
   echo $cats[$i][1]; 
   echo "</option>"; 
   } 
   ?> 
   </select> 
   </td> 
   </tr> 
   <tr> 
   <td width="50%" bgcolor=#f0f8ff align="center" class="altkategori">Veri Girişi : 
   <input size="40" name="kategori_adi" value="<?php echo $kategori_adi; ?>"></td> 
   </tr> 
   <tr> 
   <td width="50%" bgcolor=#f0f8ff align="center" class="altkategori"> 
   <input type="submit" name="ekle" value="<?php echo $buton; ?>"></td> 
   </tr>     
   </table> 
   </fieldset>     
   </form> 
   </table> 
   <?php     
   unset($kategoriler_ayrinti);     
   } elseif ($ekle == 1) {     
   $kategori_id         = abs(intval($_POST['kategori_id'])); 
   $kategori_adi         = trim(strip_tags(htmlspecialchars($_POST['kategori_adi']))); 
   if (!$kategori_adi) 
   { 
      echo '<script>alert("İşaretli Alanlar Zorunludur.");history.go(-1)</script>'; 
      exit; 
   } 
   if (!get_magic_quotes_gpc()) 
   {     
   $kategori_adi         = addslashes($kategori_adi); 
   $altkategori_id         = addslashes($altkategori_id);     
   } 
   if (empty($kategori_id)) 
   {     
   $q = mysql_query("INSERT INTO s_kategoriler (kategori_adi, altkategori_id) VALUES ('$kategori_adi', '$altkategori_id')") or die (mysql_error()); 
   $pid = mysql_insert_id(); 
   echo '<script>alert("Kategori Başarıyla Eklendi.");location.href=\'?sayfa=kategoriekle\';</script>'; 
   } else { 
   $s_kategoriler_duzelt   = "UPDATE s_kategoriler SET kategori_adi = '$kategori_adi' WHERE kategori_id = $kategori_id"; 
   mysql_query($s_kategoriler_duzelt) or die (mysql_error()); 
   echo '<script>alert("Kategori Başarıyla Düzeltildi.");location.href=\'?sayfa=kategoriekle\';</script>'; 
   }     
   } else { 
   echo '<script>alert("İzin Yok");location.href=\'?sayfa=kategoriekle\';</script>';      
   }     
   } elseif ($s_kategorilerislem == 1) { 
   @ $kategorisil            = $_POST['kategorisil']; 
   @ $formbilgi            = $_POST; 
   if ($kategorisil) 
   { 
   //SİLME İŞLEMLERİ (BUNUNLA İLĞİLİ FONKSİYON "baglar/fonk.inc.php" İÇİNDEDİR. (deleteSubCategories) 
   foreach ( $formbilgi as $anahtar=>$deger ) 
   { 
   if ( gettype ($deger ) != "array" ) 
   { 
   if ($anahtar == "kategori_$deger") 
   { 
      $kategorileri_sil      = mysql_query("DELETE FROM s_kategoriler WHERE kategori_id=$deger"); 
      //Kategori siliniyor ve buna baglı alt kategoriler varsa onlarda siliniyor. 
      kategorivealtkategorilerisil($deger); 
   } 
   } 
   } 
   echo '<script>alert("Kategori veya kategoriler başarıyla silindi.");location.href=\'?sayfa=kategoriekle\';</script>';     
   } 
   } 
   ?> 
   <table id=AutoNumber1 style="border-collapse: collapse" bordercolor="#111111" cellspacing="0" cellpadding="0" width="50%" border="0" align="center"> 
   <tbody> 
   <tr> 
   <td width="100%"> 
   <fieldset> 
   <legend>&nbsp;<b><?php echo $dil['kategoriguncellesil']; ?></b>&nbsp;</legend> 
   <table width="100%" align="center">     
   <form action="?sayfa=kategoriekle&s_kategorilerislem=1" method="post" name="formbilgi"> 
   <input type="hidden" name="kategori_id" value="<?php echo trim($kategori_id);?>" /> 
   <?php 
   $toplam                = mysql_query("SELECT COUNT(*) FROM s_kategoriler"); 
   list($toplam_kategoriler)   = mysql_fetch_row($toplam); 
   mysql_free_result($toplam); 
   echo ' 
   <tr> 
   <td width=100% colspan="8" align="center" bgcolor="#f0f8ff"> 
   </td> 
   </tr> 
   <tr> 
   <td width=100% colspan="6" align="left" bgcolor="#f0f8ff">';         
   echo '&nbsp;&nbsp;<font color="#FF0000">&nbsp;&nbsp;Seçilileri : </font> 
   <input type="submit" value="Sil" name="kategorisil" onclick="return islemler(\'Silinecek Eminmisin\')">&nbsp;&nbsp;Toplam Kategori ve Alt Kategori Sayısı : <b>'.$toplam_kategoriler.'</b> 
   <tr bgColor="#4faafa"> 
   <td width="5%" align="left"> 
   <input type="checkbox" onclick="this.value=sec(this.form.onaykutusu)"></td> 
   <td width="90%" align="left"><b>Kategori Adı</b></td> 
   </tr>'; 
   #Kategorileri Listele 
   Listele(0,""); 
   # Özyinelemeli listele fonksiyonu 
   # ---------------------------------------------------------------------------------------- 
   function Listele($kategori_id,$derinlik){ 
   # Sorgu cümlesi 
   $cumle = "select *, find_in_set(".$kategori_id.",altkategori_id) as seviye from s_kategoriler having seviye = 1"; 
   $sorgu = mysql_query($cumle);     
   # Kayıtları bas 
   while($sonuc            = mysql_fetch_array($sorgu)){     
   $kategori_adi            = $sonuc["kategori_adi"]; 
   $kategori_id            = $sonuc["kategori_id"]; 
   # Kategorı bilgilerini bas, Alt kategorileri (varsa) bas     
   echo ' 
   <tr bgColor="#cae3f9"> 
   <td width="10%" align="left"><input type="checkbox" id="onaykutusu" name="kategori_'.$kategori_id.'" value="'.$kategori_id.'" class="onaykutusu"></td>           
   <td width="20%" align="left">'.$derinlik.'<a href="?sayfa=kategoriekle&kategori_id='.$kategori_id.'">'.$kategori_adi.'</td>     
   </tr>'; 
   Listele($kategori_id,$derinlik."&nbsp;&nbsp;&nbsp;&nbsp;"); 
   } 
   return; 
   } 
   echo ' 
   <tr> 
   <td colspan="3" width="100%" bgcolor="#f0f8ff" align="left"> 
   &nbsp;&nbsp;<font color="#FF0000">&nbsp;&nbsp;Seçilileri : </font> 
   <input type="submit" value="Sil" name="kategorisil" onclick="return islemler(\'Silinecek Eminmisin\')"></td> 
   </tr>';     
   ?> 
   </form> 
   </table> 
   </fieldset> 
   </td> 
   </tbody> 
   </tr> 
   </table> 
   </body> 
   </html>
kaynak : pehepe.org - ugur turan