2013-10-23 54 views
0

我不知道這裏發生了什麼,我測試了這個代碼在本地主機,但現在,我已經嘗試去住,我收到此錯誤信息:遞歸菜單導致致命的錯誤:讓內存大小耗盡

致命錯誤:允許內存大小67108864字節耗盡(試圖分配261900字節)在... /函數/ tree.php在線24

我猜測代碼導致某種無限遞歸,但我是一個有點困惑,因爲它在本地主機上運行良好。我花了幾天的時間試圖讓它按照我想要的方式運作,我不願在沒有方向的情況下改變事情。任何想法可能會導致此錯誤和/或如何解決它?

<?php 
function hasChild($parent_id) 
{ 
    $sql = "SELECT COUNT(*) as count FROM categories WHERE parent = '" . $parent_id . "'"; 
    $qry = mysql_query($sql); 
    $rs = mysql_fetch_array($qry); 
    return $rs['count']; 
} 

function CategoryTree($list,$parent,$append) 
{ 

    $list = '<li>'.'<a href="inventory.php?cid=' . $parent['id'] . '&cname=' . $parent['cname'] . '">' . $parent['cname'] . '</a>'.'</li>'; 


    if (hasChild($parent['id'])) // check if the id has a child 
    { 
    $append++; 
    $list .= "<ul class='child child".$append."'>"; 
    $sql = "SELECT * FROM categories WHERE parent = '" . $parent['id'] . "'"; 
    $qry = mysql_query($sql); 
    $child = mysql_fetch_array($qry); 
    do{ 
     $list .= CategoryTree($list,$child,$append); //this is line 24 
    }while($child = mysql_fetch_array($qry)); 
    $list .= "</ul>"; 
    } 
    return $list; 
} 
function CategoryList() 
{ 
    $list = ""; 

    $sql = "SELECT * FROM categories WHERE (parent = 0 OR parent IS NULL)"; 
    $qry = mysql_query($sql); 
    $parent = mysql_fetch_array($qry); 
    $mainlist = "<ul class='parent'>"; 
    do{ 
    $mainlist .= CategoryTree($list,$parent,$append = 0); 
    }while($parent = mysql_fetch_array($qry)); 
    $list .= "</ul>"; 
    return $mainlist; 
} 
?> 

回答

0

本地主機設置可能與您的PHP服務器不同。 如果您的PHP服務器沒有足夠的內存,那麼PHP將停止並出現該錯誤。

你需要增加最大允許的內存大小,您可以通過添加這種解決此問題,在您的腳本的頂部如下:

ini_set('memory_limit', '128M'); 

,或者如果你不想觸及代碼,那麼你可以在您的php.ini設置文件中進行設置。

+0

我仍然收到一條錯誤消息,但允許的大小更大,錯誤行現在在第21行,出於某種原因... 致命錯誤:134217728字節允許的內存大小(嘗試分配44個字節)in/functions /tree.php在線21 –

+0

好吧,然後將它設置爲'-1'注意內存泄漏 – meda

0

您正在收集大量的字符串數據。我會考慮重構我的代碼以更頻繁地輸出$ list和$ mainlist的內容。我嘗試將代碼設置爲通過循環在每次迭代中輸出一次。另外,在輸出HTML標籤時,我通常會輸出每個邏輯標籤行,也就是說,如果在實際的HTML文檔中會出現這種情況。這也增加了我輸出的可讀性,如果我必須查看源代碼來找出輸出的樣子。

相關問題