foreach循环中的codeigniter查询将返回一个sigle数组

时间:2016-01-08 19:26:11

标签: php mysql codeigniter

我正在尝试访问类别下的所有子类别但不能为我工作。写了这样的代码,

function getAllSubCategory($CatId)
    {
        $data=array();
        $this->db->select('c.catId,c.cat_name,c.cat_alias,c.cat_image,c.parentcatid,c.isHeading');
        $this->db->from('coupon_category as c');
        $this->db->where('c.parentcatid', $CatId);
        $query = $this->db->get();
        if($query->num_rows()>0)
        {
            $data = $dataFetched = $query->result_array();
            $query->free_result();  
            foreach ($dataFetched as $row) {
                $this->db->select('c.catId,c.cat_name,c.cat_alias,c.cat_image,c.parentcatid,c.isHeading');
                $this->db->from('coupon_category as c');
                $this->db->where('c.parentcatid', $dataFetched->catId);
                $data = $query->result_array();
                $query->free_result();  
            }
        }
        echo count($data);
        return $data;

    }

但是没有工作,不知道我错在哪里。

2 个答案:

答案 0 :(得分:0)

问题出在这里

ActiveDocument.Bookmarks("TetraPak100").Range.Paragraphs(1).CollapsedState = False

应该是

SELECT value1, value, 
    (CASE WHEN GETDATE() BETWEEN '20150801' AND '20160731' THEN 2015
          WHEN GETDATE() BETWEEN '20160801' AND '20170731' THEN 2016
          ELSE 2014) AS schoolYear
FROM dbTable
WHERE ...

答案 1 :(得分:0)

代码有以下问题:

  • 内部循环将新结果集分配给变量 $ data ,从而分配给您 丢失您在 $ data ;
  • 中的先前值
  • 在该循环的每次迭代中,您再次重复完全相同的查询。你不 在循环中使用 $ row 变量;
  • 不支持更深层次的嵌套子类别,数据结构似乎如此 允许。

如果您想获取子类别及其子类别,等等,您 应该使用递归,即使你的表中只有两个级别的子类别,它也会 仍然是很好的代码。

以下是一些使其按照您的方向工作的代码, 使用递归,并使用函数array_merge随时附加数据。

function getAllSubCategory($CatId)
{
    $this->db->select('c.catId,c.cat_name,c.cat_alias,c.cat_image,c.parentcatid,c.isHeading');
    $this->db->from('coupon_category as c');
    $this->db->where('c.parentcatid', $CatId);
    $query = $this->db->get();
    $dataFetched = $query->result_array();
    $query->free_result();
    $data = array();
    foreach ($dataFetched as $row) {
        $data[] = $row;
        $data = array_merge($data, getAllSubCategory($row["catId"]));
    }
    echo count($data);
    return $data;
}

替代

通过执行操作可以获得更好的性能 对数据库的分层查询(例如被要求 here), 但我不知道是否可以使用Active Record。所以我会提供 根据我自己给出的答案,使用简单query()语法的代码 对于那个特定的问题:

function getAllSubCategory($CatId)
{
    $CatId = $this->db->escape($CatId); // sanitise to prevent SQL injection
    $query = $this->db->query(
        "select c.catId,c.cat_name,c.cat_alias,c.cat_image,c.parentcatid,c.isHeading
         from   (select * from coupon_category
                 order by parentcatid, catId) as c,
                (select @pv := '$CatId') as initialisation
         where  find_in_set(c.parentcatid, @pv) > 0
         and    @pv := concat(@pv, ',', catId)");
    $data = $query->result_array();
    $query->free_result();
    echo count($data);
    return $data;
}

请注意,最后一个解决方案需要这样做 对于每条记录 parentcatid< catid ,否则结果将不完整。

但如果是这种情况,这肯定会超过性能的第一个解决方案,因为它只执行一个数据库查询。

此外,如果您的表具有循环,其中节点的子节点也是其父节点(例如),则第一个解决方案将保持循环和查询,直到发生一些内存不足错误。最后一个解决方案不会,因为它只查找 parentcatid< CATID