2013-03-08 57 views
2

我有一個表在我的數據庫,包括kategoriID,kategoriAd,kategoriEbeveyn。 它就像categoryID,catagoryName和categoryParent。Mysql查詢工作,但不進入循環,PHP,MYSQL

我想這種情況是當我嘗試刪除主要類別,我可以刪除主要類別和子類別。

- 世界

............ +歐洲

...................... *土耳其

................................. **伊斯坦布爾

當我嘗試刪除,此功能適用於世界和歐洲。但土耳其和伊斯坦布爾仍在我的數據庫中。由於錯誤,我無法刪除這些內容。

「mysql_fetch_array()預計參數1是資源,布爾在給定的」

| kategoriID | kategoriAd | kategoriEbeveyn |

| 1 |世界| 0 |

| 2 |歐洲| 1 |

| 3 |土耳其| | 2 |

| 4 |伊斯坦堡| 3 |

這是我的功能。

<?php 

function KategoriVeAltKategorileriSil(){ 
$kategoriID = $_GET['kategoriID']; 
    mysql_query("DELETE FROM kategoriler WHERE kategoriID = ' $kategoriID '") or die (mysql_error()); 
     $delete = mysql_query("DELETE FROM kategoriler WHERE kategoriEbeveyn = ' $kategoriID ' ") or die (mysql_error());   

    if($delete){ 
     while($silinecek = mysql_fetch_array($delete)){ 

       KategoriVeAltKategorileriSil($silenecek[' kategoriID ']); 
      echo mysql_error(); 
        } 
    echo "Kategori ve alt kategorileri silindi."; 
    }else{ echo "Silme işlemi gerçekleştirilemedi!" .mysql_error(); } 
     } 

?> 

或者我是否需要使用觸發器?

+0

請告訴我你的表結構? – Prashank 2013-03-08 11:28:53

+1

您無法獲取DELETE請求,因爲DELETE只返回已刪除行的數量。如果你想獲取,使用SELECT語句,而不是 – JoDev 2013-03-08 11:29:01

+0

我的猜測是,這個'while($ silinecek = mysql_fetch_array($ delete))'{返回false。 – Voitcus 2013-03-08 11:29:23

回答

0

,最好的辦法是使像一個請求:

DELETE FROM kategoriler WHERE ketegoriID IN (SELECT kategoriID 
FROM kategoriler 
WHERE kategoriID = ' $kategoriID ' or kategoriEbeveyn = ' $kategoriID '); 
當然

它不是完整的,因爲我不知道你的數據庫結構

4
function deleteCategory($kategoriID) { 
     $result=mysql_query("SELECT * FROM kategoriler WHERE kategoriEbeveyn='$kategoriID'"); 
     if (mysql_num_rows($result)>0) { 
      while($row=mysql_fetch_array($result)) { 
        deleteCategory($row['kategoriID']); 
      } 
     } 
     mysql_query("DELETE FROM kategoriler WHERE kategoriID='$kategoriID'"); 
    } 

you can use this recursive function 
+0

謝謝你的解決方案。但我仍然有這條線上的錯誤deleteCategory($ row ['kategoriID']);未定義的索引:kategoriID in。對不起,我是php中的新手。可能是我的開關箱功能有問題。$ Go = @ $ _ GET ['Go']; Switch($ Go){case「deleteCategory」:deleteCategory(); break;} – 2013-03-08 13:21:41

+0

或者我需要在switch case函數中調用這個函數? case「deleteCategory」:deleteCategory($ kategoriID);打破; – 2013-03-08 13:51:19

+0

如果您使用上面的代碼,然後檢查表中是否存在kategoriID字段是的,您可以使用案例 – 2013-03-09 07:35:20

0

好了,問題是,你具有映射到DB的扁平(行)結構的樹結構。

您將需要使用遞歸刪除方法處理此問題。

您的代碼也許應該是這個樣子:

function DeleteCategory(catId) 
{ 
    GetChildCategoriesOf(catId) 

    if (num_rows > 0) 
    { 
     foreach(ChildCategoryFound) 
     { 
       DeleteCategory(ChildCatId); //Recursive call 
     } 
    } 

    Delete(catId) //Delete the parent as last action 
}