PHP中的递归导航功能(mssql - > sqlsrv问题)

时间:2011-07-07 15:54:22

标签: php sql-server recursion

我们的网站有一个功能,可以抓取所有导航项和子导航项,如下所示:

function setNav($sectionID = 0) {
  $divs = $db->getData("SELECT * 
                          FROM table 
                         WHERE Section = ".$sectionID);
  foreach ($divs as $div) {
    $subArray = setNav($div['ID']);
    $thisArray[$div['ID']]['ID'] = $div['ID'];
    $thisArray[$div['ID']]['Title'] = $div['Title'];
    $thisArray[$div['ID']]['Children'] = $subArray;
  }

  return $thisArray;
}

当我们使用mssql_函数时,它工作正常,但是由于切换到新版本的PHP已被折旧,它会抛出错误说:

  

致命错误:最大功能嵌套
  达到'100'的水平,堕胎!

3 个答案:

答案 0 :(得分:2)

该消息来自PHP,因为您多次重复进入setNav。

除非您的导航树最终导致一百个条目深入,否则我怀疑您调用getData可能会出现问题。

你能确定它返回有效的条目吗?

另外,正如a1ex07所说,如果可能的话,最好使用某种递归查询,而不是递归调用非递归查询。

答案 1 :(得分:2)

此限制由xdebug设置。检查你的php.ini并注释掉加载xdebug库的行,然后重启你的web服务器。

除此之外,您可能希望重构代码以便将来使用嵌套集。

答案 2 :(得分:2)

对于SQL Server 2005及更高版本,您可以编写如下内容:

$divs = $db->getData(" 
WITH tableCTE AS  
  (SELECT * 
    FROM table 
    WHERE Section = ".$sectionID. "
    UNION ALL 
    SELECT t2.* FROM tableCTE t1
    INNER JOIN table t2 ON (t2.id = t1.Section)
   )
 SELECT * FROM tableCTE
  "
);