侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP数据库表操作的封装类及用法实例详解

php  /  管理员 发布于 7年前   143

本文实例讲述了PHP数据库表操作的封装类及用法。分享给大家供大家参考,具体如下:

数据库表结构:

CREATE TABLE `test_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(45) NOT NULL,`password` varchar(45) NOT NULL,`nickname` varchar(45) NOT NULL,`r` tinyint(4) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `test_blog` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `title` varchar(45) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

设置字符编码:

header('Content-Type: text/html; ');

引入Table类:

require 'Table.php';

设置数据库参数:

Table::$__host = '127.0.0.1:3306';Table::$__user = 'root';Table::$__pass = '123456';Table::$__name = 'test';Table::$__charset = 'utf8';

创建实体对象:

Table类有三个参数: $table, $pk, $pdo=null

$table: 表名称.
$pk: 主键名称. 不支持联合主键
$pdo: 独立的PDO对象. 一般不需要传
Notice: Table类是表操作的封装,不是Model层的基类,所以不支持表前缀,表前缀应该在Model层实现

$userTable = new Table('test_blog');$blogTable = new Table('test_blog');

插入数据:

$user = array(    'username' => "admin1",    'password' => "admin1",    'nickname' => "管理员1",    'r' => mt_rand(0, 5),);echo $userTable->insert($user)->rowCount(), "\n";echo $userTable->lastInsertId(), "\n";

批量插入数据:

$fields = array('username','password','nickname','r');for ($i=2; $i<=100; $i++) {  $rows[] = array("admin$i", "admin$i", "管理员$i", mt_rand(0, 5));}$userTable->batchInsert($fields, $rows);

查询所有数据:

select方法返回一个PDOStatement对象, fetchAll返回多行, fetch返回单行

var_dump($userTable->select()->fetchAll());

field自定义:

var_dump($userTable->select('id,nickname')->fetchAll());

where查询:

var_dump($userTable->where('id > ?', 50)->select()->fetchAll());

where and条件:

var_dump($userTable->where('id > ?', 6)->where('id in (?)', array(5,7,9))  ->select()->fetchAll());

where or条件:

var_dump($userTable->where('id = ? OR id = ?', 6, 8)->select()->fetchAll());

group分组 having过滤:

var_dump($userTable->group('r')->having('c between ? and ?', 10, 20)  ->select('*, r, count(*) as c')->fetchAll());

order排序:

var_dump($userTable->order('r desc, id')->select()->fetchAll());

limit 行数:

跳过30行 返回10行

var_dump($userTable->limitOffset(10, 30)->select()->fetchAll());

查询单行:

var_dump($userTable->where('id = ?', 6)->select()->fetch());

根据主键查询数据:

var_dump($userTable->find(4));

update更新数据:

$user = array( 'username' => 'admin4-1', 'nickname' => '管理员4-1', );echo $userTable->where('id = ?', 4)->update($user)->rowCount(), "\n";

replace替换数据:

使用了MySQL的REPLACE语句

$user = array(    'id' => 4,    'username' => 'admin4',    'password' => 'admin4',    'nickname' => '管理员4',    'r' => mt_rand(0, 5),);echo $userTable->replace($user)->rowCount(), "\n";

删除数据:

echo $userTable->where('id = ?', 4)->delete()->rowCount(), "\n";

分页查询

第2页, 每页10行数据:

var_dump($userTable->page(2, 10)->select()->fetchAll());

分页查询的总行数:

$userTable->where('r=?', 3)->order('id desc')->page(2, 10)  ->select()->fetchAll();echo $userTable->count(), "\n";

复杂查询:

var_dump($userTable->where('id > ?', 1)->where('id < ?', 100)  ->group('r')->having('c between ? and ?', 1, 100)->having('c > ?', 1)  ->order('c desc')->page(2, 3)->select('*, count(*) as c')->fetchAll());

自增:

$id = 2;// 加一var_dump($userTable->where('id = ?', $id)->plus('r')->find($id));// 减一var_dump($userTable->where('id = ?', $id)->plus('r', -1)->find($id));// 多列var_dump($userTable->where('id = ?', $id)->plus('r', 1, 'r', -1)->find($id));

自增,并获得自增后的值:

$id = 2;// 加一echo $userTable->where('id = ?', $id)->incr('r'), "\n";// 减一echo $userTable->where('id = ?', $id)->incr('r', -1), "\n";

save 保存修改:

判断数据中是否存在主键字段,如果存在主键字段就update数据,反之insert数据

// 修改$user = array(  'id' => 3,  'nickname' => '管理员3-3',);echo $userTable->save($user)->rowCount(), "\n";var_dump($userTable->find(3));// 添加$user = array(    'username' => 'admin11',    'password' => 'admin11',    'nickname' => '管理员11',    'r' => mt_rand(0, 5),);echo $userTable->save($user)->rowCount(), "\n";$id = $userTable->lastInsertId();var_dump($userTable->find($id));

生成外表测试数据:

$users = $userTable->select('id')->fetchAll();$id = 0;foreach ($users as $user) {  for ($i=0; $i<10; $i++) {    $id++;    $blog = array(        'user_id' => $user['id'],        'title' => "blog$id",    );    $blogTable->insert($blog);  }}

Table类不支持JOIN查询

需要的朋友可以手写sql语句,使用query方法来执行.或者自己修改Table类来支持JOIN

获取外表数据:

$blogs = $blogTable->where('id in (?)', array(1,12,23,34,56,67,78,89,90,101))  ->select()->fetchAll();// 获取外表数据 key为外表id value为外表行数据var_dump($userTable->foreignKey($blogs, 'user_id')  ->fetchAll(PDO::FETCH_UNIQUE));var_dump($userTable->foreignKey($blogs, 'user_id', '*,id')  ->fetchAll(PDO::FETCH_UNIQUE));var_dump($userTable->foreignKey($blogs, 'user_id', 'id,username,nickanem,id')  ->fetchAll(PDO::FETCH_UNIQUE));// 获取外表数据 返回键值对数组 key为id value为usernamevar_dump($userTable->foreignKey($blogs, 'user_id', 'id,username')  ->fetchAll(PDO::FETCH_KEY_PAIR));

PDOStatement::fetchAll 示例:

// 获取映射数据var_dump($userTable->select('*, id')->fetchAll(PDO::FETCH_UNIQUE));// 获取数组var_dump($userTable->select('nickname')->fetchAll(PDO::FETCH_COLUMN));// 获取键值对var_dump($userTable->select('id, nickname')->fetchAll(PDO::FETCH_KEY_PAIR));// 获取数据分组var_dump($userTable->select('r, id, nickname')->fetchAll(PDO::FETCH_GROUP));// 获取数据分组var_dump($userTable->select('r, id')->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN));// 获取数据分组var_dump($userTable->select('r, nickname')->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_KEY_PAIR));// 获取对象 指定获取方式,将结果集中的每一行作为一个属性名对应列名的对象返回。var_dump($userTable->select()->fetchAll(PDO::FETCH_OBJ));// 获取对象 指定获取方式,返回一个所请求类的新实例,映射列到类中对应的属性名。// Note: 如果所请求的类中不存在该属性,则调用 __set() 魔术方法var_dump($userTable->select()->fetchAll(PDO::FETCH_CLASS));// 获取对象 指定获取方式,更新一个请求类的现有实例,映射列到类中对应的属性名。var_dump($userTable->select()->fetchAll(PDO::FETCH_INTO));// 获取自定义行var_dump($userTable->select()->fetchAll(PDO::FETCH_FUNC, function($id, $username, $password, $r){  return array('id'=>$id, 'name'=>"$username - $password - $r");}));// 获取单一值var_dump($userTable->select()->fetchAll(PDO::FETCH_FUNC, function($id, $username, $password, $r){  return "$id - $username - $password - $r";}));

Table类源代码:

 *//** * 模型*/class Table {  /**   * @var PDO   */  public static $__pdo = null;      // 默认PDO对象  public static $__host = '127.0.0.1';  // 默认主机  public static $__user = 'root';     // 默认账户  public static $__pass = '123456';    // 默认密码  public static $__name = 'test';     // 默认数据库名称  public static $__charset = 'utf8';   // 默认字符集  /**   * @var PDO   */  public $_pdo = null;          // PDO对象  public $_table = null;         // 表名  public $_pk = 'id';           // paramry  public $_where = array();        // where  public $_where_params = array();    // where params  public $_count_where = array();     // count where  public $_count_where_params = array(); // count where params  public $_group = '';          // group  public $_having = array();       // having  public $_having_params = array();    // having params  public $_order = null;         // order  public $_limit = null;         // limit  public $_offset = null;         // offset  public $_for_update = '';        // read lock  public $_lock_in_share_model = '';   // write lock  /**   * Table Construct   * @param string $table_name   * @param string $pk   * @param string $prefix   * @param PDO $pdo   */  function __construct($table=null, $pk=null, PDO $pdo=null) {    $this->_table = isset($table) ? $table : $this->_table;    $this->_pk = isset($pk) ? $pk : $this->_pk;    $this->_pdo = $pdo;  }  /**   * @return PDO   */  public function getPDO() {    if (isset($this->_pdo)) {      return $this->_pdo;    }    if (isset(self::$__pdo)) {      return self::$__pdo;    }    $dsn = sprintf("mysql:host=%s;dbname=%s;charset=%s;", self::$__host, self::$__name, self::$__charset);    $options = array(        PDO::ATTR_PERSISTENT => true,        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC    );    return self::$__pdo = new PDO($dsn, self::$__user, self::$__pass, $options);  }  /**   * 执行语句   * @param string $sql   * @return PDOStatement   */  public function query($sql) {    $params = func_get_args();    array_shift($params);    return $this->queryParams($sql, $params);  }  /**   * 执行语句   * @param string $sql   * @return PDOStatement   */  public function queryParams($sql, array $params) {    $sqls = explode('?', $sql);    $sql_new = array_shift($sqls);    $params_new = array();    foreach ($sqls as $i => $sql_item) {      if (is_array($params[$i])) {        $sql_new .= str_repeat('?,', count($params[$i])-1).'?'.$sql_item;        $params_new = array_merge($params_new, $params[$i]);      } else {        $sql_new .= '?'.$sql_item;        $params_new[] = $params[$i];      }    }    $stmt = $this->getPDO()->prepare($sql_new);    foreach ($params_new as $i => $param) {      switch (gettype($param)) {        case 'integer':          $stmt->bindValue($i+1, $param, PDO::PARAM_INT);          break;        case 'NULL':          $stmt->bindValue($i+1, $param, PDO::PARAM_NULL);          break;        default :          $stmt->bindValue($i+1, $param);      }    }//   echo $sql_new, "\n"; var_dump($params_new); // exit();    $stmt->executeResult = $stmt->execute();    $this->reset();    return $stmt;  }  /**   * 查询数据   * @param string $field   * @return PDOStatement   */  public function select($columns='*') {    $params = array_merge($this->_where_params, $this->_having_params);    $sql = "SELECT $columns FROM `{$this->_table}`";    $sql .= empty($this->_where) ? '' : ' WHERE '. implode(' AND ', $this->_where);    $sql .= empty($this->_group) ? '' : ' GROUP BY '. $this->_group;    $sql .= empty($this->_having) ? '' : ' HAVING '. implode(' AND ', $this->_having);    $sql .= empty($this->_order) ? '' : ' ORDER BY '. $this->_order;    if (isset($this->_limit)) {      $sql .= ' LIMIT ?';      $params[] = $this->_limit;      if (isset($this->_offset)) {        $sql .= ' OFFSET ?';        $params[] = $this->_offset;      }    }    $sql .= $this->_for_update;    $sql .= $this->_lock_in_share_model;    $this->_count_where = $this->_where;    $this->_count_where_params = $this->_where_params;    return $this->queryParams($sql, $params);  }  /**   * 添加数据   * @param array $data   * @return PDOStatement   */  public function insert(array $data) {    $sql = "INSERT `{$this->_table}` SET";    $params = array();    foreach ($data as $col=>$val) {      $sql .= " `$col` = ?,";      $params[] = $val;    }    $sql{strlen($sql)-1} = ' ';    return $this->queryParams($sql, $params);  }  /**   * 批量插入数据   * @param array $names   * @param array $rows   * @param number $batch   * @return Table   */  public function batchInsert(array $fields, array $rows, $batch=1000) {    $i = 0;    $sql = "INSERT `{$this->_table}` (`".implode('`, `', $fields)."`) VALUES ";    foreach ($rows as $row) {      $i++;      $sql .= "('".implode("','", array_map('addslashes', $row))."'),";      if ($i >= $batch) {        $sql{strlen($sql)-1} = ' ';        $this->query($sql);        $i = 0;        $sql = "INSERT `{$this->_table}` (`".implode('`, `', $fields)."`) VALUES ";      }    }    if ($i > 0) {      $sql{strlen($sql)-1} = ' ';      $this->query($sql);    }    return $this;  }  /**   * 更新数据   * @param array $data   * @return PDOStatement   */  public function update(array $data) {    $sql = "UPDATE `{$this->_table}` SET";    $params = array();    foreach ($data as $col=>$val) {      $sql .= " `$col` = ?,";      $params[] = $val;    }    $sql{strlen($sql)-1} = ' ';    $sql .= empty($this->_where) ? '' : 'WHERE '. implode(' AND ', $this->_where);    $params = array_merge($params, $this->_where_params);    return $this->queryParams($sql, $params);  }  /**   * 替换数据   * @param array $data   * @return PDOStatement   */  public function replace(array $data) {    $sql = "REPLACE `{$this->_table}` SET";    $params = array();    foreach ($data as $col=>$val) {      $sql .= " `$col` = ?,";      $params[] = $val;    }    $sql{strlen($sql)-1} = ' ';    $sql .= empty($this->_where) ? '' : 'WHERE '. implode(' AND ', $this->_where);    $params = array_merge($params, $this->_where_params);    return $this->queryParams($sql, $params);  }  /**   * 删除数据   * @return PDOStatement   */  public function delete() {    $sql = "DELETE FROM `{$this->_table}`";    $sql .= empty($this->_where) ? '' : ' WHERE '. implode(' AND ', $this->_where);    return $this->queryParams($sql, $this->_where_params);  }  /**   * 重置所有   * @return Table   */  public function reset() {    $this->_where = array();    $this->_where_params = array();    $this->_group = null;    $this->_having = array();    $this->_having_params = array();    $this->_order = null;    $this->_limit = null;    $this->_offset = null;    $this->_for_update = '';    $this->_lock_in_share_model = '';    return $this;  }  /**   * where查询条件   * @param string $format   * @return Table   */  public function where($format) {    $args = func_get_args();    array_shift($args);    $this->_where[] = $format;    $this->_where_params = array_merge($this->_where_params, $args);    return $this;  }  /**   * group分组   * @param string $columns   * @return Table   */  public function group($columns) {    $this->_group = $columns;    return $this;  }  /**   * having过滤条件   * @param string $format   * @return Table   */  public function having($format) {    $args = func_get_args();    array_shift($args);    $this->_having[] = $format;    $this->_having_params = array_merge($this->_having_params, $args);    return $this;  }  /**   * order排序   * @param string $columns   * @return Table   */  public function order($order) {    $this->_order = $order;    return $this;  }  /**   * limit数据偏移   * @param number $offset   * @param number $limit   * @return Table   */  public function limitOffset($limit, $offset=null) {    $this->_limit = $limit;    $this->_offset = $offset;    return $this;  }  /**   * 独占锁,不可读不可写   * @return Table   */  public function forUpdate() {    $this->forUpdate = ' FOR UPDATE';    return $this;  }  /**   * 共享锁,可读不可写   * @return Table   */  public function lockInShareMode() {    $this->_lock_in_share_model = ' LOCK IN SHARE MODE';    return $this;  }  /**   * 事务开始   * @return bool   */  public function begin() {    return $this->getPDO()->beginTransaction();  }  /**   * 事务提交   * @return bool   */  public function commit() {    return $this->getPDO()->commit();  }  /**   * 事务回滚   * @return bool   */  public function rollBack() {    return $this->getPDO()->rollBack();  }  /**   * page分页   * @param number $page   * @param number $pagesize   * @return Table   */  public function page($page, $pagesize = 15) {    $this->_limit = $pagesize;    $this->_offset = ($page - 1) * $pagesize;    return $this;  }  /**   * 获取自增ID   * @return int   */  public function lastInsertId() {    return $this->getPDO()->lastInsertId();  }  /**   * 获取符合条件的行数   * @return int   */  public function count() {    $sql = "SELECT count(*) FROM `{$this->_table}`";    $sql .= empty($this->_count_where) ? '' : ' WHERE '. implode(' AND ', $this->_count_where);    return $this->queryParams($sql, $this->_count_where_params)->fetchColumn();  }  /**   * 将选中行的指定字段加一   * @param string $col   * @param number $val   * @return Table   */  public function plus($col, $val = 1) {    $sets = array("`$col` = `$col` + $val");    $args = array_slice(func_get_args(), 2);    while (count($args) > 1) {      $col = array_shift($args);      $val = array_shift($args);      $sets[] = "`$col` = `$col` + $val";    }    $sql = "UPDATE `{$this->_table}` SET ".implode(', ', $sets);    $sql .= empty($this->_where) ? '' : ' WHERE '. implode(' AND ', $this->_where);    $params = array_merge(array($val), $this->_where_params);    $this->queryParams($sql, $params);    return $this;  }  /**   * 将选中行的指定字段加一   * @param string $col   * @param number $val   * @return int   */  public function incr($col, $val = 1) {    $sql = "UPDATE `{$this->_table}` SET `$col` = last_insert_id(`$col` + ?)";    $sql .= empty($this->_where) ? '' : ' WHERE '. implode(' AND ', $this->_where);    $params = array_merge(array($val), $this->_where_params);    $this->queryParams($sql, $params);    return $this->getPDO()->lastInsertId();  }  /**   * 根据主键查找行   * @param number $id   * @return array   */  public function find($id) {    return $this->where("`{$this->_pk}` = ?", $id)->select()->fetch();  }  /**   * 保存数据,自动判断是新增还是更新   * @param array $data   * @return PDOStatement   */  public function save(array $data) {    if (array_key_exists($this->_pk, $data)) {      $pk_val = $data[$this->_pk];      unset($data[$this->_pk]);      return $this->where("`{$this->_pk}` = ?", $pk_val)->update($data);    } else {      return $this->insert($data);    }  }  /**   * 获取外键数据   * @param array $rows   * @param string $fkey   * @param string $field   * @param string $key   * @return PDOStatement   */  public function foreignKey(array $rows, $fkey, $field='*') {    $ids = array(); foreach($rows as $row) { $ids[] = $row[$fkey]; }//   $ids = array_column($rows, $fkey);    if (empty($ids)) {      return new PDOStatement();    }    return $this->where("`{$this->_pk}` in (?)", $ids)->select($field);  }}

github地址:

https://github.com/dotcoo/php/blob/master/Table/Table.php

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP+MongoDB数据库操作技巧大全》、《PHP基于pdo操作数据库技巧总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:

  • php封装db类连接sqlite3数据库的方法实例
  • php db类库进行数据库操作
  • PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
  • PHP封装的PDO数据库操作类实例
  • PHP数据库处理封装类实例
  • php简单数据库操作类的封装
  • PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
  • PHP封装的mysqli数据库操作类示例
  • PHP模型Model类封装数据库操作示例
  • PHP封装的数据库模型Model类完整示例【基于PDO】
  • PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例


  • 上一条:
    php实现的debug log日志操作类实例
    下一条:
    PHP自定义函数获取搜索引擎来源关键字的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客