分享

ecshop源码分析

 quasiceo 2014-05-03

ecshop源码分析—用cookie缓存sql语句  

2010-08-16 10:50:27|  分类: ECShop |  标签:cookie  sql  ecshop   |举报 |字号 订阅

ecshop源码分析——用cookie缓存sql语句

  它为什么要将sql语句缓存在客户端的cookie,我暂时也没完全弄清楚。只是做了几个猜测。

  先来看它工作的2函数,设置cookie和读取cookie

  /**

 * 保存过滤条件

 * @param   array   $filter     过滤条件

 * @param   string  $sql        查询语句

 * @param   string  $param_str  参数字符串,由list函数的参数组成

 */

function set_filter($filter, $sql, $param_str = '')

{

    $filterfile = basename(PHP_SELF, '.php');

    if ($param_str)

    {

        $filterfile .= $param_str;

    }

/*设置cookie,将过滤条件$filtersql语句$sql经常处理之后放入cookie*/

    setcookie('ECSCP[lastfilterfile]', sprintf('%X', crc32($filterfile)), time() + 600);

    setcookie('ECSCP[lastfilter]',     urlencode(serialize($filter)), time() + 600);

    setcookie('ECSCP[lastfiltersql]',  urlencode($sql), time() + 600);

}

  读取cookie

/**

 * 取得上次的过滤条件

 * @param   string  $param_str  参数字符串,由list函数的参数组成

 * @return  如果有,返回array('filter' => $filter, 'sql' => $sql);否则返回false

 */

function get_filter($param_str = '')

{

    $filterfile = basename(PHP_SELF, '.php');

    if ($param_str)

    {

        $filterfile .= $param_str;

    }

/*如果设置了相应的cookie,返回cookie中的数据*/

    if (isset($_GET['uselastfilter']) && isset($_COOKIE['ECSCP']['lastfilterfile'])

        && $_COOKIE['ECSCP']['lastfilterfile'] == sprintf('%X', crc32($filterfile)))

    {

        return array(

            'filter' => unserialize(urldecode($_COOKIE['ECSCP']['lastfilter'])),

            'sql'    => urldecode($_COOKIE['ECSCP']['lastfiltersql'])

        );

    }

    else

    {

        return false;

    }

}

 然后我来看一个它实际使用的例子

ecshop/admin/article.php文件中的functio get_articlelist,获取文章列表函数。

/* 获得文章列表 */

function get_articleslist()

{

$result = get_filter();

If($result===false)//如果没有设置cookie

{

/*省略相关代码。根据文章过滤条件获取文章列表*/

/*

………………………………………..

*/

/*设置cookie,将$filter过滤条件,已经查询的sql语句$sql放进cookie*/

set_filter($filter, $sql);

/*

我们用var_dump()$filter$sql打印出来的结果是

array(9) {

  ["keyword"]=>

  string(0) ""

  ["cat_id"]=>

  int(0)

  ["sort_by"]=>

  string(12) "a.article_id"

  ["sort_order"]=>

  string(4) "DESC"

  ["record_count"]=>

  string(2) "35"

  ["page_size"]=>

  int(15)

  ["page"]=>

  int(1)

  ["page_count"]=>

  float(3)

  ["start"]=>

  int(0)

}

string(154) "SELECT a.* , ac.cat_name FROM `ecs`.`ecs_article` AS a LEFT JOIN `ecs`.`ecs_article_cat` AS ac ON ac.cat_id = a.cat_id WHERE 1  ORDER by a.article_id DESC"

所以它是将以上这些数据存进cookie里面的。

*/

else              //说明cookie已经存在获取文章列表的sql语句

{

  /*直接从cookie中获取相应的$Sql$filter*/

}

}

 

然后再看第二个例子ecshop/admin/goods_type.php文件中的get_goodstype函数,它用来获取商品类型的。该函数的大体结构跟上面那个获取文章列表的结构是类似的。

/**

 * 获得所有商品类型

 *

 * @access  public

 * @return  array

 */

sfunction get_goodstype()

{

$result = get_filter();

If($result===flase)

{

.................

}

Else

{

      …….

}

}

 

但是它的cookie机制是只保存一条sql语句,即如果打开文章列表页面,它会将获取文章的sql语句写入cookie中,然后我们接着打开获取商品类型列表的一面,现在那条cookie就会将获取商品类型的sql语句更新到刚才的cookie中,如果我们接着又打开了文章列表页面。它就又会将获取文章的sql语句更新入cookie中。

所以它这里的cookie只是缓存的最新的sql一条语句。

ecshopset_filter()函数和get_filter()函数被大量使用。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多