它为什么要将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,将过滤条件$filter和sql语句$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一条语句。
在ecshop中set_filter()函数和get_filter()函数被大量使用。
联系客服