• PHP与MySQL 分页案例


    分页思想

    • 获取当前页码的数据
    页码		SQL语句
    1			select * from products limit 0,10
    2			select * from products limit 10,10
    3			select * from products limit 20,30
    
    • 公式

      • $pageno 页码
      • $startno 起始位置
      • $pagesize=10 页面大小
      • $startno= ($pageno- 1)* $pagesize;
    • 获取页码

      • 用户点击页面底端页码,传递当前的页面
    • 获取总页码

    记录数			页数			计算
    60				6			60/10=6
    51				6			ceil(51/10)=6
    
    • 公式

      • $rowcount 总记录数
      • $pagecount 总页数
      • $pagecount= ceil($rowcount/ $pagesize);
    • 获取总记录数

      • select count(*) from products;

    实现方法

    • 步骤
      • 获取总记录数
      • 求出总页数
      • 循环显示页码
      • 通过当前页面,求出起始位置
      • 获取当前页面数据,并遍历显示

    代码实现

    连接数据库

    # MySQLDB.class.php
    <?php
    class MySQLDB {
    	private $host;				// 主机地址
    	private $port;				// 端口号
    	private $user;				// 用户名
    	private $pwd;				// 密码
    	private $dbname;			// 数据库名
    	private $charset;			// 字符集
    	private $link;				// 连接对象
    	private static $instance;
    	private function __construct($param){
    		$this->initParam($param);
    		$this->initConnect();
    	}
    	private function __clone(){
    
    	}
    	// 获取单例
    	public static function getInstance($param= array()){
    		if(!self::$instance instanceof self){
    			self::$instance= new self($param);
    		}
    		return self::$instance;
    	}
    	// 初始化参数
    	private function initParam($param){
    		$this->host= $param['host']??'127.0.0.1';
    		$this->port= $param['port']??'3306';
    		$this->user= $param['user']??'';
    		$this->pwd= $param['pwd']??'';
    		$this->dbname= $param['dbname']??'';
    		$this->charset= $param['charset']??'utf8';
    	}
    	// 连接数据库
    	private function initConnect(){
    		$this->link= @mysqli_connect($this->host, $this->user, $this->pwd, $this->dbname, $this->port);
    		if(mysqli_connect_error()){
    			echo '数据库连接失败<br>';
    			echo '错误信息:'.mysqli_connect_error(),'<br>';
    			echo '错误码:'.mysqli_connect_errno(),'<br>';
    			exit;
    		}else{
    			echo '数据库连接成功!';
    		}
    		mysqli_set_charset($this->link, $this->charset);	
    	}
    	// 数据库的增删改查
    	private function execute($sql){
    		if(!$rs= mysqli_query($this->link, $sql)){
    			echo 'SQL语句执行失败<br>';
    			echo '错误信息:'.mysqli_error($this->link),'<br>';
    			echo '错误码:'.mysqli_errno($this->link),'<br>';
    			echo '错误的SQL语句:'.$sql,'<br>';
    			exit;
    		}
    		return $rs;
    	}
    	// 执行增删改语句
    	public function exec($sql) {
    		$key=substr($sql,0,6);
    		if(in_array($key,array('insert','update','delete')))
    			return $this->execute($sql);
    		else{
    			echo '非法访问<br>';
    			exit;
    		}
    	}
    	//获取自动增长的编号
    	public function getLastInsertId() {
    		return mysqli_insert_id($this->link);
    	}
    	//执行查询语句
    	private function query($sql) {
    		if(substr($sql,0,6)=='select' || substr($sql,0,4)=='show' || substr($sql,0,4)=='desc'){
    			return $this->execute($sql);
    		}else{
    			echo '非法访问<br>';
    			exit;
    		}
    	}
    	//匹配所有数据
    	public function fetchAll($sql,$type='assoc') {
    		$rs=$this->query($sql);
    		$type=$this->getType($type);
    		return mysqli_fetch_all($rs,$type);
    	}
    	//匹配一维数组
    	public function fetchRow($sql,$type='assoc') {
    		$list=$this->fetchAll($sql,$type);
    		if(!empty($list))
    			return $list[0];
    		return array();
    	}
    	//匹配一行一列
    	public function fetchColumn($sql) {
    		$list=$this->fetchRow($sql,'num');
    		if(!empty($list))
    			return $list[0];
    		return null;
    	}
    	//获取匹配类型
    	private function getType($type) {
    		switch($type){
    			case 'num':
    				return  MYSQLI_NUM;
    			case 'both':
    				return  MYSQLI_BOTH;
    			default:
    				return  MYSQLI_ASSOC;
    		}
    	}
    }
    

    显示页

    # index.php
    <?php
    //自动加载类
    spl_autoload_register(function($class_name){
    	require "./{$class_name}.class.php";
    });
    //获取单例
    $param=array(
    	'user'		=>	'root',
    	'pwd'		=>	'',
    	'dbname'	=>	'data'
    );
    $db= MySQLDB::getInstance($param);
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>数据库连接</title>
    <style type="text/css">
    	table{
    		780px;
    		border:solid #000 1px;
    	}
    	td,th{
    		border:solid #000 1px;
    	}
    </style>
    </head>
    
    <body>
    <?php
    $pagesize= 5;		
    //第一步:获取总记录数
    $rowcount= $db->fetchColumn('select count(*) from products');
    //第二步:求出总页数
    $pagecount= ceil($rowcount/$pagesize);
    //第四步:通过当前页面,求出起始位置
    //$pageno=isset($_GET['pageno'])?$_GET['pageno']:1;
    $pageno= $_GET['pageno']??1;
    $pageno= $pageno<1?1:$pageno;
    $pageno= $pageno>$pagecount?$pagecount:$pageno;
    $startno= ($pageno-1)*$pagesize;
    //第五步:获取当前页面数据,并遍历显示
    $sql= "select * from products limit $startno,$pagesize";
    $rs= $db->fetchAll($sql);
    ?>
    <table>
    	<tr>
    		<th>编号</th>
    		<th>商品名称</th>
    		<th>规格</th>
    		<th>价格</th>
    	</tr>
    	<?php foreach($rs as $row):?>
    	<tr>
    		<td><?=$row['proID']?></td>
    		<td><?=$row['proname']?></td>
    		<td><?=$row['proguige']?></td>
    		<td><?=$row['proprice']?></td>
    	</tr>
    	<?php endforeach;?>
    </table>
    <!--第三步:循环显示页码-->
    <span>一共有<?=$rowcount?>条记录,每页放<?=$pagesize?>条记录,当前是<?=$pageno?>页 <br></span>
    【<a href="?pageno=1">首页</a>】
    【<a href="?pageno=<?=$pageno-1?>">上一页</a>】
    <?php for($i=1; $i<=$pagecount; $i++):?>
    	<a href="?pageno=<?=$i?>"><?=$i?></a>
    <?php endfor;?>
    【<a href="?pageno=<?=$pageno+1?>">下一页</a>】
    【<a href="?pageno=<?=$pagecount?>">末页</a>】
    </body>
    </html>
    

    分页优化

    • 概述

      • 在上面的分页代码中,虽然SQL语句比较经典
      • 但是每次都要获取不需要的数据,浪费资源
    • 优化

      • $sql="select * from products limit $startno,$pagesize";
      • $sql="select * from products where proid>=(select proid from products limit $startno,1) limit $pagesize";
  • 相关阅读:
    ps:点阵格式图像
    ps:图像尺寸
    ps:HSB色彩模式
    git上传文件夹的问题
    sublime下载emmet
    git Octotree:提供项目目录,方便用户在线快速浏览项目结构【转载】
    git@github.com出现Permission denied (publickey)
    less:避免编译
    less:@arguments变量
    less嵌套规则
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14128319.html
Copyright © 2020-2023  润新知