调用函数本身时CodeIgniter中的致命错误

时间:2012-07-31 05:15:32

标签: codeigniter

我想将动态数据插入到我的前序遍历表中。我通过参考本教程使用rebuild_tree技术:http://www.sitepoint.com/hierarchical-data-database-3/

这里我根据codeigniter中的需要修改了代码。但是当我在foreach循环中调用函数rebuild_tree时,它会显示致命错误,如:

Fatal error: Maximum function nesting level of '100' reached, aborting! in /var/www/hr/system/database/drivers/mysql/mysql_driver.php on line 199 Call Stack: 0.0389 360600 1. {main}() /var/www/hr/index.php:0 0.0401 468096 2. require_once('/var/www/hr/system/core/CodeIgniter.php') /var/www/hr/index.php:240 0.0689 3798516 3. call_user_func_array() /var/www/hr/system/core/CodeIgniter.php:359 0.0689 3798588 4. Structure->add_structure() /var/www/hr/system/core/CodeIgniter.php:0 0.0689 3798632 5. 
structure_model->rebuild_tree() /var/www/hr/application/controllers/test/structure.php:42 0.0701 3928356 6. structure_model->rebuild_tree() /var/www/hr/application/models/test/structure_model.php:35 0.0703 3931572 7. structure_model->rebuild_tree() /var/www/hr/application/models/test/structure_model.php:35 0.0705 3934788 8. structure_model->rebuild_tree() /var/www/hr/application/models/test/structure_model.php:35 0.0706 3938008 9. 
    CI_DB_driver->query() /var/www/hr/application/models/xome/structure_model.php:29 0.0848 4216988 97. CI_DB_driver->simple_query() /var/www/hr/system/database/DB_driver.php:299 0.0848 4216988 98. CI_DB_mysql_driver->_execute() /var/www/hr/system/database/DB_driver.php:453 0.0848 4216988 99. CI_DB_mysql_driver->_prep_query() /var/www/hr/system/database/drivers/mysql/mysql_driver.php:178 

以下是我的代码:

function rebuild_tree($parent, $left) {
        $resultArr = array();
        $parent = $_GET['level'];
        $left = $_GET['lft'];
        $right = $_GET['rgt'];

        $right = $left + 1;
        $sql = 'SELECT * FROM subunit WHERE level="' . $parent . '";';
        $query = $this->db->query($sql);
        $data = $query->result();

        foreach ($data as $datap) {
            $resultArr['name'] = $datap->name;
            $resultArr['level'] = $datap->level;
            $right = $this->rebuild_tree($resultArr['level'], $right);
        }

        $sql = 'UPDATE subunit SET lft=' . $left . ', rgt=' . $right . ' WHERE name="' . $parent . '";';
        $query = $this->db->query($sql);
        return $right + 1;
    }

有没有解决方案。谢谢。

1 个答案:

答案 0 :(得分:1)

调用函数本身时要小心。通常它最终可能永远地称自己为自己。你需要某种限制。

您可以检查大多数Codeigniters自己的库,并查看initialize()。这是如何处理调用自身的函数的一个很好的例子。基本上它会调用自己,直到没有数组为止,从而结束。

在你的情况下,如果2个mysql行是彼此的父母或任何类似的,你就打开了无限循环的大门。

解决方案

你的函数中的真正的问题是你传递了一个应该获得新值的参数,但是你通过$_GET覆盖了该值。这意味着第二个函数调用与第一个函数调用完全相同,第三个函数调用完全相同,第四个函数调用完全相同,依此类推。由于函数调用永远不会更改AND调用自身,因此会出现问题。

将以上部分更改为:

$parent = $this->input->get('level');
$left = ($left ?: $this->input->get('lft'));
$right = $this->input->get('rgt');