3.2.2 - 严重 - 未处理
文件:Think/Library/Think/Model.class.php方法:getField
问题:查询多字段缓存无效
分析:在查询记录后,原代码是将所查询的第一个字段作为key,当出现以下情况时,缓存会被覆盖
M("JBm")->cache("bm")->getField("id,bm");
M("JBm")->cache("bm")->getField("id,bm");
// 出现以上情况时,缓存的key都为id,以为缓存被覆盖具体代码:if(!isset($options['limit'])){
$options['limit'] = is_numeric($sepa)?$sepa:'';
}
$resultSet = $this->db->select($options);
if(!empty($resultSet)) {
$_field = explode(',', $field);
$field = array_keys($resultSet[0]);
$key = array_shift($field);
$key2 = array_shift($field);
$cols = array();
$count = count($_field);
foreach ($resultSet as $result){
$name = $result[$key];
if(2==$count) {
$cols[$name] = $result[$key2];
}else{
$cols[$name] = is_string($sepa)?implode($sepa,array_slice($result,1)):$result;
}
}
if(isset($cache)){
// 原代码
//S($key,$cols,$cache);
// 林博-2014.9.12-原代码中的key是字段列表中的第一个字段,如果出现以下情况就不能缓存
// M("JBm")->cache("bm")->getField("id,bm");
// M("JBm")->cache("bm")->getField("id,bm");
// 出现以上情况时,缓存的key都为id,所以缓存被覆盖
S($cache['key'],$cols,$cache);// 新
}
return $cols;
} 