PHP分页方法,支持第一页与其他页个数不一样的情况

比如 第一页是9条,其他页是12条的情况

	function index() {
		$p = intval($_GET['p']);
		$t = intval($_GET['t']);
		
		//第一页比其他页 少3条,所以是 -3
		$a = $this->mkpage($t, $p, 12, -3);
		print_r($a);
	}
	
	/**
	 * 分页信息
	 * @param unknown_type $total	总数
	 * @param unknown_type $page	当前页
	 * @param unknown_type $limit	每页条数
	 * @param unknown_type $poor	第一页与其他页差值
	 * @return string
	 */
	public function mkpage($total, $page, $limit , $poor = 0) {
		
		if(!$page) {
			$page = 1;
		}
		
		$olimit = $limit;
		
		if($page == 1) {
			$limit  = $limit + $poor;
		}
		
		$star = max(($page-1)*$limit+$poor, 0);
		
		$return['page'] = $page;	//当前页
		$return['total'] = $total;	//总数
		$return['pageCount'] = ceil(($total-$poor)/$olimit);	//总页数
		$return['limit'] = "$star, $limit";	//limit字符串
		
		return $return;
		
	}




<think>好的,我现在需要帮助用户解决在分页查询中实现切换到上一功能的问题。首先,我得回忆一下分页的基本原理。分页通常涉及当前码、每显示的数据量和总数。用户提到的是如何切换到上一,这需要调整当前码并重新查询数据。 根据用户提供的引用内容,引用[3]中的PHP代码示例展示了分页功能的实现,其中用到了当前码$p,每条数$listpage,总数$totalpage。要实现上一功能,逻辑应该是当当前码大于1时,将码减1,然后重新执行查询。比如,如果当前是第3,点击上一就变成第2。 接下来,我需要考虑如何在前端和后端之间传递码参数。通常,前端会通过URL参数(如?p=2)传递当前码到后端,后端接收后进行处理。例如,在PHP中使用input('p')获取当前,然后计算上一码为$p-1,但要确保小于1。 另外,引用[1]提到MyBatis-Plus的分页插件,这里可能需要构建分页条件时设置正确的当前。例如,在Java中,使用Page对象设置current数为当前减1,前提是当前大于1。 还要注意边界情况,比如当用户已经在第一页时,上一按钮应该禁用或者隐藏,避免出现码0或负数的情况。这在前端可以通过判断当前是否为1来处理,后端也需要确保码的有效性。 数据查询部分,无论是使用LIMIT和OFFSET(在SQL中)还是框架的分页功能(如MyBatis-Plus),原理都是一样的。计算偏移量的公式是(page-1)*pageSize,其中page是当前。所以切换到上一时,偏移量会减少pageSize的值。 最后,生成相关问题时,需要围绕分页的其他功能,比如下一、动态码生成、性能优化等,这些都是用户可能进一步感兴趣的方面。</think>### 分页查询中实现上一功能的方法 #### 1. 核心逻辑 实现分页查询的“上一”功能需满足以下条件: - **当前码**需大于1时允许切换 - 计算上一码:$p_{\text{prev}} = p_{\text{current}} - 1$ - 重新查询偏移量:$\text{offset} = (p_{\text{prev}} - 1) \times \text{pageSize}$ #### 2. 实现步骤(以PHP为例) ```php // 接收当前码(默认第1) $current_page = $_GET['p'] ?? 1; $page_size = 10; // 每显示数量 // 计算上一码 if ($current_page > 1) { $prev_page = $current_page - 1; } else { $prev_page = 1; // 边界保护 } // 构造SQL查询(使用预处理防注入) $offset = ($prev_page - 1) * $page_size; $stmt = $pdo->prepare("SELECT * FROM table LIMIT :offset, :page_size"); $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); $stmt->bindValue(':page_size', $page_size, PDO::PARAM_INT); $stmt->execute(); ``` #### 3. 前端实现 在面生成「上一」按钮时需添加条件判断: ```html <!-- PHP混编示例 --> <?php if ($current_page > 1): ?> <a href="?p=<?= $prev_page ?>">上一</a> <?php else: ?> <span class="disabled">上一</span> <?php endif; ?> ``` #### 4. 框架实现示例(MyBatis-Plus) ```java // Java示例:构建分页条件 Page<User> page = new Page<>(); page.setCurrent(currentPage > 1 ? currentPage-1 : 1); // 设置上一码 page.setSize(pageSize); // 执行分页查询 IPage<User> userPage = userMapper.selectPage(page, queryWrapper); ``` ### 关键注意点 1. **边界处理**:当$p=1$时禁止继续递减[^3] 2. **偏移量计算**:确保满足$\text{offset} \geq 0$ 3. **SQL优化**:大数据量时应配合索引使用,避免全表扫描[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值