PHP中的递归导航函数(mssql ->sqlsrv问题)


sql server - Recursive navigation function in PHP (mssql -> sqlsrv problem)

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

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"级别,中止!

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

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

这个消息来自PHP,因为你递归setNav太多次了

除非你有一个最终有100个条目深度的导航树,否则我怀疑你对getData的调用可能出了问题。

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

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

对于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
  "
);