❱ 链接数据库
如果没有数据库信息,则从 config 文件中读取。
// 开始数据库连接function connect
($dbinfo=
null) { global
$systemconfig,
$connect;
if(!
$dbinfo
){ $systemconfig =
auto_file('./data/config'
); //
php 自动读取本地文件、自动字符串转数组、自动加密解密 $dbinfo =
$systemconfig['mysql'];
// header("Content-type: text/html; charset=utf-8"); // echo '数据库连接错误<br/>没有数据库信息'; // exit; // return false; } if(!
$dbinfo
){ header
("Content-type: text/html; charset=utf-8"
);
echo '数据库连接错误<br/>没有数据库信息';
exit;
return false;
} if($dbinfo
){ if($dbinfo['database']
){ // 如果有数据表。。。就进入指定数据表 $connect = new mysqli
( $dbinfo['dbhost'].
($dbinfo['dbport'] ?
$dbinfo['dbport']:''
),
$dbinfo['dbuser'],
$dbinfo['dbpsw'],
$dbinfo['database']
);
}else{ $connect = new mysqli
( $dbinfo['dbhost'].
($dbinfo['dbport'] ?
$dbinfo['dbport']:''
),
$dbinfo['dbuser'],
$dbinfo['dbpsw']
);
} if($connect->connect_errno
){ header
("Content-type: text/html; charset=utf-8"
);
echo '数据库连接错误,检查MySQL状态<br/>'.data_encoding
($connect->connect_error,'utf-8'
).'<br/><br/><a href="./?rebuild=">重新填写数据库信息</a>';
exit;
} if(!
$dbinfo['dbcode']
){ // 如果没有设置编码,则自动读取数据库本身编码 $dbinfo['dbcode'] = get_db_char
();
} mysqli_set_charset
($connect,
$dbinfo['dbcode']
);
// 设置客户端编码 数据库连接 // echo '数据库链接成功'; return true;
}}function disconnect
() { global
$connect;
$connect->close
();
}// 读取数据库的 编码 function get_db_char
(){ $sql = "show variables like '%char%';";
$sql_result = run_sql
($sql
);
if ($sql_result &&
$sql_result->num_rows>0
) { while($row =
$sql_result->fetch_assoc
()){ if($row['Variable_name']=='character_set_database'
){ $r =
$row['Value'];
return $r;
break;
} } }}// 数据库语句执行function run_sql
($sql
) { // 2021-12-02 global
$connect;
$sql_result =
$connect->query
($sql
);
if($connect->errno
){ header
("Content-type: text/html; charset=utf-8"
);
echo '数据库语句执行错误'.data_encoding
($connect->error,'utf-8'
);
// 不显示错误 echo '<br/>'.
$sql;
exit;
} if(stristr
($sql,'insert into'
)){ // 如果是插入的动作,返回 新增 id。 return $connect->insert_id;
}else{ // mysqli_free_result($sql_result); // 释放结果集 return $sql_result;
// 返回查询结果之类的。 }} ❱ 建立数据表格
建立表格时可使用中文fulltext索引(标记为
cnindex),也可以使用中文转base64的fulltext索引(标记为
enindex)。
使用中文fulltext索引,会受限于数据库本身的最大/小词长、忽略词,但可以方便使用 in natural language mode。
而中文转base64码的索引方式,准确来说每一个词都被拆成单个汉字转base64码,所以可以搜索到单个中文字。
// $dbcode 留空则默认 utf8 ,可选 utf8mb4
// $dbindex : enindex ,将中文转 base64 保存;enindex_more :使用 PARSER NGRAM 分词; cnindex 新版 fulltext; 其他,什么都没有的。
function make_db($dbname,$dbcode='utf8',$dbindex='enindex',$dbparser=''){
// 删除已有 若有
$sql = "DROP DATABASE if EXISTS $dbname ";
run_sql($sql);
if(!$dbcode){ $dbcode = 'utf8';}
// 建立数据库
if($dbcode == 'utf8mb4'){
$sql = "CREATE DATABASE $dbname DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
}else{
$sql = "CREATE DATABASE $dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
}
run_sql($sql);
// 使用新表格
$sql = "use $dbname ";
run_sql($sql);
// `itemno` VARCHAR(20) UNIQUE COMMENT '不重复的货号,测试测试测试',
if($dbindex=='cnindex'){ // mysql5.7 支持中文 fulltext,不需要单独设立一个 fulltext的索引栏
$sql = "CREATE TABLE `post` (
`id` bigint(20) NOT null PRIMARY KEY AUTO_INCREMENT COMMENT '默认id',
`title` VARCHAR(100) COMMENT '标题',
`summary` TEXT COMMENT '简介',
`content` MEDIUMTEXT COMMENT '正文',
`create_date` date COMMENT '时间',
INDEX create_date(`create_date`),
`enable` VARCHAR(1),
INDEX enable(`enable`),
`index_cat` TEXT COMMENT 'cat的主键',
FULLTEXT index_cat(`index_cat`) WITH PARSER NGRAM COMMENT '建立索引',
FULLTEXT title(`title`) WITH PARSER NGRAM COMMENT '建立索引',
FULLTEXT summary(`summary`) WITH PARSER NGRAM COMMENT '建立索引'
) ENGINE=INNODB AUTO_INCREMENT=1 CHARACTER SET $dbcode ;";
run_sql($sql);
}elseif($dbindex=='enindex'){ // 中文转base64 ,可选 WITH PARSER NGRAM
$sql = "CREATE TABLE `post` (
`id` bigint(20) NOT null PRIMARY KEY AUTO_INCREMENT COMMENT '默认id',
`title` VARCHAR(100) COMMENT '标题',
`summary` TEXT COMMENT '简介',
`content` MEDIUMTEXT COMMENT '正文',
`create_date` date COMMENT '时间',
INDEX create_date(`create_date`),
`enable` VARCHAR(1),
INDEX enable(`enable`),
`index_cat` TEXT COMMENT 'cat的主键',
FULLTEXT index_cat(`index_cat`) ".($dbparser?'WITH PARSER NGRAM':'')." COMMENT '建立索引',
`index_primary` MEDIUMTEXT COMMENT '主索引base64',
FULLTEXT index_primary(`index_primary`) ".($dbparser?'WITH PARSER NGRAM':'')." COMMENT '建立索引',
`index_secondary` MEDIUMTEXT COMMENT '次索引base64',
FULLTEXT index_secondary(`index_secondary`) ".($dbparser?'WITH PARSER NGRAM':'')." COMMENT '建立索引'
) ENGINE=INNODB AUTO_INCREMENT=1 CHARACTER SET $dbcode ;";
run_sql($sql);
}
// $sql = "CREATE TABLE `cat` ( //-----------------------------取消
// `id` VARCHAR(8) NOT null PRIMARY KEY COMMENT '默认base64 id',
// `title` VARCHAR(100)
// ) ENGINE=INNODB AUTO_INCREMENT=1 CHARACTER SET $dbcode ;";
// run_sql($sql);
}
❱ 根据id读取、写入、删除数据,支持多行数据
// 读取一行,多行 数据表
// 有id就一行或多行,没有id就整个表格
// 可以手动输入 $cols= * / 'id,item,title';
// 例如 $id='1,2,3,4,5' , 留空表示全部行。
function get_mysql_by_id($table,$id='',$cols='*') {
if(!$table){ return false;}
if($id){
if(strstr($id,',')){
$sql = "SELECT $cols FROM $table WHERE id IN ($id) ;"; // 多个 id
}else{
$sql = "SELECT $cols FROM $table WHERE id = '$id' LIMIT 1 ;"; // 1个 id
}
}else{
$sql = "SELECT $cols FROM $table WHERE 1;"; // 全部行
}
$sql_result = run_sql($sql);
if ($sql_result && $sql_result->num_rows>0 ) {
while($row = $sql_result->fetch_assoc()){
$row = auto_mysql_filter($row,'get'); // 自动将一整行数据 整理成数组。
if($row['id']){
$return_result[$row['id']] = $row ;
}else{
$return_result[] = $row ;
}
}
}
// mysqli_free_result($sql_result); // 释放结果集
return $return_result; // 多个id
}
// 编辑一行 多行// 写入一行 多行。多个栏 cols
// $content= array( [$id] => array( 'title'=>$title, 'summary'=>$summary ) )
// 第一行数据的key作为数据写入标准。
function set_mysql_by_id($table,$content,$new=false){
if(!$table){ return false;}
if(!$new){ // 编辑 已有id
$ids = array_keys($content);
foreach($idsas $id){
$sql_id_in[$id]= $id;
foreach($content[$id]as $col=>$v){
$v = auto_mysql_filter($v,'set');
$sql_cols[$col] .= "WHEN '$id' THEN '$v' ";
}
}
$sql_id_in = implode(',',$sql_id_in); // id 逗号
foreach ($sql_colsas $col => $sql_col) {
$sql_total .= "`$col` = ( CASE `id` ".$sql_col." END ),";
}
$sql_total = rtrim($sql_total,',');
$sql = "UPDATE `$table` SET $sql_total WHERE `id` IN ( $sql_id_in ) ";
// echo $sql;return '';
run_sql($sql);
return $ids; // 返回 id 数组
}else{ // 新建
$cols = array_keys(current($content));
$sql_cols = '`'.implode('`,`',$cols).'`';
foreach($contentas $v){
$sql_value .= "(";
foreach($vas $vv){
$sql_value .= "'".auto_mysql_filter($vv,'set')."',";
}
$sql_value = rtrim($sql_value,',')."),";
}
$sql_value = trim($sql_value,',');
$sql = "INSERT INTO `$table` ( $sql_cols )
VALUES $sql_value ";
// echo $sql;return '';
$id = run_sql($sql); // 返回新增后的第一个 id
for($i=$id;$i<$id+count($content);$i++){
$ids[] = $i;
}
return $ids; // 返回 id 数组
}
}
// 例如 $id='1,2,3,4,5' , 留空不删除。
function del_mysql_by_id($table,$id='') {
if(!$table || !$id){ return false;}
$sql = "DELETE FROM $table WHERE id IN (".$id.") ;"; // 全部行
$sql_result = run_sql($sql);
return true;
}
❱ 插入、读取时对数据预处理
// 自动处理数组,不需要加密
// 数据库,所以需要处理 英文字符实体化 和 addslashes() 函数
// 将数组里的引号实体化 -> 数组转字符串 -> 删除多余空白 -> addslashes()
function auto_mysql_filter($data,$action='get'){ // $action = get/set
if($action=='get'){ // 读取
if(is_string($data)){
if(started_with($data,'A::::')){
$data = end(explode('::::',$data,2));
@eval( "\$data={$data};" ); // 恢复成数组
}
}elseif(is_array($data)){
$ks = array_keys($data);
foreach($ksas $k){
$data[$k] = auto_mysql_filter($data[$k],$action);
}
}
return $data;
}elseif($action=='set'){ // 写入
// 如果服务器是自动运行 addslashes()(magic_quotes_gpc 为 on),则需要逆转一下? 留着在 POST时 检查吧,或者写在 sysconfig里一次性。
// if(get_magic_quotes_gpc()){ stripslashes();}
$data = auto_char($data,$backward=0); // 整理符号,实体化: < > ' "
if(is_array($data)){
$data = var_export($data,true);
$data = del_extra_strings_form_VarExport($data); // 去掉多余的空行空格
$data = 'A::::'.$data;
}
$data = addslashes($data); // 单引号(')双引号(")反斜杠(\)null
return $data;
}
}
// 2022-12-08
// 整理符号: 遍历数组 将所有重要的特殊英文引号,HTML实体。
// 仅限使用在正文内容,而不是数组转字符之后的内容。
// 支持数组
function auto_char($data,$backward=0){
if(is_string($data)){
if($backward){ // 恢复实体化:只是普通内容的话,一般不需要,除非要恢复执行网页代码。
$data = htmlspecialchars_decode($data,ENT_QUOTES);
}else{
// 永久性替换,不复原:中文符号转英文, 去掉 \r
$data = str_replace(
array('+','-','-','-','#',"\r\n","\r") ,
array('+','-','-','-','#',"\n","\n") ,
$data);
// 实体化
$data = htmlspecialchars($data,ENT_QUOTES,'UTF-8',false);
// ENT_QUOTES:包含单双引号。false:不重复操作已经实体化的字符。 //字符: < > " '
}
}elseif(is_array($data)){
$ks = array_keys($data);
foreach($ksas $k){
$data[$k] = auto_char($data[$k],$backward);
}
}
return $data;
}
❱ 将内容过滤分成中文、英文+数字
可以过滤掉恶意代码,用于储存中文base64码索引
// 将字符串 中文和英文单独分开,所有中文变成单字数组(base64 可选),英文、数字变数组
// 变成字符串时,默认空格分隔开
// $purpose 目的 :save 空格隔开字符串; search 英文字符尾部添加* 其余用空格隔开; array 输出数组 ;
function make_keywords($string,$encode64=false,$purpose=''){
// 先英文
$en = preg_replace("/[^a-zA-Z0-9_\ \-.]+/",' ', $string).' '.preg_replace("/[^0-9_\ \-.]+/",' ', $string);
// 挑选出英文单词、空格 数字 和一些标点符号,用空格隔开
// 不能有 @ 邮箱会分成名字和域名2部分索引。
// 结合单独挑出数字
if($en){
$en = explode(' ',$en); // 变成数组
$en = array_flip($en);$en = array_flip($en); // 键值互换2次来去重复,速度更快
foreach($enas $k=>$v){
$v = trim($v,' -.'); // 删除前后的标点
if($v){
$en[$k] = $v;
}else{
unset($en[$k]);
}
}
}
// 后中文
if($purpose=='cnindex'){
$cn = preg_replace('/[^ \p{Han}]/u', '', $string); // 挑选出中文,包含空格
}else{
$cn = preg_replace('/[^\p{Han}]/u', '', $string); // 挑选出中文
}
if($cn){
if($purpose=='cnindex'){
$cn = explode(' ',$cn); // 用空格来转数组
}else{
$cn = mb_str_split($cn,1); // 每个中文字变一个数组值
}
$cn = array_flip($cn);$cn = array_flip($cn); // 键值互换2次来去重复,速度更快
foreach($cnas $k=>$v){
// base64编码中有一些符号,会导致 select 查询不到,所以把符号换掉
if($encode64){$cn[$k] = str_replace(array('+','-','/','='),'AAA',base64_encode($v));}
}
}
if($purpose=='array'){ // 返回数组
$return_result = array('en'=>$en,'cn'=>$cn);
}elseif($purpose=='ensave'){
$return_result = trim(($en?implode(' ',$en).' ':'').($cn?implode(' ',$cn):'')); // 返回字符串
}elseif($purpose=='cnindex' || $purpose=='enindex'){
$return_result = trim(($en?''.implode('* ',$en).'* ':'').($cn?implode(' ',$cn):'')); // 返回字符串,英文后面*
}
return $return_result;
}
// PHP 7.4系统自带了这个函数 //2022-12-11
if(PHP_VERSION<'7.4'){
// make_keywords
// 中文无法使用 str_split(),所以需要自己做一个,把中文一个个字变成数组的一部分
//来自 https://www.runoob.com/php/func-string-str-split.html 不用修改 //2022-12-10
function mb_str_split($str,$split_length=1,$charset="UTF-8"){
if(func_num_args()==1){
return preg_split('/(?<!^)(?!$)/u', $str);
}
if($split_length<1){return false;}
$len = mb_strlen($str, $charset);
$arr = array();
for($i=0;$i<$len;$i+=$split_length){
$s = mb_substr($str, $i, $split_length, $charset);
$arr[] = $s;
}
return $arr;
}
}
❱ 搜索数据库数据
// post 的结构是有变化的,比较特殊,所以要单独建立 function
// 比较特殊
function set_posts($content,$new){
global $systemconfig; // 索引类型
if($systemconfig['mysql']['dbindex']=='cnindex'){
// 不需要额外操作
}elseif($systemconfig['mysql']['dbindex']=='enindex'){
foreach($contentas $id => $v){
$catids = explode(' ',$v['index_cat']);
$catname = null;
foreach($catidsas $c){
$catname .= $systemconfig['cats'][$c].' ';
}
$content[$id]['index_primary'] = make_keywords($catname.' '.$v['title'],1,'ensave'); // 重要的关键词
$content[$id]['index_secondary'] = make_keywords($v['summary'],1,'ensave'); // 其次的关键词
}
}else{
// 不需要额外操作
}
$ids = set_mysql_by_id($table='post',$content,$new);
return $ids; // 返回 id 数组
}
// IN BOOLEAN MODE || IN NATURAL LANGUAGE MODE
// 从数据库中抓取 数据,分类,搜多,日期限制,排序,分页
// $catidArray:数组 也可以字符串(单个cat)
// $searchWord = 搜索关键词
// $orderBy = ‘’ 或 create_date
function select_posts($catidArray=null,$searchWord=null, $dateMoreThan=null, $dateLessThan=null, $orderBy='', $numPerPage='20', $pageNum=1, $enable_method="enable='1'", $cols="*"){
global $systemconfig; // 索引类型
if($catidArray){ // 支持数组,也支持单个 string
if(is_array($catidArray)){ // 数组
foreach($catidArrayas $k => $v){
if(!$systemconfig['cats'][$v]){unset($catidArray[$k]);} // 验证 cat ID 的正确性,防止数据库错误
}
$catidArray = '+'.implode(' +',$catidArray); // 组合成必有关键词
}else{
if($systemconfig['cats'][$catidArray]){ // 验证 cat ID 的正确性,防止数据库错误
$catidArray = '+'.$catidArray ;
}
}
}
// 获得基础 sql 代码
if($systemconfig['mysql']['dbindex']=='cnindex'){
if($searchWord){$searchWord = make_keywords($searchWord,0,'cnindex');}// 关键词预处理
$sql_main .= "FROM post ";
$sql_main .= "WHERE $enable_method ";
if($catidArray){ // 分类 // id IN()模式
$sql_main .= " AND MATCH (index_cat) AGAINST ('$catidArray' IN BOOLEAN MODE) "; // 必须有的内容
}
if( $searchWord ){
$sql_main .= "AND ( MATCH (title) AGAINST ('$searchWord' IN BOOLEAN MODE) OR MATCH (summary) AGAINST ('$searchWord' IN BOOLEAN MODE) OR MATCH (title) AGAINST ('$searchWord' IN NATURAL LANGUAGE MODE) OR MATCH (summary) AGAINST ('$searchWord' IN NATURAL LANGUAGE MODE) )";
}
}elseif($systemconfig['mysql']['dbindex']=='enindex'){ // mysql5.6 英文 fulltext ,英文_数字+中文转base64 单独存一个格用于 fulltext索引,键值等其他非中文的用普通索引
if($searchWord){$searchWord = make_keywords($searchWord,1,'enindex');}// 关键词预处理
$sql_main .= "FROM post "; // 使用名为
$sql_main .= "WHERE $enable_method ";
if($catidArray){ // 分类 // id IN()模式
$sql_main .= " AND MATCH (index_cat) AGAINST ('$catidArray' IN BOOLEAN MODE) "; // 必须有的内容
}
if( $searchWord ){
$sql_main .= "AND ( MATCH (index_primary) AGAINST ('$searchWord' IN BOOLEAN MODE) OR MATCH (index_secondary) AGAINST ('$searchWord' IN BOOLEAN MODE) OR MATCH (index_primary) AGAINST ('".str_replace('*', '', $searchWord)."' IN NATURAL LANGUAGE MODE) OR MATCH (index_secondary) AGAINST ('".str_replace('*', '', $searchWord)."' IN NATURAL LANGUAGE MODE) )"; // natural 和 boolean 2种都是用 上
}
}else{
$sql_main .= "FROM post ";
// if($catidArray){ //分类 //inner join 模式,好像慢一点
// $sql_main .= " INNER JOIN ( SELECT DISTINCT postid FROM link WHERE catid IN ($catidArray) )as getids ON post.id = getids.postid "; // DISTINCT 去掉重复
// }
$sql_main .= "WHERE $enable_method ";
if($catidArray){ // 分类 // id IN()模式
$sql_main .= " AND id IN ( SELECT DISTINCT postid FROM link WHERE catid IN ($catidArray) ) "; // DISTINCT 去掉重复
}
if($searchWord){
$sql_main .= "AND ( ";
$searchWord = make_keywords($searchWord,0,'array'); // 关键词预处理 // 数组关键词
foreach($searchWordas $k=>$kv){
$sql_main .= ($k>0?"OR ":"")."( title LIKE '%$kv%' OR summary LIKE '%$kv%' ) ";
$sql_score .= ($k>0?"+ ":"")."( CASE WHEN title LIKE '%$kv%' THEN 10 else 0 END )
+ ( CASE WHEN summary LIKE '%$kv%' THEN 5 else 0 END ) ";
}
$sql_main .= ") ";
}
}
if($dateMoreThan && $dateLessThan){
$sql_main .= "AND (create_date >= '$dateMoreThan' AND create_date <= '$dateLessThan') ";
}elseif($dateMoreThan && !$dateLessThan){
$sql_main .= "AND create_date >= '$dateMoreThan' ";
}elseif(!$dateMoreThan && $dateLessThan){
$sql_main .= "AND create_date <= '$dateLessThan' ";
}
// 获得总数。 以及 LIMIT OFFSET 等数据
$sql = "SELECT DISTINCT COUNT(*)as totalNum $sql_main ";
// echo $sql.'<br/><br/>';
$sql_result = run_sql($sql);
if ($sql_result && $sql_result->num_rows>0 ) {
while($row = $sql_result->fetch_assoc()){
$totalNum = $row['totalNum']; // 获得总数。
break;
}
}
if(!$totalNum){return null;} // 如果总数0,返回。
if($pageNum<1){$pageNum = 1;}
$offsetNum = ($pageNum-1)*$numPerPage;
if($offsetNum>=$totalNum){ // 偏移数量超出总数,返回。
return null;
}
if($offsetNum+$numPerPage>$totalNum){ // 数量超出总数
$numLimit = $totalNum-$offsetNum; // 修改 LIMIT 数量。
}else{
$numLimit = $numPerPage;
}
// 开始抓取具体行。的代码
if(!$orderBy){
if($searchWord){
$orderBy = 'score';
}else{
$orderBy = 'id';
}
}
if($systemconfig['mysql']['dbindex']=='cnindex'){
// 开始抓取 //搜索情况下,并且没有指定排序,就按分数 //其他情况 按cerate_date
$sql = "SELECT $cols
".($searchWord?", ( MATCH (title) AGAINST ('$searchWord' IN BOOLEAN MODE)*10 + MATCH (summary) AGAINST ('$searchWord' IN BOOLEAN MODE)*4 + MATCH (summary) AGAINST ('$searchWord' IN NATURAL LANGUAGE MODE) )as score ":"")."
$sql_main
ORDER BY $orderBy DESC , create_date DESC , id DESC
LIMIT $offsetNum , $numLimit ";
}elseif($systemconfig['mysql']['dbindex']=='enindex'){
// 开始抓取 //搜索情况下,并且没有指定排序,就按分数 //其他情况 按cerate_date
$sql = "SELECT $cols
".($searchWord?", ( MATCH (index_primary) AGAINST ('$searchWord' IN BOOLEAN MODE)*10 + MATCH (index_secondary) AGAINST ('$searchWord' IN BOOLEAN MODE) + MATCH (index_primary) AGAINST ('".str_replace('*', '', $searchWord)."' IN NATURAL LANGUAGE MODE) + MATCH (index_secondary) AGAINST ('".str_replace('*', '', $searchWord)."' IN NATURAL LANGUAGE MODE) )as score ":"")."
$sql_main
ORDER BY $orderBy DESC , create_date DESC , id DESC
LIMIT $offsetNum , $numLimit ";
}else{
// 开始抓取 //搜索情况下,并且没有指定排序,就按分数 //其他情况 按cerate_date
$sql = "SELECT $cols
".($searchWord && $orderBy=='score'?",($sql_score)as score ":"")."
$sql_main
ORDER BY $orderBy DESC , create_date DESC , id DESC
LIMIT $offsetNum , $numLimit ";
}
// 运行
// echo $sql.'<br/><br/>';
$sql_result = run_sql($sql);
if ($sql_result && $sql_result->num_rows>0 ) {
while($row = $sql_result->fetch_assoc()){
$row = auto_mysql_filter($row); // 自动将一整行数据 整理成数组。
$return_result['data'][$row['id']] = $row ;
// $gcids[$row['id']] = $row['id']; //用于抓取 catids -----------------------------取消
}
}
// 抓取 id 对应的 catid
// $return_result['catids'] = getCatidByPostids(implode(',',$gcids)); -----------------------------取消
// 返回页码
$totalPages = ceil($totalNum/$numPerPage); // 总页码
for($pi=1;$pi<=3;$pi++){
$preP = $pageNum-$pi;
if($preP>1){$return_result['pages']['pre'][$preP] = $preP;} // 往前
}
for($pi=1;$pi<=3;$pi++){
$posP = $pageNum+$pi;
if($posP<$totalPages){$return_result['pages']['pos'][$posP] = $posP;} // 后
}
if($return_result['pages']['pre']){asort($return_result['pages']['pre']);} // 排序
$return_result['pages']['totalpages'] = $totalPages; // 总页码
$return_result['pages']['totalNum'] = $totalNum; // 总行书
$return_result['pages']['now'] = $pageNum; // 当前页码
// data
// pages
// catids -----------------------------取消
return $return_result;
}