一个迭代方法中查询数据库都是非常不可取滴,ecshop的商品分类页面category.php 下的分类
分类:博客热点

PHP程序员滴我们,在习于旧贯习性使用OOP滴时期,更加多滴时候思索程序模块化,作用愈简单愈好,全体装进供程序调用!想法是好滴,但不至于都可取。。。

PHP草根滴我们,平昔感觉数据库是才高意广,为了落到实处效果与利益却非常少去思索功用与数据库瓶颈难题。举个例子在一个巡回中查询数据库,贰个迭代方法中查询数据库都以老大不足取滴,尤其是前边二个程序!在访谈量非常小,并发少时看不出任何难点!一旦访问量突增,并发访谈量多时再三就成数据库服务器负荷过重,严重情状会宕机,后果真难以想象,而且在这里种情形下PHP程序猿往往很难查具体原因。

ecshop的商品归类页面category.php 下的分类,默许是得到富有同级父分类以至父类别的子分类。举例,小编点击步向是A商品分类的页面 category.php?id=1,事实上 笔者只须求取得父ID为1的子分类就能够,不过ecshop也把B商品分类、C商品分类.....下的全数子分类也输出来了。这是没须要的。在ecshop下的category.php 334行  $smarty->assign('categories',       get_categories_tree($cat_id卡塔尔卡塔尔; //    自个儿也是要起到这几个效应,不过徐然有参数$cat_id,但是当$cat_id为一级分类时候,该参数是不著见到效果的。为何吧?大家来看一下 get_categories_tree( 卡塔尔那些函数(该函数在目录includes/lib_goods.php下)。如下:

PHP草根滴大家,从来认为数据库是万能,为了实现效果与利益却很少去思索功效与数据库瓶颈难题。比方在一个巡回中查询数据库,叁个迭代方法中查询数据库都以特不足取滴,尤其是后面一个程序!在访问量比非常小,并发少时看不出任何难点!一旦访问量突增,并发采访量多时往往就成数据库服务器负荷过重,严重事态会宕机,后果真不堪设想,而且在这里种状态下PHP程序猿往往很难查具体原因。

先看三个迭代案例代码,当分类达标1000个以上滴时候,调用三次将要查询超1000次以上滴数据库查询,那样滴代码是多么恐怖,不用再细说了呢!

 

先看三个迭代案例代码,当分类达到规定的标准1000个以上滴时候,调用一遍将要查询超1000次以上滴数据库查询,那样滴代码是何其恐怖,不用再细说了吗!

 代码如下

/**

代码如下复制代码

/**
 * 递归获取分类
 * @author:xxx
 * @param $tree_id
 */
function get_child_tree($tree_id = 0)
{
    $three_arr = array();
         
    $sql = “SELECT count(*) FROM TABLE WHERE parent_id = “$tree_id” AND is_show = 1 ";
    if ($GLOBALS[db]->getOne($sql) || $tree_id == 0)
    {
        $child_sql = "SELECT ……";
        $res = $GLOBALS[db]->getAll($child_sql);
        foreach ($res AS $row)
        {
            if ($row[is_show])
            {
                $arr[id] = $row[cat_id];
                ……
            }
 
            if ( intval($row[cat_id]) != 0) {
            $three_arr[$row[cat_id]][cat_id] = get_child_tree($row[cat_id]);
            ……
            }
        }
    }
    return $three_arr;
}

 * 获得钦定分类同级的有所分类以致该分类下的子分类

/** * 递归获取分类 * @author:xxx * @param $tree_id */function get_child_tree($tree_id = 0) { $three_arr = array(); $sql = SELECT count(*) FROM TABLE WHERE parent_id = $tree_id AND is_show = 1 ; if ($GLOBALS[db]-getOne($sql) || $tree_id == 0) { $child_sql = SELECT ; $res = $GLOBALS[db]-getAll($child_sql); foreach ($res AS $row) { if ($row[is_show]) { $arr[id] = $row[cat_id]; } if ( intval($row[cat_id]) != 0) { $three_arr[$row[cat_id]][cat_id] = get_child_tree($row[cat_id]); } } } return $three_arr; }

再有部分例证,有些同学中意用while,for等循环中作数据库查询操作,相通是不足取滴,如故那句话,当数据库并发更新超小,或许访谈量非常小滴意况下,数据库服务器负荷也是非常重滴,操作时须小心。非常是在作为封装滴函数内部,因为未来滴程序你会相当大心滴多调用五回那些函数,那造成服务器滴耗费是无法估量滴。

 *

再有局地例子,有个别同学中意用while,for等循环中作数据库查询操作,相通是不可取滴,依旧那句话,当数据库并发更新相当小,或然访问量超级小滴情形下,数据库服务器负荷也是相当重滴,操作时须严慎。非常是在作为封装滴函数内部,因为以往滴程序你会相当的大心滴多调用两回那些函数,那产生服务器滴花费是不可能估计滴。

 * @access  public

 * @param   integer     $cat_id     分类编号

 * @return  array

 */

function get_categories_tree($cat_id = 0)

{

    if ($cat_id > 0)

    {

        $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";

        $parent_id = $GLOBALS['db']->getOne($sql);

    }

    else

    {

        $parent_id = 0;

    }

 

    /*

     判别当前比物连类中全部是是不是是底级分类,

     假若是抽取底级分类上级分类,

     就算不是取当前分类及其下的子分类

    */

    $sql = 'SELECT count(*) FROM ' . $GLOBALS['ecs']->table('category') . " WHERE parent_id = '$parent_id' AND is_show = 1 ";

    if ($GLOBALS['db']->getOne($sql) || $parent_id == 0)

    {

        /* 获取当前分类一下及其子分类 */

        $sql = 'SELECT cat_id,cat_name ,parent_id,is_show ' .

                'FROM ' . $GLOBALS['ecs']->table('category') .

                "WHERE parent_id = '$parent_id' AND is_show = 1 ORDER BY sort_order ASC, cat_id ASC";

 

        $res = $GLOBALS['db']->getAll($sql);

 

        foreach ($res AS $row)

        {

            if ($row['is_show'])

            {

                $cat_arr[$row['cat_id']]['id']   = $row['cat_id'];

                $cat_arr[$row['cat_id']]['name'] = $row['cat_name'];

                $cat_arr[$row['cat_id']]['url']  = build_uri('category', array('cid' => $row['cat_id']), $row['cat_name']);

 

                if (isset($row['cat_id']) != NULL)

                {

                    $cat_arr[$row['cat_id']]['cat_id'] = get_child_tree($row['cat_id']);

                }

            }

        }

    }

    if(isset($cat_arr))

    {

        return $cat_arr;

    }

}

 

 

主题材料就在此一句 

 

   if ($cat_id > 0)

    {

        $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";

        $parent_id = $GLOBALS['db']->getOne($sql);

    }

    else

    {

        $parent_id = 0;

    }

 

这一句是判断参数$cat_id是或不是有父类,要是有父类,就收取其父类的ID,否则视为参数为父种类ID为0,也即为一级分类。事实上,当参数$cat_id大于0,何况为五星级分类的时候,那句话是行不通的,大家只要$cat_id=1,且ID1为顶级ID,也即其parent_id 为0,这种状态下

      $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";

        $parent_id = $GLOBALS['db']->getOne($sql);

 

运行得出的值还是0,也即$parent_id =0.固然有参数,但如故收取全数一级ID下的持有分类。实际上只供给那样修正即可,把

   if ($cat_id > 0)

    {

        $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";

        $parent_id = $GLOBALS['db']->getOne($sql);

    }

    else

    {

        $parent_id = 0;

    }

 

修改为

 

   if ($cat_id > 0)

    {

        $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";

        $parent_id = $GLOBALS['db']->getOne($sql);

       if($parent_id==0)$parent_id=$cat_id;//增多上那句是根本。

    }

    else

    {

        $parent_id = 0;

    }

 

这时候 参数$cat_id是有效的!

 

转载自:

本文由威尼斯在线注册平台发布于博客热点,转载请注明出处:一个迭代方法中查询数据库都是非常不可取滴,ecshop的商品分类页面category.php 下的分类

上一篇:出口字符串,重临序数值的字符 下一篇:没有了
猜你喜欢
热门排行
精彩图文