Please enable java script to visit.
NOTEBOOK
HOMEPHP / MySQLJS / HTMLWXappPythonC++Blender其他
PHP 操作 MySQL(新建表、插入数据、读取数据、搜索数据) - NOTEBOOK
PHP 操作 MySQL(新建表、插入数据、读取数据、搜索数据)
PHP / MySQL
Posted on 2023-01-03
摘要 : 新建表时建立fulltext索引,根据id来读取、写入数据表。
写入时对数据进行预处理( 将数组里的英文引号实体化 -> 数组转字符串 -> 删除多余空白 -> 转义addslashes() )
❱ 链接数据库

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