php显示页码分页类的封装

下面是关于“php显示页码分页类的封装”的详细攻略,大致包含以下几个步骤:

下面是关于“php显示页码分页类的封装”的详细攻略,大致包含以下几个步骤:

一、准备工作

在开始封装分页类之前,我们需要准备好以下工作:

  1. 确定要进行分页的数据总数 $total
  2. 每一页要显示的记录数 $per_page
  3. 确定当前页码数 $current_page
  4. 计算总页数 $total_pages

二、分页类的设计和封装

在分页类的设计过程中,我们需要考虑以下几个方面:

  1. 构造函数:需要传入 $total$per_page$current_page 三个参数,并计算出 $total_pages 总页数;
  2. 显示页码:根据参数 $range 确定显示多少个页码,需要考虑当前页的位置;
  3. 构造 SQL 语句:需要传入 $offset$per_page 两个参数,构造 SQL 语句;
  4. 返回数据:返回当前页的所有数据;
  5. 封装到工具类:将分页类封装到工具类中,方便使用。

以下是一个简单的示例:

class Pagination {
  protected $total;
  protected $per_page;
  protected $current_page;
  protected $total_pages;

  public function __construct($total, $per_page, $current_page) {
    $this->total = $total;
    $this->per_page = $per_page;
    $this->current_page = $current_page;
    $this->total_pages = ceil($total / $per_page);
  }

  public function getPaginationLinks($range = 5) {
    $links = '';
    $half_range = floor($range / 2);

    $start = max(1, $this->current_page - $half_range);
    $end = min($this->total_pages, $this->current_page + $half_range);

    if ($this->current_page > 1) {
      $links .= sprintf('<a href="?page=%s">%s</a>', $this->current_page - 1, '<');
    }

    for ($i = $start; $i <= $end; $i++) {
      if ($i == $this->current_page) {
        $links .= sprintf('<span class="current">%s</span>', $i);
      } else {
        $links .= sprintf('<a href="?page=%s">%s</a>', $i, $i);
      }
    }

    if ($this->current_page < $this->total_pages) {
      $links .= sprintf('<a href="?page=%s">%s</a>', $this->current_page + 1, '>');
    }

    return $links;
  }

  public function getPaginationData($offset = 0) {
    $sql = sprintf('SELECT * FROM my_table LIMIT %d,%d', $offset, $this->per_page);
    // execute SQL and return result
  }
}

class Paginator {
  public static function paginate($total, $per_page, $current_page) {
    $pagination = new Pagination($total, $per_page, $current_page);
    return [
      'links' => $pagination->getPaginationLinks(),
      'data' => $pagination->getPaginationData(($current_page - 1) * $per_page)
    ];
  }
}

以上代码中,我们分别封装了 Pagination 类和 Paginator 工具类。Pagination 类用于处理分页相关的逻辑,Paginator 工具类则将 Pagination 类封装一层,方便使用。

三、使用示例

通过 Paginator 工具类调用 paginate 方法,即可获取到包含分页链接和数据的数组。以下是一个简单的使用示例:

// 获取 GET 参数中的页码
$current_page = isset($_GET['page']) ? intval($_GET['page']) : 1;

// 数据总数
$total = 100;

// 每页数据数量
$per_page = 10;

// 获取分页链接和数据
$data = Paginator::paginate($total, $per_page, $current_page);

// 将分页链接插入 HTML 中
echo '<div class="pagination-links">' . $data['links'] . '</div>';

// 显示数据
foreach ($data['data'] as $row) {
  // 输出 HTML 数据
}

以上示例中,我们首先获取传入的页码数,并设置数据总数和每页数据数量。然后使用 Paginator::paginate 方法获取到包含分页链接和数据的数组,最后将分页链接插入 HTML 中,以及输出数据。

另外一个使用示例,请参考下面的查询用户列表代码:

$conn = new mysqli('localhost', 'root', '', 'test');
if ($conn->connect_error) {
    die('连接失败: ' . $conn->connect_error);
}
$conn->set_charset('utf8mb4');

$sql = 'SELECT COUNT(*) AS count FROM users';
$result = $conn->query($sql);
$count = $result->fetch_assoc()['count'];

$current_page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$per_page = 10;
$pager = Paginator::paginate($count, $per_page, $current_page);

?>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>用户名</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
    <?php foreach ($pager['data'] as $user): ?>
    <tr>
      <td><?php echo $user['id']; ?></td>
      <td><?php echo $user['name']; ?></td>
      <td><?php echo $user['email']; ?></td>
    </tr>
    <?php endforeach; ?>
  </tbody>
</table>
<div class="pagination-links"><?php echo $pager['links']; ?></div>

以上代码使用了 mysqli 扩展库获取到用户数量,然后使用 Paginator::paginate 方法获取到包含分页链接和数据的数组,最后输出用户列表和分页链接。

希望以上攻略对您有所帮助!

本文标题为:php显示页码分页类的封装

基础教程推荐