❱ 链接数据库
如果没有数据库信息,则从 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;
}