调用next_record,没有挂起的查询


next_record called with no query pending

我想调用一个PHP函数:

$rights =  $user->recupererDroitCreateur($_SESSION[CODE_USER]);

换热器DroitCreateur的代码是:

function recupererDroitCreateur($user_id) {
    $ret = array();
    $sSQL = "SELECT cm.class_menu_code
                 FROM menu m
                 LEFT JOIN classe_menu cm
                 ON m.class_menu_code = cm.class_menu_code
                 WHERE m.menu_deleted = 0 AND m.menu_visible = 1 AND cm.class_menu_parent IS NULL AND cm.class_menu_deleted = 0 
                 ORDER BY cm.class_menu_lib, m.menu_titre";
    $this->db->query($sSQL);
    while ( $this->db->next_record() ) {
        $code = $this->db->f('class_menu_code');
        $strMenus = $code.";";
        $this->recupererMenus($code, $code, $user_id, $strMenus);
    }
    return (explode(";", $strMenus));
}

换热器菜单的代码是:

function recupererMenus($classRoot, $classParentDirect, $user_id, &$menus)
{
    $sSQL1 = "SELECT class_menu_code FROM classe_menu WHERE class_menu_parent = '$classParentDirect' AND class_menu_deleted = 0";
    $this->db->query($sSQL1);
    while ( $this->db->next_record() ) {
        $this->recupererMenus($classRoot, $this->db->f('class_menu_code'), $user_id, $menus);
    }
    $sSQL = "SELECT m.menu_code
             FROM menu m
             LEFT JOIN classe_menu cm
             ON m.class_menu_code = cm.class_menu_code
             WHERE m.menu_deleted = 0 AND m.menu_visible = 1 AND cm.class_menu_parent = '$classParentDirect' AND cm.class_menu_deleted = 0 
             ORDER BY cm.class_menu_lib, m.menu_titre";
    $this->db->query($sSQL);
    while ( $this->db->next_record() ) 
    {
        $menus .= $this->db->f('menu_code').";";
    }
}

在运行时有错误next_record called with no query pending:错误输出告诉导致错误的行,它说对应于该语句的行: while ( $this->db->next_record() ) {,还有一行指向语句$this->recupererMenus($code, $code, $user_id, $strMenus);

那么我的代码出了什么问题?

recupererMenus中,您递归调用recupererMenus 。由于没有传递给next_record的查询标识符,使用多个query会造成很大的混乱。当你从递归调用返回时,你将尝试获取下一条记录,next_record为前一个query,但你的数据库框架不知道这一点。

我不知道您使用的框架,但是您要么必须传递标识符(如果可能的话),要么首先获取所有结果,然后进行递归调用。