我想将动态数据插入到我的前序遍历表中。我通过参考本教程使用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;
}
有没有解决方案。谢谢。
答案 0 :(得分:1)
调用函数本身时要小心。通常它最终可能永远地称自己为自己。你需要某种限制。
您可以检查大多数Codeigniters自己的库,并查看initialize()
。这是如何处理调用自身的函数的一个很好的例子。基本上它会调用自己,直到没有数组为止,从而结束。
在你的情况下,如果2个mysql行是彼此的父母或任何类似的,你就打开了无限循环的大门。
你的函数中的真正的问题是你传递了一个应该获得新值的参数,但是你通过$_GET
覆盖了该值。这意味着第二个函数调用与第一个函数调用完全相同,第三个函数调用完全相同,第四个函数调用完全相同,依此类推。由于函数调用永远不会更改AND调用自身,因此会出现问题。
将以上部分更改为:
$parent = $this->input->get('level');
$left = ($left ?: $this->input->get('lft'));
$right = $this->input->get('rgt');