基于Thinkphp5.0框架,以访问日志库为例,进行某段时间内访问日志的查询:
<?php
class systemlog{
public function getLogListByCrossTable($params = array(), $order = '', $field = '', $page = 1, $limit = 10){
// 初始化相关变量
$time_begin = $params['access_time_begin']; //查询开始时间
$time_end = $params['access_time_end']; //查询结束时间
$startY = date('Y',strtotime($time_begin)); //开始时间所在年份
$startm = date('m',strtotime($time_begin)); //开始时间的开始月份
$endY = date('Y',strtotime($time_end)); //结束时间所在年份
$endm = date('m',strtotime($time_end)); //结束时间的开始月份
$ym_arr = [];//获取跨年月数组
if($startY==$endY){ //不跨年夸
for($i=$startm;$i<=$endm;$i++){
$ym_arr[] = $startY.str_pad($i,2,'0',STR_PAD_LEFT);
}
}else{ //跨年跨月
$dostartY = $startY;
do{
if($startY==$dostartY){
for($i=$startm;$i<=12;$i++){
$ym_arr[] = $startY.str_pad($i,2,'0',STR_PAD_LEFT);
}
}elseif($startY < $endY){
for($i=0;$i<=12;$i++){
$ym_arr[] = $startY.str_pad($i,2,'0',STR_PAD_LEFT);
}
}else{
for($i=1;$i<=$endm;$i++){
$ym_arr[] = $startY.str_pad($i,2,'0',STR_PAD_LEFT);
}
}
$startY++;
}while($startY<=$endY);
}
$map = [
"access_time" => ['between',[$params['access_time_begin'],$params['access_time_end']]]
];
foreach($ym_arr as $val){
$union_select_arr[] = "SELECT * FROM ".'system_log.'.$this->base_tablename.'_'.$val." WHERE `access_time` BETWEEN '".$time_begin."' AND '".$time_end."'";
}
$list = Db::table('system_log.'.$this->base_tablename)->union($union_select_arr,true)->where($map)->select();
$result['count'] = count($list);
$result['data'] = $list;
return $result;
}
}
str_pad() 函数 :把字符串填充为新的长度。str_pad(string,length,pad_string,pad_type),
pad_type可选值:
- STR_PAD_LEFT - 填充字符串的左侧。
- STR_PAD_RIGHT - 填充字符串的右侧。这是默认的。
- STR_PAD_BOTH - 填充字符串的两侧。如果不是偶数,则右侧获得额外的填充。