0

事前注文トラバーサル テーブルに動的データを挿入したいと考えています。このチュートリアルを参照して、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;
    }

これに対する解決策はありますか。ありがとうございました。

4

1 に答える 1

1

関数自体を呼び出すときは注意してください。多くの場合、それは永遠に自分自身を呼び出すことになるかもしれません。何らかの制限が必要です。

ほとんどの Codeigniters 独自のライブラリを確認でき、initialize(). これは、自分自身を呼び出す関数を処理する方法の良い例です。基本的に、配列がなくなるまで自分自身を呼び出し、終了します。

あなたの場合、2 つの mysql 行が互いの親または類似の行である場合、無限ループへの扉が開かれました。

解決

関数の本当の問題は、新しい値を取得するはずの引数を渡すことですが、$_GET. つまり、2 番目の関数呼び出しは最初の関数呼び出しとまったく同じであり、3 番目は同じ、4 番目は同じなどです。関数呼び出しは決して変更されず、それ自体を呼び出すため、問題が発生します。

上記の部分を次のように変更します。

$parent = $this->input->get('level');
$left = ($left ?: $this->input->get('lft'));
$right = $this->input->get('rgt');
于 2012-07-31T07:03:00.823 に答える